selenium-webdriver 4.5.0 → 4.9.0

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +117 -1
  3. data/LICENSE +1 -1
  4. data/NOTICE +1 -1
  5. data/bin/linux/selenium-manager +0 -0
  6. data/bin/macos/selenium-manager +0 -0
  7. data/bin/windows/selenium-manager.exe +0 -0
  8. data/lib/selenium/server.rb +6 -8
  9. data/lib/selenium/webdriver/atoms/findElements.js +0 -0
  10. data/lib/selenium/webdriver/atoms/getAttribute.js +0 -0
  11. data/lib/selenium/webdriver/atoms/isDisplayed.js +0 -0
  12. data/lib/selenium/webdriver/atoms/mutationListener.js +0 -0
  13. data/lib/selenium/webdriver/atoms.rb +2 -3
  14. data/lib/selenium/webdriver/bidi/browsing_context.rb +88 -0
  15. data/lib/selenium/webdriver/bidi/browsing_context_info.rb +35 -0
  16. data/lib/selenium/webdriver/bidi/log/base_log_entry.rb +35 -0
  17. data/lib/selenium/webdriver/bidi/log/console_log_entry.rb +35 -0
  18. data/lib/selenium/webdriver/bidi/log/filter_by.rb +40 -0
  19. data/lib/selenium/webdriver/bidi/log/generic_log_entry.rb +33 -0
  20. data/lib/selenium/webdriver/bidi/log/javascript_log_entry.rb +33 -0
  21. data/lib/selenium/webdriver/bidi/log_inspector.rb +143 -0
  22. data/lib/selenium/webdriver/bidi/navigate_result.rb +33 -0
  23. data/lib/selenium/webdriver/bidi/session.rb +13 -0
  24. data/lib/selenium/webdriver/bidi.rb +3 -2
  25. data/lib/selenium/webdriver/chrome/driver.rb +9 -30
  26. data/lib/selenium/webdriver/chrome/features.rb +5 -72
  27. data/lib/selenium/webdriver/chrome/options.rb +3 -237
  28. data/lib/selenium/webdriver/chrome/profile.rb +3 -83
  29. data/lib/selenium/webdriver/chrome/service.rb +3 -23
  30. data/lib/selenium/webdriver/chromium/driver.rb +61 -0
  31. data/lib/selenium/webdriver/chromium/features.rb +103 -0
  32. data/lib/selenium/webdriver/chromium/options.rb +261 -0
  33. data/lib/selenium/webdriver/chromium/profile.rb +113 -0
  34. data/lib/selenium/webdriver/chromium/service.rb +42 -0
  35. data/lib/selenium/webdriver/chromium.rb +32 -0
  36. data/lib/selenium/webdriver/common/action_builder.rb +11 -48
  37. data/lib/selenium/webdriver/common/child_process.rb +124 -0
  38. data/lib/selenium/webdriver/common/driver.rb +21 -26
  39. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
  40. data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +0 -1
  41. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
  42. data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +0 -2
  43. data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +0 -2
  44. data/lib/selenium/webdriver/common/driver_extensions/has_bidi.rb +0 -2
  45. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +0 -1
  46. data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +0 -2
  47. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +0 -2
  48. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
  49. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +0 -2
  50. data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +0 -2
  51. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +1 -2
  52. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +0 -1
  53. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -2
  54. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +0 -2
  55. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +0 -2
  56. data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +0 -2
  57. data/lib/selenium/webdriver/common/driver_finder.rb +43 -0
  58. data/lib/selenium/webdriver/common/element.rb +6 -6
  59. data/lib/selenium/webdriver/common/error.rb +0 -2
  60. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +2 -2
  61. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +3 -3
  62. data/lib/selenium/webdriver/common/interactions/pointer_move.rb +2 -2
  63. data/lib/selenium/webdriver/common/interactions/scroll.rb +7 -5
  64. data/lib/selenium/webdriver/common/local_driver.rb +55 -0
  65. data/lib/selenium/webdriver/common/logger.rb +10 -2
  66. data/lib/selenium/webdriver/common/options.rb +30 -8
  67. data/lib/selenium/webdriver/common/platform.rb +4 -0
  68. data/lib/selenium/webdriver/common/profile_helper.rb +1 -1
  69. data/lib/selenium/webdriver/common/proxy.rb +1 -1
  70. data/lib/selenium/webdriver/common/selenium_manager.rb +108 -0
  71. data/lib/selenium/webdriver/common/service.rb +11 -22
  72. data/lib/selenium/webdriver/common/service_manager.rb +3 -11
  73. data/lib/selenium/webdriver/common/shadow_root.rb +1 -2
  74. data/lib/selenium/webdriver/common/socket_lock.rb +2 -2
  75. data/lib/selenium/webdriver/common/takes_screenshot.rb +2 -3
  76. data/lib/selenium/webdriver/common/target_locator.rb +2 -3
  77. data/lib/selenium/webdriver/common/timeouts.rb +2 -2
  78. data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +8 -6
  79. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +0 -1
  80. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +16 -16
  81. data/lib/selenium/webdriver/common/websocket_connection.rb +10 -2
  82. data/lib/selenium/webdriver/common.rb +4 -0
  83. data/lib/selenium/webdriver/devtools/console_event.rb +0 -2
  84. data/lib/selenium/webdriver/devtools/exception_event.rb +0 -2
  85. data/lib/selenium/webdriver/devtools/mutation_event.rb +0 -2
  86. data/lib/selenium/webdriver/devtools/network_interceptor.rb +4 -7
  87. data/lib/selenium/webdriver/devtools/pinned_script.rb +0 -2
  88. data/lib/selenium/webdriver/devtools/request.rb +0 -2
  89. data/lib/selenium/webdriver/devtools/response.rb +0 -2
  90. data/lib/selenium/webdriver/devtools.rb +11 -2
  91. data/lib/selenium/webdriver/edge/driver.rb +9 -3
  92. data/lib/selenium/webdriver/edge/features.rb +3 -4
  93. data/lib/selenium/webdriver/edge/options.rb +3 -5
  94. data/lib/selenium/webdriver/edge/profile.rb +2 -2
  95. data/lib/selenium/webdriver/edge/service.rb +2 -6
  96. data/lib/selenium/webdriver/firefox/driver.rb +8 -2
  97. data/lib/selenium/webdriver/firefox/features.rb +0 -1
  98. data/lib/selenium/webdriver/firefox/options.rb +4 -1
  99. data/lib/selenium/webdriver/firefox/profile.rb +6 -6
  100. data/lib/selenium/webdriver/firefox/service.rb +0 -6
  101. data/lib/selenium/webdriver/ie/driver.rb +7 -1
  102. data/lib/selenium/webdriver/ie/service.rb +1 -7
  103. data/lib/selenium/webdriver/remote/{commands.rb → bridge/commands.rb} +0 -2
  104. data/lib/selenium/webdriver/remote/bridge.rb +9 -15
  105. data/lib/selenium/webdriver/remote/capabilities.rb +34 -12
  106. data/lib/selenium/webdriver/remote/driver.rb +19 -13
  107. data/lib/selenium/webdriver/remote/http/curb.rb +0 -2
  108. data/lib/selenium/webdriver/remote/http/default.rb +1 -0
  109. data/lib/selenium/webdriver/remote/response.rb +0 -1
  110. data/lib/selenium/webdriver/remote.rb +0 -1
  111. data/lib/selenium/webdriver/safari/driver.rb +7 -1
  112. data/lib/selenium/webdriver/safari/features.rb +0 -2
  113. data/lib/selenium/webdriver/safari/options.rb +5 -1
  114. data/lib/selenium/webdriver/safari/service.rb +0 -4
  115. data/lib/selenium/webdriver/safari.rb +1 -1
  116. data/lib/selenium/webdriver/support/color.rb +15 -15
  117. data/lib/selenium/webdriver/support/guards/guard.rb +0 -2
  118. data/lib/selenium/webdriver/support/guards/guard_condition.rb +0 -2
  119. data/lib/selenium/webdriver/support/relative_locator.rb +0 -1
  120. data/lib/selenium/webdriver/support/select.rb +2 -5
  121. data/lib/selenium/webdriver/version.rb +1 -1
  122. data/lib/selenium/webdriver.rb +3 -4
  123. data/selenium-webdriver.gemspec +8 -9
  124. metadata +33 -74
  125. data/lib/selenium/webdriver/support/cdp/domain.rb.erb +0 -63
  126. data/lib/selenium/webdriver/support/cdp_client_generator.rb +0 -108
