1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
# frozen_string_literal: true
# Licensed to the Software Freedom Conservancy (SFC) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The SFC licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
module Selenium
module WebDriver
class TargetLocator
#
# @api private
#
def initialize(bridge)
@bridge = bridge
end
#
# switch to the frame with the given id
#
def frame(id)
@bridge.switch_to_frame id
end
#
# switch to the parent frame
#
def parent_frame
@bridge.switch_to_parent_frame
end
#
# Switch to a new top-level browsing context
#
# @param type either :tab or :window
#
# steep:ignore:start
def new_window(type = :window)
raise ArgumentError, "Valid types are :tab and :window, received: #{type.inspect}" unless %i[window
tab].include?(type)
handle = @bridge.new_window(type)['handle']
if block_given?
execute_and_close = proc do
yield(self)
begin
@bridge.close
rescue Error::NoSuchWindowError
# window already closed
end
end
window(handle, &execute_and_close)
else
window(handle)
end
end
# steep:ignore:end
#
# switch to the given window handle
#
# If given a block, this method will switch back to the original window after
# block execution.
#
# @param id
# A window handle, obtained through Driver#window_handles
#
def window(id)
if block_given?
original = begin
@bridge.window_handle
rescue Error::NoSuchWindowError
nil
end
unless @bridge.window_handles.include? id
raise Error::NoSuchWindowError, "The specified identifier '#{id}' is not found in the window handle list"
end
@bridge.switch_to_window id
begin
yield
ensure
current_handles = @bridge.window_handles
original = current_handles.first unless current_handles.include? original
@bridge.switch_to_window original
end
else
@bridge.switch_to_window id
end
end
#
# get the active element
#
# @return [WebDriver::Element]
#
def active_element
@bridge.switch_to_active_element
end
#
# selects either the first frame on the page, or the main document when a page contains iframes.
#
def default_content
@bridge.switch_to_default_content
end
#
# switches to the currently active modal dialog for this particular driver instance
#
def alert
Alert.new(@bridge)
end
end # TargetLocator
end # WebDriver
end # Selenium
|