selenium-webdriver 4.0.0.alpha7 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +25 -0
  3. data/LICENSE +1 -1
  4. data/README.md +4 -5
  5. data/lib/selenium/server.rb +2 -26
  6. data/lib/selenium/webdriver.rb +0 -2
  7. data/lib/selenium/webdriver/atoms/findElements.js +88 -86
  8. data/lib/selenium/webdriver/chrome/driver.rb +6 -0
  9. data/lib/selenium/webdriver/chrome/features.rb +66 -0
  10. data/lib/selenium/webdriver/chrome/options.rb +51 -39
  11. data/lib/selenium/webdriver/chrome/service.rb +1 -1
  12. data/lib/selenium/webdriver/common.rb +2 -1
  13. data/lib/selenium/webdriver/common/driver.rb +11 -5
  14. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +1 -2
  15. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +5 -8
  16. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +7 -1
  17. data/lib/selenium/webdriver/common/driver_extensions/has_logs.rb +30 -0
  18. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -27
  19. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +1 -0
  20. data/lib/selenium/webdriver/{edge_html/driver.rb → common/driver_extensions/prints_page.rb} +7 -13
  21. data/lib/selenium/webdriver/common/manager.rb +6 -1
  22. data/lib/selenium/webdriver/common/options.rb +25 -8
  23. data/lib/selenium/webdriver/common/platform.rb +2 -0
  24. data/lib/selenium/webdriver/common/service.rb +0 -8
  25. data/lib/selenium/webdriver/common/service_manager.rb +1 -1
  26. data/lib/selenium/webdriver/common/target_locator.rb +4 -4
  27. data/lib/selenium/webdriver/devtools.rb +5 -2
  28. data/lib/selenium/webdriver/devtools/v85/memory.rb +1 -1
  29. data/lib/selenium/webdriver/devtools/v85/network.rb +1 -1
  30. data/lib/selenium/webdriver/devtools/v85/page.rb +1 -1
  31. data/lib/selenium/webdriver/devtools/v86/memory.rb +1 -1
  32. data/lib/selenium/webdriver/devtools/v86/network.rb +1 -1
  33. data/lib/selenium/webdriver/devtools/v86/page.rb +1 -1
  34. data/lib/selenium/webdriver/devtools/v87/accessibility.rb +1 -1
  35. data/lib/selenium/webdriver/devtools/v87/animation.rb +2 -2
  36. data/lib/selenium/webdriver/devtools/v87/application_cache.rb +2 -2
  37. data/lib/selenium/webdriver/devtools/v87/audits.rb +2 -2
  38. data/lib/selenium/webdriver/devtools/v87/background_service.rb +2 -2
  39. data/lib/selenium/webdriver/devtools/v87/browser.rb +1 -1
  40. data/lib/selenium/webdriver/devtools/v87/cache_storage.rb +1 -1
  41. data/lib/selenium/webdriver/devtools/v87/cast.rb +2 -2
  42. data/lib/selenium/webdriver/devtools/v87/console.rb +2 -2
  43. data/lib/selenium/webdriver/devtools/v87/css.rb +2 -2
  44. data/lib/selenium/webdriver/devtools/v87/database.rb +2 -2
  45. data/lib/selenium/webdriver/devtools/v87/debugger.rb +2 -2
  46. data/lib/selenium/webdriver/devtools/v87/device_orientation.rb +1 -1
  47. data/lib/selenium/webdriver/devtools/v87/dom.rb +2 -2
  48. data/lib/selenium/webdriver/devtools/v87/dom_debugger.rb +1 -1
  49. data/lib/selenium/webdriver/devtools/v87/dom_snapshot.rb +1 -1
  50. data/lib/selenium/webdriver/devtools/v87/dom_storage.rb +2 -2
  51. data/lib/selenium/webdriver/devtools/v87/emulation.rb +2 -2
  52. data/lib/selenium/webdriver/devtools/v87/fetch.rb +2 -2
  53. data/lib/selenium/webdriver/devtools/v87/headless_experimental.rb +2 -2
  54. data/lib/selenium/webdriver/devtools/v87/heap_profiler.rb +2 -2
  55. data/lib/selenium/webdriver/devtools/v87/indexed_db.rb +1 -1
  56. data/lib/selenium/webdriver/devtools/v87/input.rb +1 -1
  57. data/lib/selenium/webdriver/devtools/v87/inspector.rb +2 -2
  58. data/lib/selenium/webdriver/devtools/v87/io.rb +1 -1
  59. data/lib/selenium/webdriver/devtools/v87/layer_tree.rb +2 -2
  60. data/lib/selenium/webdriver/devtools/v87/log.rb +2 -2
  61. data/lib/selenium/webdriver/devtools/v87/media.rb +2 -2
  62. data/lib/selenium/webdriver/devtools/v87/memory.rb +2 -2
  63. data/lib/selenium/webdriver/devtools/v87/network.rb +3 -3
  64. data/lib/selenium/webdriver/devtools/v87/overlay.rb +2 -2
  65. data/lib/selenium/webdriver/devtools/v87/page.rb +3 -3
  66. data/lib/selenium/webdriver/devtools/v87/performance.rb +2 -2
  67. data/lib/selenium/webdriver/devtools/v87/profiler.rb +2 -2
  68. data/lib/selenium/webdriver/devtools/v87/runtime.rb +2 -2
  69. data/lib/selenium/webdriver/devtools/v87/schema.rb +1 -1
  70. data/lib/selenium/webdriver/devtools/v87/security.rb +2 -2
  71. data/lib/selenium/webdriver/devtools/v87/service_worker.rb +2 -2
  72. data/lib/selenium/webdriver/devtools/v87/storage.rb +2 -2
  73. data/lib/selenium/webdriver/devtools/v87/system_info.rb +1 -1
  74. data/lib/selenium/webdriver/devtools/v87/target.rb +2 -2
  75. data/lib/selenium/webdriver/devtools/v87/tethering.rb +2 -2
  76. data/lib/selenium/webdriver/devtools/v87/tracing.rb +2 -2
  77. data/lib/selenium/webdriver/devtools/v87/web_audio.rb +2 -2
  78. data/lib/selenium/webdriver/devtools/v87/web_authn.rb +1 -1
  79. data/lib/selenium/webdriver/devtools/{v84 → v88}/accessibility.rb +12 -3
  80. data/lib/selenium/webdriver/devtools/{v84 → v88}/animation.rb +3 -3
  81. data/lib/selenium/webdriver/devtools/{v84 → v88}/application_cache.rb +3 -3
  82. data/lib/selenium/webdriver/devtools/{v84 → v88}/audits.rb +3 -3
  83. data/lib/selenium/webdriver/devtools/{v84 → v88}/background_service.rb +3 -3
  84. data/lib/selenium/webdriver/devtools/{v84 → v88}/browser.rb +8 -3
  85. data/lib/selenium/webdriver/devtools/{v84 → v88}/cache_storage.rb +3 -3
  86. data/lib/selenium/webdriver/devtools/{v84 → v88}/cast.rb +3 -3
  87. data/lib/selenium/webdriver/devtools/{v84 → v88}/console.rb +3 -3
  88. data/lib/selenium/webdriver/devtools/{v84 → v88}/css.rb +17 -3
  89. data/lib/selenium/webdriver/devtools/{v84 → v88}/database.rb +3 -3
  90. data/lib/selenium/webdriver/devtools/{v84 → v88}/debugger.rb +9 -7
  91. data/lib/selenium/webdriver/devtools/{v84 → v88}/device_orientation.rb +3 -3
  92. data/lib/selenium/webdriver/devtools/{v84 → v88}/dom.rb +10 -3
  93. data/lib/selenium/webdriver/devtools/{v84 → v88}/dom_debugger.rb +3 -3
  94. data/lib/selenium/webdriver/devtools/{v84 → v88}/dom_snapshot.rb +3 -3
  95. data/lib/selenium/webdriver/devtools/{v84 → v88}/dom_storage.rb +3 -3
  96. data/lib/selenium/webdriver/devtools/{v84 → v88}/emulation.rb +21 -5
  97. data/lib/selenium/webdriver/devtools/{v84 → v88}/fetch.rb +3 -3
  98. data/lib/selenium/webdriver/devtools/{v84 → v88}/headless_experimental.rb +3 -3
  99. data/lib/selenium/webdriver/devtools/{v84 → v88}/heap_profiler.rb +3 -3
  100. data/lib/selenium/webdriver/devtools/{v84 → v88}/indexed_db.rb +3 -3
  101. data/lib/selenium/webdriver/devtools/{v84 → v88}/input.rb +12 -6
  102. data/lib/selenium/webdriver/devtools/{v84 → v88}/inspector.rb +3 -3
  103. data/lib/selenium/webdriver/devtools/{v84 → v88}/io.rb +3 -3
  104. data/lib/selenium/webdriver/devtools/{v84 → v88}/layer_tree.rb +3 -3
  105. data/lib/selenium/webdriver/devtools/{v84 → v88}/log.rb +3 -3
  106. data/lib/selenium/webdriver/devtools/{v84 → v88}/media.rb +3 -3
  107. data/lib/selenium/webdriver/devtools/{v84 → v88}/memory.rb +4 -4
  108. data/lib/selenium/webdriver/devtools/{v84 → v88}/network.rb +21 -4
  109. data/lib/selenium/webdriver/devtools/{v84 → v88}/overlay.rb +29 -5
  110. data/lib/selenium/webdriver/devtools/{v84 → v88}/page.rb +4 -4
  111. data/lib/selenium/webdriver/devtools/{v84 → v88}/performance.rb +3 -3
  112. data/lib/selenium/webdriver/devtools/{v84 → v88}/profiler.rb +15 -3
  113. data/lib/selenium/webdriver/devtools/{v84 → v88}/runtime.rb +9 -7
  114. data/lib/selenium/webdriver/devtools/{v84 → v88}/schema.rb +3 -3
  115. data/lib/selenium/webdriver/devtools/{v84 → v88}/security.rb +3 -3
  116. data/lib/selenium/webdriver/devtools/{v84 → v88}/service_worker.rb +3 -3
  117. data/lib/selenium/webdriver/devtools/{v84 → v88}/storage.rb +9 -3
  118. data/lib/selenium/webdriver/devtools/{v84 → v88}/system_info.rb +3 -3
  119. data/lib/selenium/webdriver/devtools/{v84 → v88}/target.rb +7 -5
  120. data/lib/selenium/webdriver/devtools/{v84 → v88}/tethering.rb +3 -3
  121. data/lib/selenium/webdriver/devtools/{v84 → v88}/tracing.rb +6 -5
  122. data/lib/selenium/webdriver/devtools/{v84 → v88}/web_audio.rb +3 -3
  123. data/lib/selenium/webdriver/devtools/{v84 → v88}/web_authn.rb +9 -3
  124. data/lib/selenium/webdriver/edge.rb +7 -29
  125. data/lib/selenium/webdriver/{edge_chrome → edge}/bridge.rb +2 -2
  126. data/lib/selenium/webdriver/{edge_chrome → edge}/driver.rb +4 -4
  127. data/lib/selenium/webdriver/edge/features.rb +39 -0
  128. data/lib/selenium/webdriver/{edge_chrome → edge}/options.rb +9 -3
  129. data/lib/selenium/webdriver/{edge_chrome → edge}/profile.rb +2 -2
  130. data/lib/selenium/webdriver/{edge_chrome → edge}/service.rb +2 -2
  131. data/lib/selenium/webdriver/firefox/driver.rb +13 -0
  132. data/lib/selenium/webdriver/firefox/features.rb +47 -0
  133. data/lib/selenium/webdriver/firefox/options.rb +20 -21
  134. data/lib/selenium/webdriver/firefox/profile.rb +12 -2
  135. data/lib/selenium/webdriver/firefox/service.rb +1 -1
  136. data/lib/selenium/webdriver/ie/options.rb +0 -10
  137. data/lib/selenium/webdriver/ie/service.rb +1 -1
  138. data/lib/selenium/webdriver/remote/bridge.rb +6 -26
  139. data/lib/selenium/webdriver/remote/capabilities.rb +1 -15
  140. data/lib/selenium/webdriver/remote/commands.rb +1 -0
  141. data/lib/selenium/webdriver/remote/driver.rb +6 -1
  142. data/lib/selenium/webdriver/remote/http/default.rb +2 -2
  143. data/lib/selenium/webdriver/remote/http/persistent.rb +6 -0
  144. data/lib/selenium/webdriver/{common/driver_extensions/rotatable.rb → safari/features.rb} +26 -36
  145. data/lib/selenium/webdriver/safari/options.rb +0 -25
  146. data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
  147. data/lib/selenium/webdriver/support/event_firing_bridge.rb +1 -1
  148. data/lib/selenium/webdriver/version.rb +1 -1
  149. data/selenium-webdriver.gemspec +4 -2
  150. data/selenium_server_deploy.jar +0 -0
  151. metadata +89 -59
  152. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +0 -65
  153. data/lib/selenium/webdriver/edge_html/options.rb +0 -84
  154. data/lib/selenium/webdriver/edge_html/service.rb +0 -47