@@ -42,30 +42,13 @@ module Selenium
42
42
  # @return [ActionBuilder] A self reference.
43
43
  #
44
44
 
45
- def initialize(bridge, deprecated_mouse = nil, deprecated_keyboard = nil, deprecated_async = nil,
46
- devices: [], async: false, duration: 250)
45
+ def initialize(bridge, devices: [], async: false, duration: 250)
47
46
  @bridge = bridge
48
47
  @duration = duration
49
-
50
- @async = if deprecated_async.nil?
51
- async
52
- else
53
- WebDriver.logger.deprecate('initializing ActionBuilder with async parameter',
54
- ':async keyword',
55
- id: :action_async)
56
- deprecated_async
57
- end
58
-
48
+ @async = async
59
49
  @devices = []
60
- if deprecated_keyboard || deprecated_mouse
61
- WebDriver.logger.deprecate "initializing ActionBuilder with keyboard and mouse parameters",
62
- "devices keyword or, even better, Driver#action",
63
- id: :action_devices
64
- add_input(deprecated_mouse)
65
- add_input(deprecated_keyboard)
66
- else
67
- Array(devices).each { |device| add_input(device) }
68
- end
50
+
51
+ Array(devices).each { |device| add_input(device) }
69
52
  end
70
53
 
71
54
  #
