selenium-webdriver 4.0.0.rc1 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGES +60 -0
 - data/README.md +1 -1
 - data/lib/selenium/server.rb +62 -48
 - data/lib/selenium/webdriver/atoms/findElements.js +2 -2
 - data/lib/selenium/webdriver/atoms/getAttribute.js +25 -25
 - data/lib/selenium/webdriver/chrome/driver.rb +3 -0
 - data/lib/selenium/webdriver/chrome/features.rb +44 -4
 - data/lib/selenium/webdriver/chrome/options.rb +24 -1
 - data/lib/selenium/webdriver/common/driver.rb +2 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +51 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +77 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +45 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +38 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +17 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +87 -18
 - data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -11
 - data/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +1 -1
 - data/lib/selenium/webdriver/common/log_entry.rb +2 -2
 - data/lib/selenium/webdriver/common/manager.rb +3 -13
 - data/lib/selenium/webdriver/common/options.rb +13 -5
 - data/lib/selenium/webdriver/common/profile_helper.rb +1 -7
 - data/lib/selenium/webdriver/common/socket_poller.rb +30 -19
 - data/lib/selenium/webdriver/common/target_locator.rb +28 -0
 - data/lib/selenium/webdriver/common/timeouts.rb +31 -4
 - data/lib/selenium/webdriver/common/window.rb +0 -4
 - data/lib/selenium/webdriver/common/zipper.rb +1 -9
 - data/lib/selenium/webdriver/common.rb +4 -0
 - data/lib/selenium/webdriver/devtools/request.rb +27 -17
 - data/lib/selenium/webdriver/devtools/response.rb +66 -0
 - data/lib/selenium/webdriver/devtools.rb +49 -12
 - data/lib/selenium/webdriver/edge/features.rb +5 -0
 - data/lib/selenium/webdriver/firefox/driver.rb +5 -0
 - data/lib/selenium/webdriver/firefox/features.rb +14 -0
 - data/lib/selenium/webdriver/firefox/options.rb +28 -1
 - data/lib/selenium/webdriver/firefox.rb +0 -1
 - data/lib/selenium/webdriver/remote/bridge.rb +9 -10
 - data/lib/selenium/webdriver/remote/capabilities.rb +1 -0
 - data/lib/selenium/webdriver/remote/commands.rb +1 -0
 - data/lib/selenium/webdriver/remote/driver.rb +2 -1
 - data/lib/selenium/webdriver/safari/driver.rb +1 -1
 - data/lib/selenium/webdriver/safari/options.rb +7 -0
 - data/lib/selenium/webdriver/version.rb +1 -1
 - data/lib/selenium/webdriver.rb +1 -0
 - data/selenium-webdriver.gemspec +2 -2
 - metadata +14 -3
 
| 
         @@ -58,8 +58,10 @@ require 'selenium/webdriver/common/driver_extensions/has_remote_status' 
     | 
|
| 
       58 
58 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_network_conditions'
         
     | 
| 
       59 
59 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_network_connection'
         
     | 
| 
       60 
60 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_network_interception'
         
     | 
| 
      
 61 
     | 
    
         
            +
            require 'selenium/webdriver/common/driver_extensions/has_apple_permissions'
         
     | 
| 
       61 
62 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_permissions'
         
     | 
| 
       62 
63 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_debugger'
         
     | 
| 
      
 64 
     | 
    
         
            +
            require 'selenium/webdriver/common/driver_extensions/has_context'
         
     | 
| 
       63 
65 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/prints_page'
         
     | 
| 
       64 
66 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/uploads_files'
         
     | 
| 
       65 
67 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/full_page_screenshot'
         
     | 
| 
         @@ -70,6 +72,8 @@ require 'selenium/webdriver/common/driver_extensions/has_logs' 
     | 
|
| 
       70 
72 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_log_events'
         
     | 
| 
       71 
73 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_pinned_scripts'
         
     | 
| 
       72 
74 
     | 
    
         
             
            require 'selenium/webdriver/common/driver_extensions/has_cdp'
         
     | 
| 
      
 75 
     | 
    
         
            +
            require 'selenium/webdriver/common/driver_extensions/has_casting'
         
     | 
| 
      
 76 
     | 
    
         
            +
            require 'selenium/webdriver/common/driver_extensions/has_launching'
         
     | 
| 
       73 
77 
     | 
    
         
             
            require 'selenium/webdriver/common/keys'
         
     | 
| 
       74 
78 
     | 
    
         
             
            require 'selenium/webdriver/common/profile_helper'
         
     | 
| 
       75 
79 
     | 
    
         
             
            require 'selenium/webdriver/common/options'
         
     | 
| 
         @@ -22,33 +22,43 @@ module Selenium 
     | 
|
| 
       22 
22 
     | 
    
         
             
                class DevTools
         
     | 
| 
       23 
23 
     | 
    
         
             
                  class Request
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
                     
     | 
| 
      
 25 
     | 
    
         
            +
                    attr_accessor :url, :method, :headers, :post_data
         
     | 
| 
      
 26 
     | 
    
         
            +
                    attr_reader :id
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                     
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                    #
         
     | 
| 
      
 29 
     | 
    
         
            +
                    # Creates request from DevTools message.
         
     | 
| 
      
 30 
     | 
    
         
            +
                    # @api private
         
     | 
| 
      
 31 
     | 
    
         
            +
                    #
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    def self.from(id, params)
         
     | 