@@ -32,7 +32,7 @@ module Selenium
32
32
 
33
33
  private
34
34
 
35
- # Note: This processing is deprecated
35
+ # NOTE: This processing is deprecated
36
36
  def extract_service_args(driver_opts)
37
37
  driver_args = super
38
38
  driver_opts = driver_opts.dup
@@ -50,7 +50,6 @@ require 'selenium/webdriver/common/action_builder'
50
50
  require 'selenium/webdriver/common/html5/shared_web_storage'
51
51
  require 'selenium/webdriver/common/html5/local_storage'
52
52
  require 'selenium/webdriver/common/html5/session_storage'
53
- require 'selenium/webdriver/common/driver_extensions/rotatable'
54
53
  require 'selenium/webdriver/common/driver_extensions/has_web_storage'
55
54
  require 'selenium/webdriver/common/driver_extensions/downloads_files'
56
55
  require 'selenium/webdriver/common/driver_extensions/has_location'
@@ -60,10 +59,12 @@ require 'selenium/webdriver/common/driver_extensions/has_network_conditions'
60
59
  require 'selenium/webdriver/common/driver_extensions/has_network_connection'
61
60
  require 'selenium/webdriver/common/driver_extensions/has_permissions'
62
61
  require 'selenium/webdriver/common/driver_extensions/has_debugger'