@@ -118,20 +101,6 @@ module Selenium
118
101
  add_input(Interactions.wheel(name))
119
102
  end
120
103
 
121
- #
122
- # Retrieves the input device for the given name
123
- #
124
- # @param [String] name name of the input device
125
- # @return [Selenium::WebDriver::Interactions::InputDevice] input device with given name
126
- #
127
-
128
- def get_device(name)
129
- WebDriver.logger.deprecate('#get_device with name parameter',
130
- '#device with :name or :type keyword',
131
- id: :get_device)
132
- device(name: name)
133
- end
134
-
135
104
  #
136
105
  # Retrieves the input device for the given name or type
137
106
  #
@@ -194,11 +163,9 @@ module Selenium
194
163
  # @return [ActionBuilder] A self reference.
195
164
  #
196
165
 
197
- def pause(deprecated_device = nil, deprecated_duration = nil, device: nil, duration: 0)
198
- deprecate_method(deprecated_device, deprecated_duration)
199
-
200
- device ||= deprecated_device || pointer_input
201
- device.create_pause(deprecated_duration || duration)
166
+ def pause(device: nil, duration: 0)
167
+ device ||= pointer_input
168
+ device.create_pause(duration)
202
169
  self
203
170
  end
204
171
 
@@ -218,13 +185,10 @@ module Selenium
218
185
  # @return [ActionBuilder] A self reference.
219
186
  #
220
187
 
221
- def pauses(deprecated_device = nil, deprecated_number = nil, deprecated_duration = nil,
222
- device: nil, number: nil, duration: 0)
223
- deprecate_method(deprecated_device, deprecated_duration, deprecated_number, method: :pauses)
224
-
225
- number ||= deprecated_number || 2
226
- device ||= deprecated_device || pointer_input
227
- duration ||= deprecated_duration || 0
188
+ def pauses(device: nil, number: nil, duration: 0)
189
+ number ||= 2
190
+ device ||= pointer_input
191
+ duration ||= 0
228
192
 
229
193
  number.times { device.create_pause(duration) }
