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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +60 -0
  3. data/README.md +1 -1
  4. data/lib/selenium/server.rb +62 -48
  5. data/lib/selenium/webdriver/atoms/findElements.js +2 -2
  6. data/lib/selenium/webdriver/atoms/getAttribute.js +25 -25
  7. data/lib/selenium/webdriver/chrome/driver.rb +3 -0
  8. data/lib/selenium/webdriver/chrome/features.rb +44 -4
  9. data/lib/selenium/webdriver/chrome/options.rb +24 -1
  10. data/lib/selenium/webdriver/common/driver.rb +2 -0
  11. data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +51 -0
  12. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +77 -0
  13. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +45 -0
  14. data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +38 -0
  15. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +17 -0
  16. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +87 -18
  17. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -11
  18. data/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +1 -1
  19. data/lib/selenium/webdriver/common/log_entry.rb +2 -2
  20. data/lib/selenium/webdriver/common/manager.rb +3 -13
  21. data/lib/selenium/webdriver/common/options.rb +13 -5
  22. data/lib/selenium/webdriver/common/profile_helper.rb +1 -7
  23. data/lib/selenium/webdriver/common/socket_poller.rb +30 -19
  24. data/lib/selenium/webdriver/common/target_locator.rb +28 -0
  25. data/lib/selenium/webdriver/common/timeouts.rb +31 -4
  26. data/lib/selenium/webdriver/common/window.rb +0 -4
  27. data/lib/selenium/webdriver/common/zipper.rb +1 -9
  28. data/lib/selenium/webdriver/common.rb +4 -0
  29. data/lib/selenium/webdriver/devtools/request.rb +27 -17
  30. data/lib/selenium/webdriver/devtools/response.rb +66 -0
  31. data/lib/selenium/webdriver/devtools.rb +49 -12
  32. data/lib/selenium/webdriver/edge/features.rb +5 -0
  33. data/lib/selenium/webdriver/firefox/driver.rb +5 -0
  34. data/lib/selenium/webdriver/firefox/features.rb +14 -0
  35. data/lib/selenium/webdriver/firefox/options.rb +28 -1
  36. data/lib/selenium/webdriver/firefox.rb +0 -1
  37. data/lib/selenium/webdriver/remote/bridge.rb +9 -10
  38. data/lib/selenium/webdriver/remote/capabilities.rb +1 -0
  39. data/lib/selenium/webdriver/remote/commands.rb +1 -0
  40. data/lib/selenium/webdriver/remote/driver.rb +2 -1
  41. data/lib/selenium/webdriver/safari/driver.rb +1 -1
  42. data/lib/selenium/webdriver/safari/options.rb +7 -0
  43. data/lib/selenium/webdriver/version.rb +1 -1
  44. data/lib/selenium/webdriver.rb +1 -0
  45. data/selenium-webdriver.gemspec +2 -2
  46. 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
- attr_reader :url, :method, :headers
25
+ attr_accessor :url, :method, :headers, :post_data
26
+ attr_reader :id
26
27
 
27
- def initialize(devtools:, id:, url:, method:, headers:)
28
- @devtools = devtools
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 continue
36
- @devtools.fetch.continue_request(request_id: @id)
37
- end
38
-
39
- def respond(code: 200, headers: {}, body: '')
40
- @devtools.fetch.fulfill_request(
41
- request_id: @id,
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
- socket_listener = Thread.new do
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
- # Firefox will periodically fail on unparsable empty frame
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 = message['params'] # take in current thread!
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: 10, interval: 0.1)
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'}.freeze
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 :context, :http, :file_detector
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
- def implicit_wait_timeout=(milliseconds)
97
- timeout('implicit', milliseconds)
98
- end
96
+ #
97
+ # timeouts
98
+ #
99
99
 
100
- def script_timeout=(milliseconds)
101
- timeout('script', milliseconds)
100
+ def timeouts
101
+ execute :get_timeouts, {}
102
102
  end
103
103
 
104
- def timeout(type, milliseconds)
105
- type = 'pageLoad' if type == 'page load'
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..-1]}" if string[0]&.match?(/[[:digit:]]/)
660
+ string = "\\#{UNICODE_CODE_POINT + Integer(string[0])} #{string[1..]}" if string[0]&.match?(/[[:digit:]]/)
662
661
 
663
662
  string
664
663
  end
@@ -39,6 +39,7 @@ module Selenium
39
39
  :timeouts,
40
40
  :unhandled_prompt_behavior,
41
41
  :strict_file_interactability,
42
+ :web_socket_url,
42
43
 
43
44
  # remote-specific (webdriver.remote.sessionid)
44
45
  :remote_session_id
@@ -114,6 +114,7 @@ module Selenium
114
114
  # timeouts
115
115
  #
116
116
 
117
+ get_timeouts: [:get, 'session/:session_id/timeouts'],
117
118
  set_timeout: [:post, 'session/:session_id/timeouts'],
118
119
 
119
120
  #
@@ -52,7 +52,8 @@ module Selenium
52
52
  end
53
53
 
54
54
  def devtools_version
55
- capabilities['se:cdpVersion'].split('.').first
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,7 +28,7 @@ module Selenium
28
28
 
29
29
  class Driver < WebDriver::Driver
30
30
  EXTENSIONS = [DriverExtensions::HasDebugger,
31
- DriverExtensions::HasPermissions,
31
+ DriverExtensions::HasApplePermissions,
32
32
  DriverExtensions::HasWebStorage].freeze
33
33
 
34
34
  def browser
@@ -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
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.0.0.rc1'
22
+ VERSION = '4.0.1'
23
23
  end # WebDriver
24
24
  end # Selenium
@@ -23,6 +23,7 @@ require 'fileutils'
23
23
  require 'date'
24
24
  require 'json'
25
25
  require 'set'
26
+ require 'uri'
26
27
 
27
28
  require 'selenium/webdriver/atoms'
28
29
  require 'selenium/webdriver/common'
@@ -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.5')
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.0.rc1
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-09-01 00:00:00.000000000 Z
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.5'
389
+ version: '2.6'
379
390
  required_rubygems_version: !ruby/object:Gem::Requirement
380
391
  requirements:
381
392
  - - ">"