selenium-webdriver 4.5.0 → 4.14.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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +191 -1
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/NOTICE +1 -1
  6. data/README.md +2 -2
  7. data/bin/linux/selenium-manager +0 -0
  8. data/bin/macos/selenium-manager +0 -0
  9. data/bin/windows/selenium-manager.exe +0 -0
  10. data/lib/selenium/server.rb +8 -22
  11. data/lib/selenium/webdriver/atoms/findElements.js +3 -4
  12. data/lib/selenium/webdriver/atoms/getAttribute.js +0 -0
  13. data/lib/selenium/webdriver/atoms/isDisplayed.js +0 -0
  14. data/lib/selenium/webdriver/atoms/mutationListener.js +0 -0
  15. data/lib/selenium/webdriver/atoms.rb +5 -3
  16. data/lib/selenium/webdriver/bidi/browsing_context.rb +88 -0
  17. data/lib/selenium/webdriver/{common/driver_extensions/has_network_connection.rb → bidi/browsing_context_info.rb} +10 -12
  18. data/lib/selenium/webdriver/bidi/log/base_log_entry.rb +35 -0
  19. data/lib/selenium/webdriver/bidi/log/console_log_entry.rb +35 -0
  20. data/lib/selenium/webdriver/{common/driver_extensions/has_location.rb → bidi/log/filter_by.rb} +14 -11
  21. data/lib/selenium/webdriver/bidi/log/generic_log_entry.rb +33 -0
  22. data/lib/selenium/webdriver/bidi/log/javascript_log_entry.rb +33 -0
  23. data/lib/selenium/webdriver/bidi/log_inspector.rb +143 -0
  24. data/lib/selenium/webdriver/bidi/navigate_result.rb +33 -0
  25. data/lib/selenium/webdriver/bidi/session.rb +13 -0
  26. data/lib/selenium/webdriver/bidi.rb +3 -2
  27. data/lib/selenium/webdriver/chrome/driver.rb +9 -30
  28. data/lib/selenium/webdriver/chrome/features.rb +5 -72
  29. data/lib/selenium/webdriver/chrome/options.rb +3 -237
  30. data/lib/selenium/webdriver/chrome/profile.rb +3 -83
  31. data/lib/selenium/webdriver/chrome/service.rb +4 -19
  32. data/lib/selenium/webdriver/chrome.rb +0 -2
  33. data/lib/selenium/webdriver/chromium/driver.rb +60 -0
  34. data/lib/selenium/webdriver/chromium/features.rb +103 -0
  35. data/lib/selenium/webdriver/chromium/options.rb +243 -0
  36. data/lib/selenium/webdriver/chromium/profile.rb +113 -0
  37. data/lib/selenium/webdriver/chromium.rb +29 -0
  38. data/lib/selenium/webdriver/common/action_builder.rb +11 -58
  39. data/lib/selenium/webdriver/common/child_process.rb +124 -0
  40. data/lib/selenium/webdriver/common/driver.rb +19 -36
  41. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
  42. data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +0 -1
  43. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
  44. data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +0 -2
  45. data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +0 -2
  46. data/lib/selenium/webdriver/common/driver_extensions/has_bidi.rb +0 -2
  47. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +0 -1
  48. data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +0 -2
  49. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +0 -2
  50. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
  51. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +0 -2
  52. data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +0 -2
  53. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +0 -1
  54. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -2
  55. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +0 -2
  56. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +0 -2
  57. data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +0 -2
  58. data/lib/selenium/webdriver/common/driver_finder.rb +45 -0
  59. data/lib/selenium/webdriver/common/element.rb +6 -6
  60. data/lib/selenium/webdriver/common/error.rb +27 -4
  61. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +2 -2
  62. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +3 -3
  63. data/lib/selenium/webdriver/common/interactions/pointer_move.rb +2 -2
  64. data/lib/selenium/webdriver/common/interactions/scroll.rb +7 -5
  65. data/lib/selenium/webdriver/common/local_driver.rb +46 -0
  66. data/lib/selenium/webdriver/common/logger.rb +90 -25
  67. data/lib/selenium/webdriver/common/options.rb +11 -8
  68. data/lib/selenium/webdriver/common/platform.rb +4 -49
  69. data/lib/selenium/webdriver/common/port_prober.rb +1 -1
  70. data/lib/selenium/webdriver/common/profile_helper.rb +1 -1
  71. data/lib/selenium/webdriver/common/proxy.rb +2 -2
  72. data/lib/selenium/webdriver/common/selenium_manager.rb +134 -0
  73. data/lib/selenium/webdriver/common/service.rb +21 -30
  74. data/lib/selenium/webdriver/common/service_manager.rb +6 -12
  75. data/lib/selenium/webdriver/common/shadow_root.rb +1 -2
  76. data/lib/selenium/webdriver/common/socket_lock.rb +3 -3
  77. data/lib/selenium/webdriver/common/socket_poller.rb +1 -1
  78. data/lib/selenium/webdriver/common/takes_screenshot.rb +2 -3
  79. data/lib/selenium/webdriver/common/target_locator.rb +2 -3
  80. data/lib/selenium/webdriver/common/timeouts.rb +2 -2
  81. data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +8 -6
  82. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +0 -1
  83. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +16 -16
  84. data/lib/selenium/webdriver/common/websocket_connection.rb +12 -4
  85. data/lib/selenium/webdriver/common.rb +4 -2
  86. data/lib/selenium/webdriver/devtools/console_event.rb +0 -2
  87. data/lib/selenium/webdriver/devtools/exception_event.rb +0 -2
  88. data/lib/selenium/webdriver/devtools/mutation_event.rb +0 -2
  89. data/lib/selenium/webdriver/devtools/network_interceptor.rb +4 -7
  90. data/lib/selenium/webdriver/devtools/pinned_script.rb +0 -2
  91. data/lib/selenium/webdriver/devtools/request.rb +0 -2
  92. data/lib/selenium/webdriver/devtools/response.rb +0 -2
  93. data/lib/selenium/webdriver/devtools.rb +11 -2
  94. data/lib/selenium/webdriver/edge/driver.rb +9 -3
  95. data/lib/selenium/webdriver/edge/features.rb +3 -4
  96. data/lib/selenium/webdriver/edge/options.rb +17 -5
  97. data/lib/selenium/webdriver/edge/profile.rb +2 -2
  98. data/lib/selenium/webdriver/edge/service.rb +8 -7
  99. data/lib/selenium/webdriver/edge.rb +0 -2
  100. data/lib/selenium/webdriver/firefox/driver.rb +8 -2
  101. data/lib/selenium/webdriver/firefox/features.rb +0 -1
  102. data/lib/selenium/webdriver/firefox/options.rb +2 -14
  103. data/lib/selenium/webdriver/firefox/profile.rb +7 -7
  104. data/lib/selenium/webdriver/firefox/service.rb +0 -18
  105. data/lib/selenium/webdriver/ie/driver.rb +7 -1
  106. data/lib/selenium/webdriver/ie/options.rb +4 -3
  107. data/lib/selenium/webdriver/ie/service.rb +0 -22
  108. data/lib/selenium/webdriver/remote/{commands.rb → bridge/commands.rb} +0 -2
  109. data/lib/selenium/webdriver/remote/bridge.rb +15 -20
  110. data/lib/selenium/webdriver/remote/capabilities.rb +3 -53
  111. data/lib/selenium/webdriver/remote/driver.rb +31 -13
  112. data/lib/selenium/webdriver/remote/http/common.rb +3 -3
  113. data/lib/selenium/webdriver/remote/http/curb.rb +1 -3
  114. data/lib/selenium/webdriver/remote/http/default.rb +2 -2
  115. data/lib/selenium/webdriver/remote/response.rb +0 -1
  116. data/lib/selenium/webdriver/remote/server_error.rb +1 -1
  117. data/lib/selenium/webdriver/remote.rb +0 -1
  118. data/lib/selenium/webdriver/safari/driver.rb +7 -1
  119. data/lib/selenium/webdriver/safari/features.rb +0 -2
  120. data/lib/selenium/webdriver/safari/options.rb +5 -1
  121. data/lib/selenium/webdriver/safari/service.rb +10 -4
  122. data/lib/selenium/webdriver/safari.rb +1 -1
  123. data/lib/selenium/webdriver/support/color.rb +17 -17
  124. data/lib/selenium/webdriver/support/guards/guard.rb +0 -2
  125. data/lib/selenium/webdriver/support/guards/guard_condition.rb +0 -2
  126. data/lib/selenium/webdriver/support/relative_locator.rb +0 -1
  127. data/lib/selenium/webdriver/support/select.rb +2 -5
  128. data/lib/selenium/webdriver/version.rb +1 -1
  129. data/lib/selenium/webdriver.rb +5 -4
  130. data/selenium-webdriver.gemspec +10 -11
  131. metadata +40 -84
  132. data/lib/selenium/webdriver/support/cdp/domain.rb.erb +0 -63
  133. data/lib/selenium/webdriver/support/cdp_client_generator.rb +0 -108