230
194
  self
@@ -294,7 +258,6 @@ module Selenium
294
258
  ':device, :duration, :number keywords',
295
259
  id: method
296
260
  end
297
-
298
261
  end # ActionBuilder
299
262
  end # WebDriver
300
263
  end # Selenium
@@ -0,0 +1,124 @@
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
+ #
23
+ # @api private
24
+ #
25
+
26
+ class ChildProcess
27
+ TimeoutError = Class.new(StandardError)
28
+
29
+ SIGTERM = 'TERM'
30
+ SIGKILL = 'KILL'
31
+
32
+ POLL_INTERVAL = 0.1
33
+
34
+ attr_accessor :detach
35
+ attr_writer :io
36
+
37
+ def self.build(*command)
38
+ new(*command)
39
+ end
40
+
41
+ def initialize(*command)
42
+ @command = command
43
+ @detach = false
44
+ @pid = nil
45
+ @status = nil
46
+ end
47
+
48
+ def io
49
+ @io ||= Platform.null_device
50
+ end
51
+
52
+ def start
53
+ options = {%i[out err] => io}
54
+ options[:pgroup] = true unless Platform.windows? # NOTE: this is a bug only in Windows 7
55
+
56
+ WebDriver.logger.debug("Starting process: #{@command} with #{options}")
57
+ @pid = Process.spawn(*@command, options)
58
+ WebDriver.logger.debug(" -> pid: #{@pid}")
59
+
60
+ Process.detach(@pid) if detach
61
+ end
62
+
63
+ def stop(timeout = 3)
64
+ return unless @pid
65
+ return if exited?
66
+
67
+ WebDriver.logger.debug("Sending TERM to process: #{@pid}")
68
+ terminate(@pid)
69
+ poll_for_exit(timeout)
70
+
71
+ WebDriver.logger.debug(" -> stopped #{@pid}")
72
+ rescue TimeoutError, Errno::EINVAL
73
+ WebDriver.logger.debug(" -> sending KILL to process: #{@pid}")
74
+ kill(@pid)
75
+ wait
76
+ WebDriver.logger.debug(" -> killed #{@pid}")
77
+ end
78
+
79
+ def alive?
80
+ @pid && !exited?
81
+ end
82
+
83
+ def exited?
84
+ return unless @pid
85
+
86
+ WebDriver.logger.debug("Checking if #{@pid} is exited:")
87
+ _, @status = Process.waitpid2(@pid, Process::WNOHANG | Process::WUNTRACED) if @status.nil?
88
+ return if @status.nil?
89
+
90
+ exit_code = @status.exitstatus || @status.termsig
91
+ WebDriver.logger.debug(" -> exit code is #{exit_code.inspect}")
92
+
93
+ !!exit_code
94
+ end
95
+
96
+ def poll_for_exit(timeout)
97
+ WebDriver.logger.debug("Polling #{timeout} seconds for exit of #{@pid}")
98
+
99
+ end_time = Time.now + timeout
100
+ sleep POLL_INTERVAL until exited? || Time.now > end_time
101
+
102
+ raise TimeoutError, " -> #{@pid} still alive after #{timeout} seconds" unless exited?
103
+ end
104
+
105
+ def wait
106
+ return if exited?
107
+
108
+ _, @status = Process.waitpid2(@pid)
109
+ end
110
+
111
+ private
112
+
113
+ def terminate(pid)
114
+ Process.kill(SIGTERM, pid)
115
+ end
116
+
117
+ def kill(pid)
118
+ Process.kill(SIGKILL, pid)
119
+ rescue Errno::ECHILD, Errno::ESRCH
120
+ # already dead
121
+ end
122
+ end # ChildProcess
123
+ end # WebDriver
124
+ end # Selenium
@@ -51,7 +51,7 @@ module Selenium
51
51
  Safari::Driver.new(**opts)
52
52
  when :firefox, :ff
53
53
  Firefox::Driver.new(**opts)