62
+ require 'selenium/webdriver/common/driver_extensions/prints_page'
63
63
  require 'selenium/webdriver/common/driver_extensions/uploads_files'
64
64
  require 'selenium/webdriver/common/driver_extensions/has_addons'
65
65
  require 'selenium/webdriver/common/driver_extensions/has_devtools'
66
66
  require 'selenium/webdriver/common/driver_extensions/has_authentication'
67
+ require 'selenium/webdriver/common/driver_extensions/has_logs'
67
68
  require 'selenium/webdriver/common/driver_extensions/has_log_events'
68
69
  require 'selenium/webdriver/common/keys'
69
70
  require 'selenium/webdriver/common/profile_helper'
@@ -53,10 +53,6 @@ module Selenium
53
53
  Firefox::Driver.new(**opts)
54
54
  when :edge
55
55
  Edge::Driver.new(**opts)
56
- when :edge_chrome
57
- EdgeChrome::Driver.new(**opts)
58
- when :edge_html
59
- EdgeHtml::Driver.new(**opts)
60
56
  when :remote
61
57
  Remote::Driver.new(**opts)
62
58
  else
@@ -82,6 +78,16 @@ module Selenium
82
78
  format '#<%<class>s:0x%<hash>x browser=%<browser>s>', class: self.class, hash: hash * 2, browser: bridge.browser.inspect