@@ -33,8 +33,6 @@ module Selenium
33
33
  # correctly when using asynchronous.
34
34
  #
35
35
  # @param [Selenium::WebDriver::Remote::Bridge] bridge the bridge for the current driver instance.
36
- # @param [Selenium::WebDriver::Interactions::PointerInput] deprecated_mouse PointerInput for the mouse.
37
- # @param [Selenium::WebDriver::Interactions::KeyInput] deprecated_keyboard KeyInput for the keyboard.
38
36
  # @param [Boolean] deprecated_async Whether to perform the actions asynchronously per device.
39
37
  # Defaults to false for backwards compatibility.
40
38
  # @param [Array<Selenium::WebDriver::Interactions::InputDevices>] devices list of valid sources of input.
@@ -42,30 +40,13 @@ module Selenium
42
40
  # @return [ActionBuilder] A self reference.
43
41
  #
44
42
 
45
- def initialize(bridge, deprecated_mouse = nil, deprecated_keyboard = nil, deprecated_async = nil,
46
- devices: [], async: false, duration: 250)
43
+ def initialize(bridge, devices: [], async: false, duration: 250)
47
44
  @bridge = bridge
48
45
  @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
-
46
+ @async = async
59
47
  @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
48
+
49
+ Array(devices).each { |device| add_input(device) }
69
50
  end