54
- when :edge
54
+ when :edge, :microsoftedge, :msedge
55
55
  Edge::Driver.new(**opts)
56
56
  when :remote
57
57
  Remote::Driver.new(**opts)
@@ -69,8 +69,8 @@ module Selenium
69
69
  #
70
70
 
71
71
  def initialize(bridge: nil, listener: nil, **opts)
72
- @service = nil
73
72
  @devtools = nil
73
+ @bidi = nil
74
74
  bridge ||= create_bridge(**opts)
75
75
  add_extensions(bridge.browser)
76
76
  @bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
@@ -127,14 +127,6 @@ module Selenium
127
127
  bridge.action(**opts)
128
128
  end
129
129
 
130
- def mouse
131
- bridge.mouse
132
- end
133
-
134
- def keyboard
135
- bridge.keyboard
136
- end
137
-
138
130
  #
139
131
  # Opens the specified URL in the browser.
140
132
  #
@@ -180,8 +172,9 @@ module Selenium
180
172
  def quit
181
173
  bridge.quit
182
174
  ensure
183
- @service&.stop
175
+ @service_manager&.stop
184
176
  @devtools&.close
177
+ @bidi&.close
185
178
  end
186
179
 
187
180
  #
@@ -189,7 +182,10 @@ module Selenium
189
182
  #
190
183
 
191
184
  def close
192
- bridge.close
185
+ # If no top-level browsing contexts are open after calling close,
186
+ # it indicates that the WebDriver session is closed.
187
+ # If the WebDriver session is closed, the BiDi session also needs to be closed.
188
+ bridge.close.tap { |handles| @bidi&.close if handles&.empty? }
193
189
  end
194
190
 
195
191
  #
@@ -263,19 +259,19 @@ module Selenium
263
259
  # driver.first(id: 'foo')
264
260
  #
265
261
 
266
- alias_method :first, :find_element
262
+ alias first find_element
267
263
 
268
264
  #
269
265
  # driver.all(class: 'bar') #=> [#<WebDriver::Element:0x1011c3b88, ...]
270
266
  #
271
267
 
272
- alias_method :all, :find_elements
268
+ alias all find_elements
273
269
 
274
270
  #
275
271
  # driver.script('function() { ... };')
276
272
  #
277
273
 
278
- alias_method :script, :execute_script
274
+ alias script execute_script
279
275
 
280
276
  # Get the first element matching the given selector. If given a
281
277
  # String or Symbol, it will be used as the id of the element.
@@ -316,30 +312,27 @@ module Selenium
316
312
 
317
313
  attr_reader :bridge
318
314
 
319
- def create_bridge(capabilities: nil, options: nil, url: nil, service: nil, http_client: nil)
320
- Remote::Bridge.new(http_client: http_client,
321
- url: url || service_url(service)).tap do |bridge|
322
- generated_caps = options ? options.as_json : generate_capabilities(capabilities)
323
- bridge.create_session(generated_caps)
315
+ def create_bridge(caps:, url:, http_client: nil)
316
+ Remote::Bridge.new(http_client: http_client, url: url).tap do |bridge|
317
+ bridge.create_session(caps)
324
318
  end
325
319
  end
326
320
 
327
321
  def generate_capabilities(capabilities)
328
322
  Array(capabilities).map { |cap|
329
323
  if cap.is_a? Symbol
330
- cap = Remote::Capabilities.send(cap)
324
+ cap = WebDriver::Options.send(cap)
331
325
  elsif !cap.respond_to? :as_json
332
326
  msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not"
333
327
  raise ArgumentError, msg
334
328
  end
335
329
  cap.as_json
336
- }.inject(:merge) || Remote::Capabilities.send(browser || :new)
330
+ }.inject(:merge)
337
331
  end
338
332
 
339
333
  def service_url(service)
340
- service ||= Service.send(browser)
341
- @service = service.launch
342
- @service.uri
334
+ @service_manager = service.launch
335
+ @service_manager.uri
343
336
  end
344
337
 
345
338
  def screenshot