| 
      
 34 
     | 
    
         
            +
                      new(
         
     | 
| 
      
 35 
     | 
    
         
            +
                        id: id,
         
     | 
| 
      
 36 
     | 
    
         
            +
                        url: params.dig('request', 'url'),
         
     | 
| 
      
 37 
     | 
    
         
            +
                        method: params.dig('request', 'method'),
         
     | 
| 
      
 38 
     | 
    
         
            +
                        headers: params.dig('request', 'headers'),
         
     | 
| 
      
 39 
     | 
    
         
            +
                        post_data: params.dig('request', 'postData')
         
     | 
| 
      
 40 
     | 
    
         
            +
                      )
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    def initialize(id:, url:, method:, headers:, post_data:)
         
     | 
| 
       29 
44 
     | 
    
         
             
                      @id = id
         
     | 
| 
       30 
45 
     | 
    
         
             
                      @url = url
         
     | 
| 
       31 
46 
     | 
    
         
             
                      @method = method
         
     | 
| 
       32 
47 
     | 
    
         
             
                      @headers = headers
         
     | 
| 
      
 48 
     | 
    
         
            +
                      @post_data = post_data
         
     | 
| 
       33 
49 
     | 
    
         
             
                    end
         
     | 
| 
       34 
50 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                    def  
     | 
| 
       36 
     | 
    
         
            -
                       
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                         
     | 
| 
       42 
     | 
    
         
            -
                        body: Base64.strict_encode64(body),
         
     | 
| 
       43 
     | 
    
         
            -
                        response_code: code,
         
     | 
| 
       44 
     | 
    
         
            -
                        response_headers: headers.map do |k, v|
         
     | 
| 
       45 
     | 
    
         
            -
                          {name: k, value: v}
         
     | 
| 
       46 
     | 
    
         
            -
                        end
         
     | 
| 
       47 
     | 
    
         
            -
                      )
         
     | 
| 
      
 51 
     | 
    
         
            +
                    def ==(other)
         
     | 
| 
      
 52 
     | 
    
         
            +
                      self.class == other.class &&
         
     | 
| 
      
 53 
     | 
    
         
            +
                        id == other.id &&
         
     | 
| 
      
 54 
     | 
    
         
            +
                        url == other.url &&
         
     | 
| 
      
 55 
     | 
    
         
            +
                        method == other.method &&
         
     | 
| 
      
 56 
     | 
    
         
            +
                        headers == other.headers &&
         
     | 
| 
      
 57 
     | 
    
         
            +
                        post_data == other.post_data
         
     | 
| 
       48 
58 
     | 
    
         
             
                    end
         
     | 
| 
       49 
59 
     | 
    
         | 
| 
       50 
60 
     | 
    
         
             
                    def inspect
         
     | 