83
79
  end
84
80
 
81
+ #
82
+ # information about whether a remote end is in a state in which it can create new sessions,
83
+ # and may include additional meta information.
84
+ #
85
+ # @return [Hash]
86
+ #
87
+ def status
88
+ @bridge.status
89
+ end
90
+
85
91
  #
86
92
  # @return [Navigation]
87
93
  # @see Navigation
@@ -298,7 +304,7 @@ module Selenium
298
304
  def create_bridge(**opts)
299
305
  opts[:url] ||= service_url(opts)
300
306
  caps = opts.delete(:capabilities)
301
- # Note: This is deprecated
307
+ # NOTE: This is deprecated
302
308
  cap_array = caps.is_a?(Hash) ? [caps] : Array(caps)
303
309
 
304
310
  desired_capabilities = opts.delete(:desired_capabilities)
@@ -29,8 +29,7 @@ module Selenium
29
29
  #
30
30
 
31
31
  def devtools
32
- version = Integer(capabilities.browser_version.split('.').first)
33
- @devtools ||= DevTools.new(url: debugger_address, version: version)
32
+ @devtools ||= DevTools.new(url: debugger_address, version: devtools_version)
34
33
  end
35
34
 
36
35
  end # HasDevTools
@@ -17,23 +17,20 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
+ # TODO: Deprecated; Delete after 4.0 release
20
21
  module Selenium