@@ -349,11 +342,13 @@ module Selenium
349
342
  def add_extensions(browser)
350
343
  extensions = case browser
351
344
  when :chrome, :msedge
352
- Chrome::Driver::EXTENSIONS
345
+ Chromium::Driver::EXTENSIONS
353
346
  when :firefox
354
347
  Firefox::Driver::EXTENSIONS
355
348
  when :safari, :safari_technology_preview
356
349
  Safari::Driver::EXTENSIONS
350
+ when :ie, :internet_explorer
351
+ IE::Driver::EXTENSIONS
357
352
  else
358
353
  []
359
354
  end
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module DownloadsFiles
24
-
25
24
  #
26
25
  # Sets download path for Chromium.
27
26
  #
@@ -38,7 +37,6 @@ module Selenium
38
37
  }
39
38
  @bridge.send_command(params)
40
39
  end
41
-
42
40
  end # DownloadsFiles
43
41
  end # DriverExtensions
44
42
  end # WebDriver
@@ -36,7 +36,6 @@ module Selenium
36
36
  def full_screenshot
37
37
  @bridge.full_screenshot
38
38
  end
39
-
40
39
  end # FullPageScreenshot
41
40
  end # DriverExtensions
42
41
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasAddons
24
-
25
24
  #
26
25
  # Installs addon.
27
26
  #
@@ -43,7 +42,6 @@ module Selenium
43
42
  def uninstall_addon(id)
44
43
  @bridge.uninstall_addon(id)
45
44
  end
46
-
47
45
  end # HasAddons
48
46
  end # DriverExtensions
49
47
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasApplePermissions
24
-
25
24
  #
26
25
  # Returns permissions.
27
26
  #
@@ -44,7 +43,6 @@ module Selenium
44
43
  def permissions=(permissions)
45
44
  @bridge.permissions = permissions
46
45
  end
47
-
48
46
  end # HasPermissions
49
47
  end # DriverExtensions
50
48
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasAuthentication
24
-
25
24
  #
26
25
  # Registers basic authentication handler which is automatically
27
26
  # used whenever browser gets an authentication required response.
@@ -82,7 +81,6 @@ module Selenium
82
81
  )
83
82
  end
84
83
  end
85
-
86
84
  end # HasAuthentication
87
85
  end # DriverExtensions
88
86
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasBiDi
24
-
25
24
  #
26
25
  # Retrieves WebDriver BiDi connection.
27
26
  #
@@ -31,7 +30,6 @@ module Selenium
31
30
  def bidi
32
31
  @bidi ||= Selenium::WebDriver::BiDi.new(url: capabilities[:web_socket_url])
33
32
  end
34
-
35
33
  end # HasBiDi
36
34
  end # DriverExtensions
37
35
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasCasting
24
-
25
24
  #
26
25
  # What devices ("sinks") are available to be cast to.
27
26
  #
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasCDP
24
-
25
24
  #
26
25
  # Returns network conditions.
27
26
  #
@@ -31,7 +30,6 @@ module Selenium
31
30
  def execute_cdp(cmd, **params)
32
31
  @bridge.send_command(cmd: cmd, params: params)
33
32
  end
34
-
35
33
  end # HasCDP
36
34
  end # DriverExtensions
37
35
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasContext
24
-
25
24
  #
26
25
  # Sets the context that Selenium commands are running in using
27
26
  # a `with` statement. The state of the context on the server is
@@ -37,7 +36,6 @@ module Selenium
37
36
  def context
38
37
  @bridge.context
39
38
  end
40
-
41
39
  end # HasContext
42
40
  end # DriverExtensions
43
41
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasDebugger
24
-
25
24
  #
26
25
  # Attaches debugger to session.
27
26
  #
@@ -35,7 +34,6 @@ module Selenium
35
34
  def attach_debugger
36
35
  @bridge.attach_debugger
37
36
  end
38
-
39
37
  end # HasDebugger
40
38
  end # DriverExtensions
41
39
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasDevTools
24
-
25
24
  #
26
25
  # Retrieves connection to DevTools.