| 
       51 
     | 
    
         
            -
                      %(#<#{self.class.name} @method="#{method}" @url="#{url}")
         
     | 
| 
      
 61 
     | 
    
         
            +
                      %(#<#{self.class.name} @id="#{id}" @method="#{method}" @url="#{url}")
         
     | 
| 
       52 
62 
     | 
    
         
             
                    end
         
     | 
| 
       53 
63 
     | 
    
         | 
| 
       54 
64 
     | 
    
         
             
                  end # Request
         
     | 
| 
         @@ -0,0 +1,66 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # Licensed to the Software Freedom Conservancy (SFC) under one
         
     | 
| 
      
 4 
     | 
    
         
            +
            # or more contributor license agreements.  See the NOTICE file
         
     | 
| 
      
 5 
     | 
    
         
            +
            # distributed with this work for additional information
         
     | 
| 
      
 6 
     | 
    
         
            +
            # regarding copyright ownership.  The SFC licenses this file
         
     | 
| 
      
 7 
     | 
    
         
            +
            # to you under the Apache License, Version 2.0 (the
         
     | 
| 
      
 8 
     | 
    
         
            +
            # "License"); you may not use this file except in compliance
         
     | 
| 
      
 9 
     | 
    
         
            +
            # with the License.  You may obtain a copy of the License at
         
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
      
 11 
     | 
    
         
            +
            #   http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 12 
     | 
    
         
            +
            #
         
     | 
| 
      
 13 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing,
         
     | 
| 
      
 14 
     | 
    
         
            +
            # software distributed under the License is distributed on an
         
     | 
| 
      
 15 
     | 
    
         
            +
            # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         
     | 
| 
      
 16 
     | 
    
         
            +
            # KIND, either express or implied.  See the License for the
         
     | 
| 
      
 17 
     | 
    
         
            +
            # specific language governing permissions and limitations
         
     | 
| 
      
 18 
     | 
    
         
            +
            # under the License.
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            module Selenium
         
     | 
| 
      
 21 
     | 
    
         
            +
              module WebDriver
         
     | 
| 
      
 22 
     | 
    
         
            +
                class DevTools
         
     | 
| 
      
 23 
     | 
    
         
            +
                  class Response
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                    attr_accessor :code, :body, :headers
         
     | 
| 
      
 26 
     | 
    
         
            +
                    attr_reader :id
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    #
         
     | 
| 
      
 29 
     | 
    
         
            +
                    # Creates response from DevTools message.
         
     | 
| 
      
 30 
     | 
    
         
            +
                    # @api private
         
     | 
| 
      
 31 
     | 
    
         
            +
                    #
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    def self.from(id, encoded_body, params)
         
     | 
| 
      
 34 
     | 
    
         
            +
                      new(
         
     | 
| 
      
 35 
     | 
    
         
            +
                        id: id,
         
     | 
| 
      
 36 
     | 
    
         
            +
                        code: params['responseStatusCode'],
         
     | 
| 
      
 37 
     | 
    
         
            +
                        body: (Base64.strict_decode64(encoded_body) if encoded_body),
         
     | 
| 
      
 38 
     | 
    
         
            +
                        headers: params['responseHeaders'].each_with_object({}) do |header, hash|
         
     | 
| 
      
 39 
     | 
    
         
            +
                          hash[header['name']] = header['value']
         
     | 
| 
      
 40 
     | 
    
         
            +
                        end
         
     | 
| 
      
 41 
     | 
    
         
            +
                      )
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    def initialize(id:, code:, body:, headers:)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      @id = id
         
     | 
| 
      
 46 
     | 
    
         
            +
                      @code = code
         
     | 
| 
      
 47 
     | 
    
         
            +
                      @body = body
         
     | 
| 
      
 48 
     | 
    
         
            +
                      @headers = headers
         
     | 
| 
      
 49 
     | 
    
         
            +
                    end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                    def ==(other)
         
     | 
| 
      
 52 
     | 
    
         
            +
                      self.class == other.class &&
         
     | 
| 
      
 53 
     | 
    
         
            +
                        id == other.id &&
         
     | 
| 
      
 54 
     | 
    
         
            +
                        code == other.code &&
         
     | 
| 
      
 55 
     | 
    
         
            +
                        body == other.body &&
         
     | 
| 
      
 56 
     | 
    
         
            +
                        headers == other.headers
         
     | 
| 
      
 57 
     | 
    
         
            +
                    end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                    def inspect
         
     | 
| 
      
 60 
     | 
    
         
            +
                      %(#<#{self.class.name} @id="#{id}" @code="#{code}")
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  end # Response
         
     | 
| 
      
 64 
     | 
    
         
            +
                end # DevTools
         
     | 
| 
      
 65 
     | 
    
         
            +
              end # WebDriver
         
     | 
| 
      
 66 
     | 
    
         
            +
            end # Selenium
         
     | 
| 
         @@ -20,22 +20,34 @@ 
     | 
|
| 
       20 
20 
     | 
    
         
             
            module Selenium
         
     | 
| 
       21 
21 
     | 
    
         
             
              module WebDriver
         
     | 
| 
       22 
22 
     | 
    
         
             
                class DevTools
         
     | 
| 
      
 23 
     | 
    
         
            +
                  RESPONSE_WAIT_TIMEOUT = 30
         
     | 
| 
      
 24 
     | 
    
         
            +
                  RESPONSE_WAIT_INTERVAL = 0.1
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       23 
26 
     | 
    
         
             
                  autoload :ConsoleEvent, 'selenium/webdriver/devtools/console_event'
         
     | 
| 
       24 
27 
     | 
    
         
             
                  autoload :ExceptionEvent, 'selenium/webdriver/devtools/exception_event'
         
     | 
| 
       25 
28 
     | 
    
         
             
                  autoload :MutationEvent, 'selenium/webdriver/devtools/mutation_event'
         
     | 
| 
       26 
29 
     | 
    
         
             
                  autoload :PinnedScript, 'selenium/webdriver/devtools/pinned_script'
         
     | 
| 
       27 
30 
     | 
    
         
             
                  autoload :Request, 'selenium/webdriver/devtools/request'
         
     | 
| 
      
 31 
     | 
    
         
            +
                  autoload :Response, 'selenium/webdriver/devtools/response'
         
     | 
| 
       28 
32 
     | 
    
         | 
| 
       29 
33 
     | 
    
         
             
                  def initialize(url:)
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @callback_threads = ThreadGroup.new
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       30 
36 
     | 
    
         
             
                    @messages = []
         
     | 
| 
       31 
37 
     | 
    
         
             
                    @session_id = nil
         
     | 
| 
       32 
38 
     | 
    
         
             
                    @url = url
         
     | 
| 
       33 
39 
     | 
    
         | 
| 
       34 
40 
     | 
    
         
             
                    process_handshake
         
     | 
| 
       35 
     | 
    
         
            -
                    attach_socket_listener
         
     | 
| 
      
 41 
     | 
    
         
            +
                    @socket_thread = attach_socket_listener
         
     | 
| 
       36 
42 
     | 
    
         
             
                    start_session
         
     | 
| 
       37 
43 
     | 
    
         
             
                  end
         
     | 
| 
       38 
44 
     | 
    
         | 
| 
      
 45 
     | 
    
         
            +
                  def close
         
     | 
| 
      
 46 
     | 
    
         
            +
                    @callback_threads.list.each(&:exit)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    @socket_thread.exit
         
     | 
| 
      
 48 
     | 
    
         
            +
                    socket.close
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       39 
51 
     | 
    
         
             
                  def callbacks
         
     | 
| 
       40 
52 
     | 
    
         
             
                    @callbacks ||= Hash.new { |callbacks, event| callbacks[event] = [] }
         
     | 
| 
       41 
53 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -85,27 +97,24 @@ module Selenium 
     | 
|
| 
       85 
97 
     | 
    
         
             
                  end
         
     | 
| 
       86 
98 
     | 
    
         | 
| 
       87 
99 
     | 
    
         
             
                  def attach_socket_listener
         
     | 
| 
       88 
     | 
    
         
            -
                     
     | 
| 
      
 100 
     | 
    
         
            +
                    Thread.new do
         
     | 
| 
      
 101 
     | 
    
         
            +
                      Thread.current.abort_on_exception = true
         
     | 
| 
      
 102 
     | 
    
         
            +
                      Thread.current.report_on_exception = false
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
       89 
104 
     | 
    
         
             
                      until socket.eof?
         
     | 
| 
       90 
105 
     | 
    
         
             
                        incoming_frame << socket.readpartial(1024)
         
     | 
| 
       91 
106 
     | 
    
         | 
| 
       92 
107 
     | 
    
         
             
                        while (frame = incoming_frame.next)
         
     | 
| 
       93 
     | 
    
         
            -
                           
     | 
| 
       94 
     | 
    
         
            -
                          break if frame.to_s.empty?
         
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
                          message = JSON.parse(frame.to_s)
         
     | 
| 
       97 
     | 
    
         
            -
                          @messages << message
         
     | 
| 
       98 
     | 
    
         
            -
                          WebDriver.logger.debug "DevTools <- #{message}"
         
     | 
| 
      
 108 
     | 
    
         
            +
                          message = process_frame(frame)
         
     | 
| 
       99 
109 
     | 
    
         
             
                          next unless message['method']
         
     | 
| 
       100 
110 
     | 
    
         | 
| 
      
 111 
     | 
    
         
            +
                          params = message['params']
         
     | 
| 
       101 
112 
     | 
    
         
             
                          callbacks[message['method']].each do |callback|
         
     | 
| 
       102 
     | 
    
         
            -
                            params  
     | 
| 
       103 
     | 
    
         
            -
                            Thread.new { callback.call(params) }
         
     | 
| 
      
 113 
     | 
    
         
            +
                            @callback_threads.add(callback_thread(params, &callback))
         
     | 
| 
       104 
114 
     | 
    
         
             
                          end
         
     | 
| 
       105 
115 
     | 
    
         
             
                        end
         
     | 
| 
       106 
116 
     | 
    
         
             
                      end
         
     | 
| 
       107 
117 
     | 
    
         
             
                    end
         
     | 
| 
       108 
     | 
    
         
            -
                    socket_listener.abort_on_exception = true
         
     | 
| 
       109 
118 
     | 
    
         
             
                  end
         
     | 
| 
       110 
119 
     | 
    
         | 
| 
       111 
120 
     | 
    
         
             
                  def start_session
         
     | 
| 
         @@ -119,8 +128,36 @@ module Selenium 
     | 
|
| 
       119 
128 
     | 
    
         
             
                    @incoming_frame ||= WebSocket::Frame::Incoming::Client.new(version: ws.version)
         
     | 
| 
       120 
129 
     | 
    
         
             
                  end
         
     | 
| 
       121 
130 
     | 
    
         | 
| 
      
 131 
     | 
    
         
            +
                  def process_frame(frame)
         
     | 
| 
      
 132 
     | 
    
         
            +
                    message = frame.to_s
         
     | 
| 
      
 133 
     | 
    
         
            +
             
     | 
| 
      
 134 
     | 
    
         
            +
                    # Firefox will periodically fail on unparsable empty frame
         
     | 
| 
      
 135 
     | 
    
         
            +
                    return {} if message.empty?
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                    message = JSON.parse(message)
         
     | 
| 
      
 138 
     | 
    
         
            +
                    @messages << message
         
     | 
| 
      
 139 
     | 
    
         
            +
                    WebDriver.logger.debug "DevTools <- #{message}"
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                    message
         
     | 
| 
      
 142 
     | 
    
         
            +
                  end
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
                  def callback_thread(params)
         
     | 
| 
      
 145 
     | 
    
         
            +
                    Thread.new do
         
     | 
| 
      
 146 
     | 
    
         
            +
                      Thread.current.abort_on_exception = true
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
                      # We might end up blocked forever when we have an error in event.
         
     | 
| 
      
 149 
     | 
    
         
            +
                      # For example, if network interception event raises error,
         
     | 
| 
      
 150 
     | 
    
         
            +
                      # the browser will keep waiting for the request to be proceeded
         
     | 
| 
      
 151 
     | 
    
         
            +
                      # before returning back to the original thread. In this case,
         
     | 
| 
      
 152 
     | 
    
         
            +
                      # we should at least print the error.
         
     | 
| 
      
 153 
     | 
    
         
            +
                      Thread.current.report_on_exception = true
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
                      yield params
         
     | 
| 
      
 156 
     | 
    
         
            +
                    end
         
     | 
| 
      
 157 
     | 
    
         
            +
                  end
         
     | 
| 
      
 158 
     | 
    
         
            +
             
     | 
| 
       122 
159 
     | 
    
         
             
                  def wait
         
     | 
| 
       123 
     | 
    
         
            -
                    @wait ||= Wait.new(timeout:  
     | 
| 
      
 160 
     | 
    
         
            +
                    @wait ||= Wait.new(timeout: RESPONSE_WAIT_TIMEOUT, interval: RESPONSE_WAIT_INTERVAL)
         
     | 
| 
       124 
161 
     | 
    
         
             
                  end
         
     | 
| 
       125 
162 
     | 
    
         | 
| 
       126 
163 
     | 
    
         
             
                  def socket
         
     | 
| 
         @@ -27,6 +27,11 @@ module Selenium 
     | 
|
| 
       27 
27 
     | 
    
         
             
                    include WebDriver::Chrome::Features
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                    EDGE_COMMANDS = {
         
     | 
| 
      
 30 
     | 
    
         
            +
                      get_cast_sinks: [:get, 'session/:session_id/ms/cast/get_sinks'],
         
     | 
| 
      
 31 
     | 
    
         
            +
                      set_cast_sink_to_use: [:post, 'session/:session_id/ms/cast/set_sink_to_use'],
         
     | 
| 
      
 32 
     | 
    
         
            +
                      start_cast_tab_mirroring: [:post, 'session/:session_id/ms/cast/start_tab_mirroring'],
         
     | 
| 
      
 33 
     | 
    
         
            +
                      get_cast_issue_message: [:get, 'session/:session_id/ms/cast/get_issue_message'],
         
     | 
| 
      
 34 
     | 
    
         
            +
                      stop_casting: [:post, 'session/:session_id/ms/cast/stop_casting'],
         
     | 
| 
       30 
35 
     | 
    
         
             
                      send_command: [:post, 'session/:session_id/ms/cdp/execute']
         
     | 
| 
       31 
36 
     | 
    
         
             
                    }.freeze
         
     | 
| 
       32 
37 
     | 
    
         | 
| 
         @@ -29,6 +29,7 @@ module Selenium 
     | 
|
| 
       29 
29 
     | 
    
         
             
                  class Driver < WebDriver::Driver
         
     | 
| 
       30 
30 
     | 
    
         
             
                    EXTENSIONS = [DriverExtensions::HasAddons,
         
     | 
| 
       31 
31 
     | 
    
         
             
                                  DriverExtensions::FullPageScreenshot,
         
     | 
| 
      
 32 
     | 
    
         
            +
                                  DriverExtensions::HasContext,
         
     | 
| 
       32 
33 
     | 
    
         
             
                                  DriverExtensions::HasDevTools,
         
     | 
| 
       33 
34 
     | 
    
         
             
                                  DriverExtensions::HasLogEvents,
         
     | 
| 
       34 
35 
     | 
    
         
             
                                  DriverExtensions::HasNetworkInterception,
         
     | 
| 
         @@ -42,6 +43,10 @@ module Selenium 
     | 
|
| 
       42 
43 
     | 
    
         
             
                    private
         
     | 
| 
       43 
44 
     | 
    
         | 
| 
       44 
45 
     | 
    
         
             
                    def devtools_url
         
     | 
| 
      
 46 
     | 
    
         
            +
                      if capabilities['moz:debuggerAddress'].nil?
         
     | 
| 
      
 47 
     | 
    
         
            +
                        raise(Error::WebDriverError, "DevTools is not supported by this version of Firefox; use v85 or higher")
         
     | 
| 
      
 48 
     | 
    
         
            +
                      end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
       45 
50 
     | 
    
         
             
                      uri = URI("http://#{capabilities['moz:debuggerAddress']}")
         
     | 
| 
       46 
51 
     | 
    
         
             
                      response = Net::HTTP.get(uri.hostname, '/json/version', uri.port)
         
     | 
| 
       47 
52 
     | 
    
         | 
| 
         @@ -23,6 +23,8 @@ module Selenium 
     | 
|
| 
       23 
23 
     | 
    
         
             
                  module Features
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                    FIREFOX_COMMANDS = {
         
     | 
| 
      
 26 
     | 
    
         
            +
                      get_context: [:get, 'session/:session_id/moz/context'],
         
     | 
| 
      
 27 
     | 
    
         
            +
                      set_context: [:post, 'session/:session_id/moz/context'],
         
     | 
| 
       26 
28 
     | 
    
         
             
                      install_addon: [:post, 'session/:session_id/moz/addon/install'],
         
     | 
| 
       27 
29 
     | 
    
         
             
                      uninstall_addon: [:post, 'session/:session_id/moz/addon/uninstall'],
         
     | 
| 
       28 
30 
     | 
    
         
             
                      full_page_screenshot: [:get, 'session/:session_id/moz/screenshot/full']
         
     | 
| 
         @@ -33,6 +35,11 @@ module Selenium 
     | 
|
| 
       33 
35 
     | 
    
         
             
                    end
         
     | 
| 
       34 
36 
     | 
    
         | 
| 
       35 
37 
     | 
    
         
             
                    def install_addon(path, temporary)
         
     | 
| 
      
 38 
     | 
    
         
            +
                      if @file_detector
         
     | 
| 
      
 39 
     | 
    
         
            +
                        local_file = @file_detector.call(path)
         
     | 
| 
      
 40 
     | 
    
         
            +
                        path = upload(local_file) if local_file
         
     | 
| 
      
 41 
     | 
    
         
            +
                      end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
       36 
43 
     | 
    
         
             
                      payload = {path: path}
         
     | 
| 
       37 
44 
     | 
    
         
             
                      payload[:temporary] = temporary unless temporary.nil?
         
     | 
| 
       38 
45 
     | 
    
         
             
                      execute :install_addon, {}, payload
         
     | 
| 
         @@ -46,6 +53,13 @@ module Selenium 
     | 
|
| 
       46 
53 
     | 
    
         
             
                      execute :full_page_screenshot
         
     | 
| 
       47 
54 
     | 
    
         
             
                    end
         
     | 
| 
       48 
55 
     | 
    
         | 
| 
      
 56 
     | 
    
         
            +
                    def context=(context)
         
     | 
| 
      
 57 
     | 
    
         
            +
                      execute :set_context, {}, {context: context}
         
     | 
| 
      
 58 
     | 
    
         
            +
                    end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                    def context
         
     | 
| 
      
 61 
     | 
    
         
            +
                      execute :get_context
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end
         
     | 
| 
       49 
63 
     | 
    
         
             
                  end # Bridge
         
     | 
| 
       50 
64 
     | 
    
         
             
                end # Firefox
         
     | 
| 
       51 
65 
     | 
    
         
             
              end # WebDriver
         
     | 
| 
         @@ -29,7 +29,11 @@ module Selenium 
     | 
|
| 
       29 
29 
     | 
    
         
             
                    CAPABILITIES = {binary: 'binary',
         
     | 
| 
       30 
30 
     | 
    
         
             
                                    args: 'args',
         
     | 
| 
       31 
31 
     | 
    
         
             
                                    log: 'log',
         
     | 
| 
       32 
     | 
    
         
            -
                                    prefs: 'prefs' 
     | 
| 
      
 32 
     | 
    
         
            +
                                    prefs: 'prefs',
         
     | 
| 
      
 33 
     | 
    
         
            +
                                    android_package: 'androidPackage',
         
     | 
| 
      
 34 
     | 
    
         
            +
                                    android_activity: 'androidActivity',
         
     | 
| 
      
 35 
     | 
    
         
            +
                                    android_device_serial: 'androidDeviceSerial',
         
     | 
| 
      
 36 
     | 
    
         
            +
                                    android_intent_arguments: 'androidIntentArguments'}.freeze
         
     | 
| 
       33 
37 
     | 
    
         
             
                    BROWSER = 'firefox'
         
     | 
| 
       34 
38 
     | 
    
         | 
| 
       35 
39 
     | 
    
         
             
                    # NOTE: special handling of 'profile' to validate when set instead of when used
         
     | 
| 
         @@ -131,6 +135,25 @@ module Selenium 
     | 
|
| 
       131 
135 
     | 
    
         
             
                      @options[:log] = {level: level}
         
     | 
| 
       132 
136 
     | 
    
         
             
                    end
         
     | 
| 
       133 
137 
     | 
    
         | 
| 
      
 138 
     | 
    
         
            +
                    #
         
     | 
| 
      
 139 
     | 
    
         
            +
                    # Enables mobile browser use on Android.
         
     | 
| 
      
 140 
     | 
    
         
            +
                    #
         
     | 
| 
      
 141 
     | 
    
         
            +
                    # @see https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#android
         
     | 
| 
      
 142 
     | 
    
         
            +
                    #
         
     | 
| 
      
 143 
     | 
    
         
            +
                    # @param [String] package The package name of the Chrome or WebView app.
         
     | 
| 
      
 144 
     | 
    
         
            +
                    # @param [String] serial_number The serial number of the device on which to launch the application.
         
     | 
| 
      
 145 
     | 
    
         
            +
                    #   If not specified and multiple devices are attached, an error will be returned.
         
     | 
| 
      
 146 
     | 
    
         
            +
                    # @param [String] activity The fully qualified class name of the activity to be launched.
         
     | 
| 
      
 147 
     | 
    
         
            +
                    # @param [Array] intent_arguments Arguments to launch the intent with.
         
     | 
| 
      
 148 
     | 
    
         
            +
                    #
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
                    def enable_android(package: 'org.mozilla.firefox', serial_number: nil, activity: nil, intent_arguments: nil)
         
     | 
| 
      
 151 
     | 
    
         
            +
                      @options[:android_package] = package
         
     | 
| 
      
 152 
     | 
    
         
            +
                      @options[:android_activity] = activity unless activity.nil?
         
     | 
| 
      
 153 
     | 
    
         
            +
                      @options[:android_device_serial] = serial_number unless serial_number.nil?
         
     | 
| 
      
 154 
     | 
    
         
            +
                      @options[:android_intent_arguments] = intent_arguments unless intent_arguments.nil?
         
     | 
| 
      
 155 
     | 
    
         
            +
                    end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
       134 
157 
     | 
    
         
             
                    private
         
     | 
| 
       135 
158 
     | 
    
         | 
| 
       136 
159 
     | 
    
         
             
                    def process_browser_options(browser_options)
         
     | 
| 
         @@ -150,6 +173,10 @@ module Selenium 
     | 
|
| 
       150 
173 
     | 
    
         
             
                                   Profile.from_name(profile)
         
     | 
| 
       151 
174 
     | 
    
         
             
                                 end
         
     | 
| 
       152 
175 
     | 
    
         
             
                    end
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
                    def camelize?(key)
         
     | 
| 
      
 178 
     | 
    
         
            +
                      key != :prefs
         
     | 
| 
      
 179 
     | 
    
         
            +
                    end
         
     | 
| 
       153 
180 
     | 
    
         
             
                  end # Options
         
     | 
| 
       154 
181 
     | 
    
         
             
                end # Firefox
         
     | 
| 
       155 
182 
     | 
    
         
             
              end # WebDriver
         
     | 
| 
         @@ -33,7 +33,6 @@ module Selenium 
     | 
|
| 
       33 
33 
     | 
    
         
             
                  autoload :Service, 'selenium/webdriver/firefox/service'
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                  DEFAULT_PORT = 7055
         
     | 
| 
       36 
     | 
    
         
            -
                  DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
         
     | 
| 
       37 
36 
     | 
    
         
             
                  DEFAULT_SECURE_SSL = false
         
     | 
| 
       38 
37 
     | 
    
         
             
                  DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
         
     | 
| 
       39 
38 
     | 
    
         
             
                  DEFAULT_LOAD_NO_FOCUS_LIB = false
         
     | 
| 
         @@ -25,7 +25,7 @@ module Selenium 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
                    PORT = 4444
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                    attr_accessor : 
     | 
| 
      
 28 
     | 
    
         
            +
                    attr_accessor :http, :file_detector
         
     | 
| 
       29 
29 
     | 
    
         
             
                    attr_reader :capabilities
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
                    #
         
     | 
| 
         @@ -93,17 +93,16 @@ module Selenium 
     | 
|
| 
       93 
93 
     | 
    
         
             
                      execute :get, {}, {url: url}
         
     | 
| 
       94 
94 
     | 
    
         
             
                    end
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
       96 
     | 
    
         
            -
                     
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
                     
     | 
| 
      
 96 
     | 
    
         
            +
                    #
         
     | 
| 
      
 97 
     | 
    
         
            +
                    # timeouts
         
     | 
| 
      
 98 
     | 
    
         
            +
                    #
         
     | 
| 
       99 
99 
     | 
    
         | 
| 
       100 
     | 
    
         
            -
                    def  
     | 
| 
       101 
     | 
    
         
            -
                       
     | 
| 
      
 100 
     | 
    
         
            +
                    def timeouts
         
     | 
| 
      
 101 
     | 
    
         
            +
                      execute :get_timeouts, {}
         
     | 
| 
       102 
102 
     | 
    
         
             
                    end
         
     | 
| 
       103 
103 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                    def  
     | 
| 
       105 
     | 
    
         
            -
                       
     | 
| 
       106 
     | 
    
         
            -
                      execute :set_timeout, {}, {type => milliseconds}
         
     | 
| 
      
 104 
     | 
    
         
            +
                    def timeouts=(timeouts)
         
     | 
| 
      
 105 
     | 
    
         
            +
                      execute :set_timeout, {}, timeouts
         
     | 
| 
       107 
106 
     | 
    
         
             
                    end
         
     | 
| 
       108 
107 
     | 
    
         | 
| 
       109 
108 
     | 
    
         
             
                    #
         
     | 
| 
         @@ -658,7 +657,7 @@ module Selenium 
     | 
|
| 
       658 
657 
     | 
    
         
             
                    # @see https://mathiasbynens.be/notes/css-escapes
         
     | 
| 
       659 
658 
     | 
    
         
             
                    def escape_css(string)
         
     | 
| 
       660 
659 
     | 
    
         
             
                      string = string.gsub(ESCAPE_CSS_REGEXP) { |match| "\\#{match}" }
         
     | 
| 
       661 
     | 
    
         
            -
                      string = "\\#{UNICODE_CODE_POINT + Integer(string[0])} #{string[1 
     | 
| 
      
 660 
     | 
    
         
            +
                      string = "\\#{UNICODE_CODE_POINT + Integer(string[0])} #{string[1..]}" if string[0]&.match?(/[[:digit:]]/)
         
     | 
| 
       662 
661 
     | 
    
         | 
| 
       663 
662 
     | 
    
         
             
                      string
         
     | 
| 
       664 
663 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -52,7 +52,8 @@ module Selenium 
     | 
|
| 
       52 
52 
     | 
    
         
             
                    end
         
     | 
| 
       53 
53 
     | 
    
         | 
| 
       54 
54 
     | 
    
         
             
                    def devtools_version
         
     | 
| 
       55 
     | 
    
         
            -
                      capabilities['se:cdpVersion'] 
     | 
| 
      
 55 
     | 
    
         
            +
                      capabilities['se:cdpVersion']&.split('.')&.first ||
         
     | 
| 
      
 56 
     | 
    
         
            +
                        raise(Error::WebDriverError, "DevTools is not supported by the Remote Server")
         
     | 
| 
       56 
57 
     | 
    
         
             
                    end
         
     | 
| 
       57 
58 
     | 
    
         
             
                  end # Driver
         
     | 
| 
       58 
59 
     | 
    
         
             
                end # Remote
         
     | 
| 
         @@ -28,6 +28,13 @@ module Selenium 
     | 
|
| 
       28 
28 
     | 
    
         
             
                                    automatic_profiling: 'safari:automaticProfiling'}.freeze
         
     | 
| 
       29 
29 
     | 
    
         
             
                    BROWSER = 'safari'
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
      
 31 
     | 
    
         
            +
                    def add_option(name, value = nil)
         
     | 
| 
      
 32 
     | 
    
         
            +
                      key = name.is_a?(Hash) ? name.keys.first : name
         
     | 
| 
      
 33 
     | 
    
         
            +
                      raise ArgumentError, 'Safari does not support options that are not namespaced' unless key.to_s.include?(':')
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                      super
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
       31 
38 
     | 
    
         
             
                  end # Options
         
     | 
| 
       32 
39 
     | 
    
         
             
                end # Safari
         
     | 
| 
       33 
40 
     | 
    
         
             
              end # WebDriver
         
     | 
    
        data/lib/selenium/webdriver.rb
    CHANGED
    
    
    
        data/selenium-webdriver.gemspec
    CHANGED
    
    | 
         @@ -28,7 +28,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       28 
28 
     | 
    
         
             
              }
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
         
     | 
| 
       31 
     | 
    
         
            -
              s.required_ruby_version = Gem::Requirement.new('>= 2. 
     | 
| 
      
 31 
     | 
    
         
            +
              s.required_ruby_version = Gem::Requirement.new('>= 2.6')
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
              s.files = [
         
     | 
| 
       34 
34 
     | 
    
         
             
                'CHANGES',
         
     | 
| 
         @@ -45,7 +45,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       45 
45 
     | 
    
         
             
              s.require_paths = ['lib']
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
47 
     | 
    
         
             
              s.add_runtime_dependency 'childprocess', ['>= 0.5', '< 5.0']
         
     | 
| 
       48 
     | 
    
         
            -
              s.add_runtime_dependency 'rexml', ['~> 3.2']
         
     | 
| 
      
 48 
     | 
    
         
            +
              s.add_runtime_dependency 'rexml', ['~> 3.2', '>= 3.2.5']
         
     | 
| 
       49 
49 
     | 
    
         
             
              s.add_runtime_dependency 'rubyzip', ['>= 1.2.2']
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
51 
     | 
    
         
             
              # childprocess requires ffi on windows but doesn't declare it in its dependencies
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: selenium-webdriver
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 4.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 4.0.1
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Alex Rodionov
         
     | 
| 
         @@ -10,7 +10,7 @@ authors: 
     | 
|
| 
       10 
10 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       11 
11 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       12 
12 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       13 
     | 
    
         
            -
            date: 2021- 
     | 
| 
      
 13 
     | 
    
         
            +
            date: 2021-10-19 00:00:00.000000000 Z
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies:
         
     | 
| 
       15 
15 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       16 
16 
     | 
    
         
             
              name: childprocess
         
     | 
| 
         @@ -39,6 +39,9 @@ dependencies: 
     | 
|
| 
       39 
39 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       40 
40 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       41 
41 
     | 
    
         
             
                    version: '3.2'
         
     | 
| 
      
 42 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 43 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 44 
     | 
    
         
            +
                    version: 3.2.5
         
     | 
| 
       42 
45 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       43 
46 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       44 
47 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -46,6 +49,9 @@ dependencies: 
     | 
|
| 
       46 
49 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       47 
50 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       48 
51 
     | 
    
         
             
                    version: '3.2'
         
     | 
| 
      
 52 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 53 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 54 
     | 
    
         
            +
                    version: 3.2.5
         
     | 
| 
       49 
55 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       50 
56 
     | 
    
         
             
              name: rubyzip
         
     | 
| 
       51 
57 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -252,10 +258,14 @@ files: 
     | 
|
| 
       252 
258 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/downloads_files.rb
         
     | 
| 
       253 
259 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb
         
     | 
| 
       254 
260 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_addons.rb
         
     | 
| 
      
 261 
     | 
    
         
            +
            - lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb
         
     | 
| 
       255 
262 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_authentication.rb
         
     | 
| 
      
 263 
     | 
    
         
            +
            - lib/selenium/webdriver/common/driver_extensions/has_casting.rb
         
     | 
| 
       256 
264 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_cdp.rb
         
     | 
| 
      
 265 
     | 
    
         
            +
            - lib/selenium/webdriver/common/driver_extensions/has_context.rb
         
     | 
| 
       257 
266 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_debugger.rb
         
     | 
| 
       258 
267 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_devtools.rb
         
     | 
| 
      
 268 
     | 
    
         
            +
            - lib/selenium/webdriver/common/driver_extensions/has_launching.rb
         
     | 
| 
       259 
269 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_location.rb
         
     | 
| 
       260 
270 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_log_events.rb
         
     | 
| 
       261 
271 
     | 
    
         
             
            - lib/selenium/webdriver/common/driver_extensions/has_logs.rb
         
     | 
| 
         @@ -312,6 +322,7 @@ files: 
     | 
|
| 
       312 
322 
     | 
    
         
             
            - lib/selenium/webdriver/devtools/mutation_event.rb
         
     | 
| 
       313 
323 
     | 
    
         
             
            - lib/selenium/webdriver/devtools/pinned_script.rb
         
     | 
| 
       314 
324 
     | 
    
         
             
            - lib/selenium/webdriver/devtools/request.rb
         
     | 
| 
      
 325 
     | 
    
         
            +
            - lib/selenium/webdriver/devtools/response.rb
         
     | 
| 
       315 
326 
     | 
    
         
             
            - lib/selenium/webdriver/edge.rb
         
     | 
| 
       316 
327 
     | 
    
         
             
            - lib/selenium/webdriver/edge/driver.rb
         
     | 
| 
       317 
328 
     | 
    
         
             
            - lib/selenium/webdriver/edge/features.rb
         
     | 
| 
         @@ -375,7 +386,7 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       375 
386 
     | 
    
         
             
              requirements:
         
     | 
| 
       376 
387 
     | 
    
         
             
              - - ">="
         
     | 
| 
       377 
388 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       378 
     | 
    
         
            -
                  version: '2. 
     | 
| 
      
 389 
     | 
    
         
            +
                  version: '2.6'
         
     | 
| 
       379 
390 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       380 
391 
     | 
    
         
             
              requirements:
         
     | 
| 
       381 
392 
     | 
    
         
             
              - - ">"
         
     |