File: target_locator.rb

package info (click to toggle)
ruby-selenium-webdriver 4.38.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,400 kB
  • sloc: ruby: 7,721; javascript: 125; makefile: 6
file content (139 lines) | stat: -rw-r--r-- 3,657 bytes parent folder | download
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