21
22
  module WebDriver
22
23
  module DriverExtensions
23
24
  module HasLocation
24
25
  def location
25
- @bridge.location
26
+ raise Error::UnsupportedOperationError, 'The W3C standard does not currently support getting location'
26
27
  end
27
28
 
28
- def location=(loc)
29
- raise TypeError, "expected #{Location}, got #{loc.inspect}:#{loc.class}" unless loc.is_a?(Location)
30
-
31
- @bridge.set_location loc.latitude, loc.longitude, loc.altitude
29
+ def location=(*)
30
+ raise Error::UnsupportedOperationError, 'The W3C standard does not currently support setting location'
32
31
  end
32
+ alias_method :set_location, :location
33
33
 
34
- def set_location(lat, lon, alt)
35
- self.location = Location.new(Float(lat), Float(lon), Float(alt))
36
- end
37
34
  end # HasLocation
38
35
  end # DriverExtensions
39
36
  end # WebDriver
@@ -89,8 +89,14 @@ module Selenium
89
89
 
90
90
  def log_exception_events
91
91
  devtools.runtime.on(:exception_thrown) do |params|
92
+ description = if params.dig('exceptionDetails', 'exception')
93
+ params.dig('exceptionDetails', 'exception', 'description')
94
+ else
95
+ params.dig('exceptionDetails', 'text')
96
+ end
97
+
92
98
  event = DevTools::ExceptionEvent.new(
93
- description: params.dig('exceptionDetails', 'exception', 'description'),
99
+ description: description,
94
100
  timestamp: params['timestamp'],
95
101
  stacktrace: params.dig('exceptionDetails', 'stackTrace', 'callFrames')
96
102
  )
@@ -0,0 +1,30 @@
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
+ module DriverExtensions
23
+ module HasLogs
24
+ def logs
25
+ @logs ||= Logs.new(@bridge)
26
+ end
27
+ end # HasLogs
28
+ end # DriverExtensions
29
+ end # WebDriver
30
+ end # Selenium
@@ -17,40 +17,17 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
+ # TODO: Deprecated; Delete after 4.0 release
20
21
  module Selenium
21
22
  module WebDriver
22
23
  module DriverExtensions
23
24
  module HasNetworkConnection
24
25
  def network_connection_type
25
- connection_value = @bridge.network_connection
26
-
27
- connection_type = values_to_type[connection_value]
28
-
29
- # In case the connection type is not recognized return the
30
- # connection value.
31
- connection_type || connection_value
32
- end
33
-
34
- def network_connection_type=(connection_type)
35
- raise ArgumentError, 'Invalid connection type' unless valid_type? connection_type
36
-
37
- connection_value = type_to_values[connection_type]
38
-
39
- @bridge.network_connection = connection_value
40
- end
41
-
42
- private
43
-
44
- def type_to_values
45
- {airplane_mode: 1, wifi: 2, data: 4, all: 6, none: 0}
46
- end
47
-
48
- def values_to_type
49
- type_to_values.invert
26
+ raise Error::UnsupportedOperationError, 'The W3C standard does not currently support getting network connection'
50
27
  end
51
28
 
52
- def valid_type?(type)
53
- type_to_values.key? type
29
+ def network_connection_type=(*)
30
+ raise Error::UnsupportedOperationError, 'The W3C standard does not currently support setting network connection'
54
31
  end
55
32
  end # HasNetworkConnection
56
33
  end # DriverExtensions
@@ -22,6 +22,7 @@ module Selenium
22
22
  module DriverExtensions
23
23
  module HasRemoteStatus
24
24
  def remote_status
25
+ WebDriver.logger.deprecate('#remote_status', '#status')
25
26
  @bridge.status
26
27
  end
27
28
  end # HasRemoteStatus
@@ -19,20 +19,14 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module EdgeHtml
22
+ module DriverExtensions
23
+ module PrintsPage
24
+ def print_page(**options)
25
+ options[:page_ranges] &&= Array(options[:page_ranges])
23
26
 