70
51
 
71
52
  #
@@ -118,20 +99,6 @@ module Selenium
118
99
  add_input(Interactions.wheel(name))
119
100
  end
120
101
 
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
102
  #
136
103
  # Retrieves the input device for the given name or type
137
104
  #
@@ -194,11 +161,9 @@ module Selenium
194
161
  # @return [ActionBuilder] A self reference.
195
162
  #
196
163
 
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)
164
+ def pause(device: nil, duration: 0)
165
+ device ||= pointer_input
166
+ device.create_pause(duration)
202
167
  self
203
168
  end
204
169
 
@@ -218,13 +183,10 @@ module Selenium
218
183
  # @return [ActionBuilder] A self reference.
219
184
  #
220
185
 
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
186
+ def pauses(device: nil, number: nil, duration: 0)
187
+ number ||= 2
188
+ device ||= pointer_input
189
+ duration ||= 0
228
190
 
229
191
  number.times { device.create_pause(duration) }
230
192
  self
@@ -286,15 +248,6 @@ module Selenium
286
248
  @devices << device
287
249
  device
288
250
  end
289
-
290
- def deprecate_method(device = nil, duration = nil, number = nil, method: :pause)
291
- return unless device || number || duration
292
-
293
- WebDriver.logger.deprecate "ActionBuilder##{method} with ordered parameters",
294
- ':device, :duration, :number keywords',
295
- id: method
296
- end
297
-
298
251
  end # ActionBuilder
