selenium-webdriver 4.0.0.alpha7 → 4.0.0.beta1

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 (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)