24
- #
25
- # Driver implementation for Microsoft Edge.
26
- # @api private
27
- #
28
-
29
- class Driver < WebDriver::Driver
30
- include DriverExtensions::HasWebStorage
31
-
32
- def browser
33
- :edge_html
27
+ @bridge.print_page(options)
34
28
  end
35
- end # Driver
36
- end # EdgeHtml
29
+ end # PrintsPage
30
+ end # DriverExtensions
37
31
  end # WebDriver
38
32
  end # Selenium
@@ -46,12 +46,15 @@ module Selenium
46
46
  raise ArgumentError, 'name is required' unless opts[:name]
47
47
  raise ArgumentError, 'value is required' unless opts[:value]
48
48
 
49
- opts[:path] ||= '/'
49
+ # NOTE: This is required because of https://bugs.chromium.org/p/chromedriver/issues/detail?id=3732
50
50
  opts[:secure] ||= false
51
51
 
52
52
  same_site = opts.delete(:same_site)
53
53
  opts[:sameSite] = same_site if same_site
54
54
 
55
+ http_only = opts.delete(:http_only)
56
+ opts[:httpOnly] = http_only if http_only
57
+
55
58
  obj = opts.delete(:expires)
56
59
  opts[:expiry] = seconds_from(obj).to_i if obj
57
60
 
@@ -106,6 +109,7 @@ module Selenium
106
109
  #
107
110
 
108
111
  def logs
112
+ WebDriver.logger.deprecate('Manager#logs', 'Chrome::Driver#logs')
109
113
  @logs ||= Logs.new(@bridge)
110
114
  end
111
115
 
@@ -174,6 +178,7 @@ module Selenium
174
178
  domain: cookie['domain'] && strip_port(cookie['domain']),
175
179
  expires: cookie['expiry'] && datetime_at(cookie['expiry']),
176
180
  same_site: cookie['sameSite'],
181
+ http_only: cookie['httpOnly'],
177
182
  secure: cookie['secure']
178
183
  }
179
184
  end
@@ -23,19 +23,25 @@ module Selenium
23
23
  W3C_OPTIONS = %i[browser_name browser_version platform_name accept_insecure_certs page_load_strategy proxy
24
24
  set_window_rect timeouts unhandled_prompt_behavior strict_file_interactability].freeze
25
25
 
26
- W3C_OPTIONS.each do |key|
27
- define_method key do
28
- @options[key]
29
- end
26
+ def self.set_capabilities
27
+ (W3C_OPTIONS + self::CAPABILITIES.keys).each do |key|
28
+ next if method_defined? key
29
+
30
+ define_method key do
31
+ @options[key]
32
+ end
30
33
 
31
- define_method "#{key}=" do |value|
32
- @options[key] = value
34
+ define_method "#{key}=" do |value|
35
+ @options[key] = value
36
+ end
33
37
  end
34
38
  end
35
39
 
36
40
  attr_accessor :options
37
41
 
38
42
  def initialize(options: nil, **opts)
43
+ self.class.set_capabilities
44
+
39
45
  @options = if options
