selenium-webdriver 4.0.0.rc1 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">"