27
26
  #
@@ -36,7 +35,6 @@ module Selenium
36
35
  Selenium::WebDriver::DevTools.new(url: devtools_url)
37
36
  end
38
37
  end
39
-
40
38
  end # HasDevTools
41
39
  end # DriverExtensions
42
40
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasLaunching
24
-
25
24
  #
26
25
  # Launches Chromium app specified by id.
27
26
  #
@@ -31,7 +30,6 @@ module Selenium
31
30
  def launch_app(id)
32
31
  @bridge.launch_app(id)
33
32
  end
34
-
35
33
  end # HasLaunching
36
34
  end # DriverExtensions
37
35
  end # WebDriver
@@ -29,8 +29,7 @@ module Selenium
29
29
  def location=(*)
30
30
  raise Error::UnsupportedOperationError, 'The W3C standard does not currently support setting location'
31
31
  end
32
- alias_method :set_location, :location
33
-
32
+ alias set_location location
34
33
  end # HasLocation
35
34
  end # DriverExtensions
36
35
  end # WebDriver
@@ -137,7 +137,6 @@ module Selenium
137
137
  def mutation_listener
138
138
  @mutation_listener ||= read_atom(:mutationListener)
139
139
  end
140
-
141
140
  end # HasLogEvents
142
141
  end # DriverExtensions
143
142
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasNetworkConditions
24
-
25
24
  #
26
25
  # Returns network conditions.
27
26
  #
@@ -61,7 +60,6 @@ module Selenium
61
60
  def delete_network_conditions
62
61
  @bridge.delete_network_conditions
63
62
  end
64
-
65
63
  end # HasNetworkConditions
66
64
  end # DriverExtensions
67
65
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasNetworkInterception
24
-
25
24
  #
26
25
  # Intercepts requests coming from browser allowing
27
26
  # to either pass them through like proxy or provide
@@ -64,7 +63,6 @@ module Selenium
64
63
  @interceptor ||= DevTools::NetworkInterceptor.new(devtools)
65
64
  @interceptor.intercept(&block)
66
65
  end
67
-
68
66
  end # HasNetworkInterception
69
67
  end # DriverExtensions
70
68
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasPermissions
24
-
25
24
  #
26
25
  # Set one permission.
27
26
  #
@@ -44,7 +43,6 @@ module Selenium
44
43
  @bridge.set_permission(key, value)
45
44
  end
46
45
  end
47
-
48
46
  end # HasPermissions
49
47
  end # DriverExtensions
50
48
  end # WebDriver
@@ -21,7 +21,6 @@ module Selenium
21
21
  module WebDriver
22
22
  module DriverExtensions
23
23
  module HasPinnedScripts
24
-
25
24
  #
26
25
  # Returns the list of all pinned scripts.
27
26
  #
@@ -70,7 +69,6 @@ module Selenium
70
69
  devtools.page.remove_script_to_evaluate_on_new_document(identifier: script.devtools_identifier)
71
70
  pinned_scripts.delete(script)
72
71
  end
73
-
74
72
  end # HasPinnedScripts
75
73
  end # DriverExtensions
76
74
  end # WebDriver
@@ -0,0 +1,43 @@
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 DriverFinder
23
+ def self.path(options, klass)
24
+ path = klass.driver_path
25
+ path = path.call if path.is_a?(Proc)
26
+ path ||= Platform.find_binary(klass::EXECUTABLE)
27
+
28
+ path ||= begin
29
+ SeleniumManager.driver_path(options)
30
+ rescue StandardError => e
31
+ WebDriver.logger.warn("Unable obtain driver using Selenium Manager\n #{e.message}")
32
+ nil
33
+ end
34
+ msg = "Unable to locate the #{klass::EXECUTABLE} executable; for more information on how to install drivers, " \
35
+ 'see https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers/'
36
+ raise Error::WebDriverError, msg unless path
37
+
38
+ Platform.assert_executable path
39
+ path
40
+ end
41
+ end
42
+ end
43
+ end