40
46
  WebDriver.logger.deprecate(":options as keyword for initializing #{self.class}",
41
47
  "custom values directly in #new constructor",
@@ -78,16 +84,27 @@ module Selenium
78
84
  end
79
85
  browser_options = defined?(self.class::KEY) ? {self.class::KEY => options} : options
80
86
 
81
- process_browser_options(browser_options) if private_methods(false).include?(:process_browser_options)
87
+ process_browser_options(browser_options)
82
88
  generate_as_json(w3c_options.merge(browser_options))
83
89
  end
84
90
 
85
91
  private
86
92
 
93
+ def process_browser_options(_browser_options)
94
+ nil
95
+ end
96
+
97
+ def camelize?(_key)
98
+ true
99
+ end
100
+
87
101
  def generate_as_json(value, camelize_keys: true)
88
102
  if value.is_a?(Hash)
89
103
  value.each_with_object({}) do |(key, val), hash|
90
- hash[convert_json_key(key, camelize: camelize_keys)] = generate_as_json(val, camelize_keys: camelize_keys)
104
+ next if val.respond_to?(:empty?) && val.empty?
105
+
106
+ key = convert_json_key(key, camelize: camelize_keys)
107
+ hash[key] = generate_as_json(val, camelize_keys: camelize?(key))
91
108
  end
92
109
  elsif value.respond_to?(:as_json)
93
110
  value.as_json
@@ -57,6 +57,8 @@ module Selenium
57
57
  :jenkins
58
58
  elsif ENV['APPVEYOR']
59
59
  :appveyor
60
+ elsif ENV['GITHUB_ACTIONS']
61
+ :github
60
62
  end
61
63
  end
62
64
 
@@ -45,14 +45,6 @@ module Selenium
45
45
  Edge::Service.new(**opts)
46
46
  end
47
47
 
48
- def edge_chrome(**opts)
49
- EdgeChrome::Service.new(**opts)
50
- end
51
-
52
- def edge_html(**opts)
53
- EdgeHtml::Service.new(**opts)
54
- end
55
-
56
48
  def safari(**opts)
57
49
  Safari::Service.new(**opts)
58
50
  end
@@ -103,7 +103,7 @@ module Selenium
103
103
 
104
104
  def start_process
105
105
  @process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
106
- # Note: this is a bug only in Windows 7
106
+ # NOTE: this is a bug only in Windows 7
107
107
  @process.leader = true unless Platform.windows?
108
108
  @process.start
109
109
  end
@@ -57,10 +57,10 @@ module Selenium
57
57
  def window(id)
58
58
  if block_given?
59
59
  original = begin
60
- @bridge.window_handle
61
- rescue Error::NoSuchWindowError
62
- nil
63
- end
60
+ @bridge.window_handle
61
+ rescue Error::NoSuchWindowError
62
+ nil
63
+ end
64
64
 
65
65
  unless @bridge.window_handles.include? id
66
66
  raise Error::NoSuchWindowError, "The specified identifier '#{id}' is not found in the window handle list"
@@ -24,7 +24,7 @@ module Selenium
24
24
  autoload :ExceptionEvent, 'selenium/webdriver/devtools/exception_event'
25
25
  autoload :MutationEvent, 'selenium/webdriver/devtools/mutation_event'
26
26
 
27
- SUPPORTED_VERSIONS = [84, 85, 86].freeze
27
+ SUPPORTED_VERSIONS = [85, 86, 87, 88].freeze
28
28
 
29
29
  def initialize(url:, version:)
30
30
  @messages = []
@@ -80,6 +80,9 @@ module Selenium
80
80
  incoming_frame << socket.readpartial(1024)
81
81
 
82
82
  while (frame = incoming_frame.next)
83
+ # Firefox will periodically fail on unparsable empty frame
84
+ break if frame.to_s.empty?
85
+
83
86
  message = JSON.parse(frame.to_s)
84
87
  @messages << message
85
88
  WebDriver.logger.debug "DevTools <- #{message}"
@@ -112,7 +115,7 @@ module Selenium
112
115
 
113
116
  def page_target
114
117
  @page_target ||= begin
115
- response = Net::HTTP.get(@uri.hostname, '/json', @uri.port)
118
+ response = Net::HTTP.get(@uri.hostname, '/json/list', @uri.port)
116
119
  targets = JSON.parse(response)
117
120
  targets.find { |target| target['type'] == 'page' }
118
121
  end
@@ -45,7 +45,7 @@ module Selenium
45
45
  @devtools.send_cmd('Memory.prepareForLeakDetection')
46
46
  end
47
47
 
48
- def forcibly_purge_java_script_memory
48
+ def forcibly_purge_javascript_memory
49
49
  @devtools.send_cmd('Memory.forciblyPurgeJavaScriptMemory')
50
50
  end
51
51
 
@@ -165,7 +165,7 @@ module Selenium
165
165
  isRegex: is_regex)
166
166
  end
167
167
 
168
- def set_blocked_ur_ls(urls:)
168
+ def set_blocked_urls(urls:)
169
169
  @devtools.send_cmd('Network.setBlockedURLs',
170
170
  urls: urls)
171
171
  end
@@ -166,7 +166,7 @@ module Selenium
166
166
  @devtools.send_cmd('Page.getResourceTree')
167
167
  end
168
168
 
169
- def handle_java_script_dialog(accept:, prompt_text: nil)
169
+ def handle_javascript_dialog(accept:, prompt_text: nil)
170
170
  @devtools.send_cmd('Page.handleJavaScriptDialog',
171
171
  accept: accept,
172
172
  promptText: prompt_text)