299
252
  end # WebDriver
300
253
  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}", id: :process)
57
+ @pid = Process.spawn(*@command, options)
58
+ WebDriver.logger.debug(" -> pid: #{@pid}", id: :process)
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}", id: :process)
68
+ terminate(@pid)
69
+ poll_for_exit(timeout)
70
+
71
+ WebDriver.logger.debug(" -> stopped #{@pid}", id: :process)
72
+ rescue TimeoutError, Errno::EINVAL
73
+ WebDriver.logger.debug(" -> sending KILL to process: #{@pid}", id: :process)
74
+ kill(@pid)
75
+ wait
76
+ WebDriver.logger.debug(" -> killed #{@pid}", id: :process)
77
+ end
78
+
79
+ def alive?
80
+ @pid && !exited?
81
+ end
82
+
83
+ def exited?
84
+ return false unless @pid
85
+
86
+ WebDriver.logger.debug("Checking if #{@pid} is exited:", id: :process)
87
+ _, @status = Process.waitpid2(@pid, Process::WNOHANG | Process::WUNTRACED) if @status.nil?
88
+ return false if @status.nil?
89
+
90
+ exit_code = @status.exitstatus || @status.termsig
91
+ WebDriver.logger.debug(" -> exit code is #{exit_code.inspect}", id: :process)
92
+
93
+ !!exit_code
94
+ end
95
+
96
+ def poll_for_exit(timeout)
97
+ WebDriver.logger.debug("Polling #{timeout} seconds for exit of #{@pid}", id: :process)
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,15 @@ 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
- def generate_capabilities(capabilities)
328
- Array(capabilities).map { |cap|
329
- if cap.is_a? Symbol
330
- cap = Remote::Capabilities.send(cap)
331
- elsif !cap.respond_to? :as_json
332
- msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not"
333
- raise ArgumentError, msg
334
- end
335
- cap.as_json
336
- }.inject(:merge) || Remote::Capabilities.send(browser || :new)
337
- end
338
-
339
321
  def service_url(service)
340
- service ||= Service.send(browser)
341
- @service = service.launch
342
- @service.uri
322
+ @service_manager = service.launch
323
+ @service_manager.uri
343
324
  end
344
325
 
345
326
  def screenshot
@@ -349,11 +330,13 @@ module Selenium
349
330
  def add_extensions(browser)
350
331
  extensions = case browser
351
332
  when :chrome, :msedge
352
- Chrome::Driver::EXTENSIONS
333
+ Chromium::Driver::EXTENSIONS
353
334
  when :firefox
354
335
  Firefox::Driver::EXTENSIONS
355
336
  when :safari, :safari_technology_preview
356
337
  Safari::Driver::EXTENSIONS
338
+ when :ie, :internet_explorer
339
+ IE::Driver::EXTENSIONS
357
340
  else
358
341
  []
359
342
  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
@@ -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,45 @@
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
+
27
+ path ||= begin
28
+ SeleniumManager.driver_path(options) unless options.is_a?(Remote::Capabilities)
29
+ rescue StandardError => e
30
+ raise Error::NoSuchDriverError, "Unable to obtain #{klass::EXECUTABLE} using Selenium Manager; #{e.message}"
31
+ end
32
+
33
+ begin
34
+ Platform.assert_executable(path)
35
+ rescue TypeError
36
+ raise Error::NoSuchDriverError, "Unable to locate or obtain #{klass::EXECUTABLE}"
37
+ rescue Error::WebDriverError => e
38
+ raise Error::NoSuchDriverError, "#{klass::EXECUTABLE} located, but: #{e.message}"
39
+ end
40
+
41
+ path
42
+ end
43
+ end
44
+ end
45
+ end