selenium-webdriver 4.1.0 → 4.28.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.
- checksums.yaml +4 -4
- data/CHANGES +446 -1
- data/Gemfile +4 -0
- data/LICENSE +1 -1
- data/NOTICE +1 -1
- data/README.md +3 -3
- data/bin/linux/selenium-manager +0 -0
- data/bin/macos/selenium-manager +0 -0
- data/bin/windows/selenium-manager.exe +0 -0
- data/lib/selenium/server.rb +41 -43
- data/lib/selenium/webdriver/atoms/findElements.js +52 -50
- data/lib/selenium/webdriver/atoms/getAttribute.js +6 -100
- data/lib/selenium/webdriver/atoms/isDisplayed.js +24 -96
- data/lib/selenium/webdriver/atoms/mutationListener.js +0 -0
- data/lib/selenium/webdriver/atoms.rb +5 -3
- data/lib/selenium/webdriver/bidi/browsing_context.rb +100 -0
- data/lib/selenium/webdriver/bidi/log/base_log_entry.rb +35 -0
- data/lib/selenium/webdriver/bidi/log/console_log_entry.rb +35 -0
- data/lib/selenium/webdriver/{common/driver_extensions/has_location.rb → bidi/log/filter_by.rb} +14 -11
- data/lib/selenium/webdriver/bidi/log/generic_log_entry.rb +33 -0
- data/lib/selenium/webdriver/bidi/log/javascript_log_entry.rb +33 -0
- data/lib/selenium/webdriver/bidi/log_handler.rb +65 -0
- data/lib/selenium/webdriver/bidi/log_inspector.rb +147 -0
- data/lib/selenium/webdriver/bidi/network.rb +82 -0
- data/lib/selenium/webdriver/bidi/session.rb +51 -0
- data/lib/selenium/webdriver/bidi/struct.rb +42 -0
- data/lib/selenium/webdriver/bidi.rb +67 -0
- data/lib/selenium/webdriver/chrome/driver.rb +9 -29
- data/lib/selenium/webdriver/chrome/features.rb +9 -67
- data/lib/selenium/webdriver/chrome/options.rb +3 -223
- data/lib/selenium/webdriver/chrome/profile.rb +3 -83
- data/lib/selenium/webdriver/chrome/service.rb +5 -19
- data/lib/selenium/webdriver/chrome.rb +0 -16
- data/lib/selenium/webdriver/chromium/driver.rb +61 -0
- data/lib/selenium/webdriver/chromium/features.rb +99 -0
- data/lib/selenium/webdriver/chromium/options.rb +243 -0
- data/lib/selenium/webdriver/chromium/profile.rb +113 -0
- data/lib/selenium/webdriver/chromium.rb +29 -0
- data/lib/selenium/webdriver/common/action_builder.rb +60 -22
- data/lib/selenium/webdriver/common/child_process.rb +136 -0
- data/lib/selenium/webdriver/common/driver.rb +54 -89
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +0 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/{has_remote_status.rb → has_bidi.rb} +10 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +10 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +1 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_fedcm_dialog.rb +55 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_file_downloads.rb +65 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +9 -3
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +8 -68
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +1 -3
- data/lib/selenium/webdriver/common/driver_finder.rb +97 -0
- data/lib/selenium/webdriver/common/element.rb +8 -8
- data/lib/selenium/webdriver/common/error.rb +29 -4
- data/lib/selenium/webdriver/common/fedcm/account.rb +49 -0
- data/lib/selenium/webdriver/common/fedcm/dialog.rb +74 -0
- data/lib/selenium/webdriver/common/fedcm.rb +27 -0
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +2 -2
- data/lib/selenium/webdriver/common/interactions/input_device.rb +10 -4
- data/lib/selenium/webdriver/common/interactions/interaction.rb +12 -25
- data/lib/selenium/webdriver/common/interactions/interactions.rb +24 -4
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +5 -1
- data/lib/selenium/webdriver/common/interactions/key_input.rb +11 -27
- data/lib/selenium/webdriver/common/interactions/none_input.rb +10 -8
- data/lib/selenium/webdriver/common/interactions/pause.rb +49 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +59 -71
- data/lib/selenium/webdriver/common/{driver_extensions/has_network_connection.rb → interactions/pointer_cancel.rb} +19 -11
- data/lib/selenium/webdriver/common/interactions/pointer_event_properties.rb +63 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +15 -84
- data/lib/selenium/webdriver/common/interactions/pointer_move.rb +60 -0
- data/lib/selenium/webdriver/common/interactions/pointer_press.rb +85 -0
- data/lib/selenium/webdriver/common/interactions/scroll.rb +59 -0
- data/lib/selenium/webdriver/common/interactions/scroll_origin.rb +48 -0
- data/lib/selenium/webdriver/common/interactions/typing_interaction.rb +54 -0
- data/lib/selenium/webdriver/common/interactions/wheel_actions.rb +114 -0
- data/lib/selenium/webdriver/common/interactions/wheel_input.rb +42 -0
- data/lib/selenium/webdriver/common/keys.rb +1 -0
- data/lib/selenium/webdriver/common/local_driver.rb +53 -0
- data/lib/selenium/webdriver/common/logger.rb +93 -28
- data/lib/selenium/webdriver/common/manager.rb +2 -29
- data/lib/selenium/webdriver/common/network.rb +64 -0
- data/lib/selenium/webdriver/common/options.rb +19 -19
- data/lib/selenium/webdriver/common/platform.rb +12 -52
- data/lib/selenium/webdriver/common/port_prober.rb +1 -1
- data/lib/selenium/webdriver/common/profile_helper.rb +1 -1
- data/lib/selenium/webdriver/common/proxy.rb +4 -4
- data/lib/selenium/webdriver/common/script.rb +45 -0
- data/lib/selenium/webdriver/common/search_context.rb +10 -8
- data/lib/selenium/webdriver/common/selenium_manager.rb +104 -0
- data/lib/selenium/webdriver/common/service.rb +24 -26
- data/lib/selenium/webdriver/common/service_manager.rb +9 -15
- data/lib/selenium/webdriver/common/shadow_root.rb +2 -3
- data/lib/selenium/webdriver/common/socket_lock.rb +3 -3
- data/lib/selenium/webdriver/common/socket_poller.rb +3 -3
- data/lib/selenium/webdriver/common/takes_screenshot.rb +6 -5
- data/lib/selenium/webdriver/common/target_locator.rb +5 -5
- data/lib/selenium/webdriver/common/timeouts.rb +2 -2
- data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +85 -0
- data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +72 -0
- data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +62 -0
- data/lib/selenium/webdriver/common/wait.rb +1 -1
- data/lib/selenium/webdriver/common/websocket_connection.rb +176 -0
- data/lib/selenium/webdriver/common/window.rb +6 -6
- data/lib/selenium/webdriver/common/zipper.rb +1 -1
- data/lib/selenium/webdriver/common.rb +27 -5
- data/lib/selenium/webdriver/devtools/console_event.rb +0 -2
- data/lib/selenium/webdriver/devtools/exception_event.rb +0 -2
- data/lib/selenium/webdriver/devtools/mutation_event.rb +0 -2
- data/lib/selenium/webdriver/devtools/network_interceptor.rb +173 -0
- data/lib/selenium/webdriver/devtools/pinned_script.rb +0 -2
- data/lib/selenium/webdriver/devtools/request.rb +1 -3
- data/lib/selenium/webdriver/devtools/response.rb +1 -3
- data/lib/selenium/webdriver/devtools.rb +17 -114
- data/lib/selenium/webdriver/edge/driver.rb +9 -3
- data/lib/selenium/webdriver/edge/features.rb +8 -4
- data/lib/selenium/webdriver/edge/options.rb +17 -5
- data/lib/selenium/webdriver/edge/profile.rb +2 -2
- data/lib/selenium/webdriver/edge/service.rb +8 -7
- data/lib/selenium/webdriver/edge.rb +0 -2
- data/lib/selenium/webdriver/firefox/driver.rb +9 -2
- data/lib/selenium/webdriver/firefox/features.rb +11 -7
- data/lib/selenium/webdriver/firefox/options.rb +10 -16
- data/lib/selenium/webdriver/firefox/profile.rb +21 -17
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +1 -1
- data/lib/selenium/webdriver/firefox/service.rb +1 -18
- data/lib/selenium/webdriver/firefox/util.rb +46 -0
- data/lib/selenium/webdriver/firefox.rb +1 -14
- data/lib/selenium/webdriver/ie/driver.rb +7 -1
- data/lib/selenium/webdriver/ie/features.rb +34 -0
- data/lib/selenium/webdriver/ie/options.rb +6 -4
- data/lib/selenium/webdriver/ie/service.rb +1 -22
- data/lib/selenium/webdriver/ie.rb +4 -17
- data/lib/selenium/webdriver/remote/bidi_bridge.rb +66 -0
- data/lib/selenium/webdriver/remote/{commands.rb → bridge/commands.rb} +22 -9
- data/lib/selenium/webdriver/remote/bridge/locator_converter.rb +76 -0
- data/lib/selenium/webdriver/remote/bridge.rb +158 -100
- data/lib/selenium/webdriver/remote/capabilities.rb +5 -55
- data/lib/selenium/webdriver/remote/driver.rb +35 -14
- data/lib/selenium/webdriver/remote/features.rb +75 -0
- data/lib/selenium/webdriver/remote/http/common.rb +26 -6
- data/lib/selenium/webdriver/remote/http/curb.rb +10 -6
- data/lib/selenium/webdriver/remote/http/default.rb +8 -14
- data/lib/selenium/webdriver/remote/response.rb +14 -22
- data/lib/selenium/webdriver/remote/server_error.rb +2 -2
- data/lib/selenium/webdriver/remote.rb +3 -2
- data/lib/selenium/webdriver/safari/driver.rb +7 -1
- data/lib/selenium/webdriver/safari/features.rb +5 -3
- data/lib/selenium/webdriver/safari/options.rb +5 -1
- data/lib/selenium/webdriver/safari/service.rb +10 -4
- data/lib/selenium/webdriver/safari.rb +1 -15
- data/lib/selenium/webdriver/support/color.rb +22 -22
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +4 -4
- data/lib/selenium/webdriver/support/guards/guard.rb +14 -14
- data/lib/selenium/webdriver/support/guards/guard_condition.rb +1 -3
- data/lib/selenium/webdriver/support/guards.rb +4 -4
- data/lib/selenium/webdriver/support/relative_locator.rb +0 -1
- data/lib/selenium/webdriver/support/select.rb +3 -1
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +7 -5
- data/selenium-webdriver.gemspec +22 -16
- metadata +137 -47
- data/lib/selenium/webdriver/remote/http/persistent.rb +0 -65
- data/lib/selenium/webdriver/support/cdp/domain.rb.erb +0 -63
- data/lib/selenium/webdriver/support/cdp_client_generator.rb +0 -108
@@ -43,7 +43,7 @@ module Selenium
|
|
43
43
|
|
44
44
|
def for(browser, opts = {})
|
45
45
|
case browser
|
46
|
-
when :chrome
|
46
|
+
when :chrome, :chrome_headless_shell
|
47
47
|
Chrome::Driver.new(**opts)
|
48
48
|
when :internet_explorer, :ie
|
49
49
|
IE::Driver.new(**opts)
|
@@ -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,11 +69,10 @@ module Selenium
|
|
69
69
|
#
|
70
70
|
|
71
71
|
def initialize(bridge: nil, listener: nil, **opts)
|
72
|
-
@service = nil
|
73
72
|
@devtools = nil
|
74
73
|
bridge ||= create_bridge(**opts)
|
75
|
-
add_extensions(bridge.browser)
|
76
74
|
@bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
|
75
|
+
add_extensions(@bridge.browser)
|
77
76
|
end
|
78
77
|
|
79
78
|
def inspect
|
@@ -100,6 +99,22 @@ module Selenium
|
|
100
99
|
@navigate ||= WebDriver::Navigation.new(bridge)
|
101
100
|
end
|
102
101
|
|
102
|
+
#
|
103
|
+
# @return [Script]
|
104
|
+
# @see Script
|
105
|
+
#
|
106
|
+
|
107
|
+
def script(*args)
|
108
|
+
if args.any?
|
109
|
+
WebDriver.logger.deprecate('`Driver#script` as an alias for `#execute_script`',
|
110
|
+
'`Driver#execute_script`',
|
111
|
+
id: :driver_script)
|
112
|
+
execute_script(*args)
|
113
|
+
else
|
114
|
+
@script ||= WebDriver::Script.new(bridge)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
103
118
|
#
|
104
119
|
# @return [TargetLocator]
|
105
120
|
# @see TargetLocator
|
@@ -123,16 +138,8 @@ module Selenium
|
|
123
138
|
# @see ActionBuilder
|
124
139
|
#
|
125
140
|
|
126
|
-
def action
|
127
|
-
bridge.action
|
128
|
-
end
|
129
|
-
|
130
|
-
def mouse
|
131
|
-
bridge.mouse
|
132
|
-
end
|
133
|
-
|
134
|
-
def keyboard
|
135
|
-
bridge.keyboard
|
141
|
+
def action(**opts)
|
142
|
+
bridge.action(**opts)
|
136
143
|
end
|
137
144
|
|
138
145
|
#
|
@@ -180,7 +187,7 @@ module Selenium
|
|
180
187
|
def quit
|
181
188
|
bridge.quit
|
182
189
|
ensure
|
183
|
-
@
|
190
|
+
@service_manager&.stop
|
184
191
|
@devtools&.close
|
185
192
|
end
|
186
193
|
|
@@ -189,7 +196,7 @@ module Selenium
|
|
189
196
|
#
|
190
197
|
|
191
198
|
def close
|
192
|
-
bridge
|
199
|
+
bridge&.close
|
193
200
|
end
|
194
201
|
|
195
202
|
#
|
@@ -248,25 +255,37 @@ module Selenium
|
|
248
255
|
bridge.execute_async_script(script, *args)
|
249
256
|
end
|
250
257
|
|
251
|
-
|
258
|
+
#
|
259
|
+
# @return [VirtualAuthenticator]
|
260
|
+
# @see VirtualAuthenticator
|
261
|
+
#
|
262
|
+
|
263
|
+
def add_virtual_authenticator(options)
|
264
|
+
bridge.add_virtual_authenticator(options)
|
265
|
+
end
|
252
266
|
|
253
267
|
#
|
254
|
-
#
|
268
|
+
# @return [Network]
|
269
|
+
# @see Network
|
255
270
|
#
|
256
271
|
|
257
|
-
|
272
|
+
def network
|
273
|
+
@network ||= WebDriver::Network.new(bridge)
|
274
|
+
end
|
275
|
+
|
276
|
+
#-------------------------------- sugar --------------------------------
|
258
277
|
|
259
278
|
#
|
260
|
-
# driver.
|
279
|
+
# driver.first(id: 'foo')
|
261
280
|
#
|
262
281
|
|
263
|
-
|
282
|
+
alias first find_element
|
264
283
|
|
265
284
|
#
|
266
|
-
# driver.
|
285
|
+
# driver.all(class: 'bar') #=> [#<WebDriver::Element:0x1011c3b88, ...]
|
267
286
|
#
|
268
287
|
|
269
|
-
|
288
|
+
alias all find_elements
|
270
289
|
|
271
290
|
# Get the first element matching the given selector. If given a
|
272
291
|
# String or Symbol, it will be used as the id of the element.
|
@@ -287,7 +306,7 @@ module Selenium
|
|
287
306
|
end
|
288
307
|
|
289
308
|
def browser
|
290
|
-
bridge
|
309
|
+
bridge.browser
|
291
310
|
end
|
292
311
|
|
293
312
|
def capabilities
|
@@ -307,72 +326,16 @@ module Selenium
|
|
307
326
|
|
308
327
|
attr_reader :bridge
|
309
328
|
|
310
|
-
def create_bridge(
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
cap_array = caps.is_a?(Hash) ? [caps] : Array(caps)
|
315
|
-
|
316
|
-
desired_capabilities = opts.delete(:desired_capabilities)
|
317
|
-
if desired_capabilities
|
318
|
-
WebDriver.logger.deprecate(':desired_capabilities as a parameter for driver initialization',
|
319
|
-
':capabilities with an Array value of capabilities/options if necessary',
|
320
|
-
id: :desired_capabilities)
|
321
|
-
desired_capabilities = Remote::Capabilities.new(desired_capabilities) if desired_capabilities.is_a?(Hash)
|
322
|
-
cap_array << desired_capabilities
|
323
|
-
end
|
324
|
-
|
325
|
-
options = opts.delete(:options)
|
326
|
-
if options
|
327
|
-
WebDriver.logger.deprecate(':options as a parameter for driver initialization',
|
328
|
-
':capabilities with an Array of value capabilities/options if necessary',
|
329
|
-
id: :browser_options)
|
330
|
-
cap_array << options
|
329
|
+
def create_bridge(caps:, url:, http_client: nil)
|
330
|
+
klass = caps['webSocketUrl'] ? Remote::BiDiBridge : Remote::Bridge
|
331
|
+
klass.new(http_client: http_client, url: url).tap do |bridge|
|
332
|
+
bridge.create_session(caps)
|
331
333
|
end
|
332
|
-
|
333
|
-
capabilities = generate_capabilities(cap_array)
|
334
|
-
|
335
|
-
bridge_opts = {http_client: opts.delete(:http_client), url: opts.delete(:url)}
|
336
|
-
raise ArgumentError, "Unable to create a driver with parameters: #{opts}" unless opts.empty?
|
337
|
-
|
338
|
-
bridge = Remote::Bridge.new(**bridge_opts)
|
339
|
-
|
340
|
-
bridge.create_session(capabilities)
|
341
|
-
bridge
|
342
|
-
end
|
343
|
-
|
344
|
-
def generate_capabilities(cap_array)
|
345
|
-
cap_array.map { |cap|
|
346
|
-
if cap.is_a? Symbol
|
347
|
-
cap = Remote::Capabilities.send(cap)
|
348
|
-
elsif cap.is_a? Hash
|
349
|
-
new_message = 'Capabilities instance initialized with the Hash, or build values with Options class'
|
350
|
-
WebDriver.logger.deprecate("passing a Hash value to :capabilities",
|
351
|
-
new_message,
|
352
|
-
id: :capabilities_hash)
|
353
|
-
cap = Remote::Capabilities.new(cap)
|
354
|
-
elsif !cap.respond_to? :as_json
|
355
|
-
msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not"
|
356
|
-
raise ArgumentError, msg
|
357
|
-
end
|
358
|
-
cap&.as_json
|
359
|
-
}.inject(:merge) || Remote::Capabilities.send(browser || :new)
|
360
334
|
end
|
361
335
|
|
362
|
-
def service_url(
|
363
|
-
|
364
|
-
|
365
|
-
next unless opts.key? key
|
366
|
-
|
367
|
-
WebDriver.logger.deprecate(":#{key}", ':service with an instance of Selenium::WebDriver::Service',
|
368
|
-
id: "service_#{key}".to_sym)
|
369
|
-
end
|
370
|
-
service_config ||= Service.send(browser,
|
371
|
-
args: opts.delete(:driver_opts),
|
372
|
-
path: opts.delete(:driver_path),
|
373
|
-
port: opts.delete(:port))
|
374
|
-
@service = service_config.launch
|
375
|
-
@service.uri
|
336
|
+
def service_url(service)
|
337
|
+
@service_manager = service.launch
|
338
|
+
@service_manager.uri
|
376
339
|
end
|
377
340
|
|
378
341
|
def screenshot
|
@@ -381,12 +344,14 @@ module Selenium
|
|
381
344
|
|
382
345
|
def add_extensions(browser)
|
383
346
|
extensions = case browser
|
384
|
-
when :chrome, :msedge
|
385
|
-
|
347
|
+
when :chrome, :chrome_headless_shell, :msedge, :microsoftedge
|
348
|
+
Chromium::Driver::EXTENSIONS
|
386
349
|
when :firefox
|
387
350
|
Firefox::Driver::EXTENSIONS
|
388
351
|
when :safari, :safari_technology_preview
|
389
352
|
Safari::Driver::EXTENSIONS
|
353
|
+
when :ie, :internet_explorer
|
354
|
+
IE::Driver::EXTENSIONS
|
390
355
|
else
|
391
356
|
[]
|
392
357
|
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
|
@@ -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
|
@@ -20,12 +20,17 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module DriverExtensions
|
23
|
-
module
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
module HasBiDi
|
24
|
+
#
|
25
|
+
# Retrieves WebDriver BiDi connection.
|
26
|
+
#
|
27
|
+
# @return [BiDi]
|
28
|
+
#
|
29
|
+
|
30
|
+
def bidi
|
31
|
+
@bridge.bidi
|
27
32
|
end
|
28
|
-
end #
|
33
|
+
end # HasBiDi
|
29
34
|
end # DriverExtensions
|
30
35
|
end # WebDriver
|
31
36
|
end # Selenium
|
@@ -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
|
#
|
@@ -52,6 +51,16 @@ module Selenium
|
|
52
51
|
@bridge.start_cast_tab_mirroring(name)
|
53
52
|
end
|
54
53
|
|
54
|
+
#
|
55
|
+
# Starts a tab mirroring session on a specific receiver target.
|
56
|
+
#
|
57
|
+
# @param [String] name the sink to use as the target
|
58
|
+
#
|
59
|
+
|
60
|
+
def start_cast_desktop_mirroring(name)
|
61
|
+
@bridge.start_cast_desktop_mirroring(name)
|
62
|
+
end
|
63
|
+
|
55
64
|
#
|
56
65
|
# Gets error messages when there is any issue in a Cast session.
|
57
66
|
#
|
@@ -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,14 +21,12 @@ 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
|
28
27
|
# saved before entering the block, and restored upon exiting it.
|
29
28
|
#
|
30
|
-
# @param [String]
|
31
|
-
# @param [String] value what to set the permission to
|
29
|
+
# @param [String] value which context gets set (either 'chrome' or 'content')
|
32
30
|
#
|
33
31
|
|
34
32
|
def context=(value)
|
@@ -38,7 +36,6 @@ module Selenium
|
|
38
36
|
def context
|
39
37
|
@bridge.context
|
40
38
|
end
|
41
|
-
|
42
39
|
end # HasContext
|
43
40
|
end # DriverExtensions
|
44
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
|
@@ -0,0 +1,55 @@
|
|
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 HasFedCmDialog
|
24
|
+
# Disables the promise rejection delay for FedCm.
|
25
|
+
#
|
26
|
+
# FedCm by default delays promise resolution in failure cases for privacy reasons.
|
27
|
+
# This method allows turning it off to let tests run faster where this is not relevant.
|
28
|
+
def enable_fedcm_delay=(enable)
|
29
|
+
@bridge.fedcm_delay(enable)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Resets the FedCm dialog cooldown.
|
33
|
+
#
|
34
|
+
# If a user agent triggers a cooldown when the account chooser is dismissed,
|
35
|
+
# this method resets that cooldown so that the dialog can be triggered again immediately.
|
36
|
+
def reset_fedcm_cooldown
|
37
|
+
@bridge.reset_fedcm_cooldown
|
38
|
+
end
|
39
|
+
|
40
|
+
def fedcm_dialog
|
41
|
+
@fedcm_dialog ||= FedCM::Dialog.new(@bridge)
|
42
|
+
end
|
43
|
+
|
44
|
+
def wait_for_fedcm_dialog(timeout: 5, interval: 0.2, message: nil, ignore: nil)
|
45
|
+
wait = Wait.new(timeout: timeout, interval: interval, message: message, ignore: ignore)
|
46
|
+
wait.until do
|
47
|
+
fedcm_dialog if fedcm_dialog.type
|
48
|
+
rescue Error::NoSuchAlertError
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end # HasFedCmDialog
|
53
|
+
end # DriverExtensions
|
54
|
+
end # WebDriver
|
55
|
+
end # Selenium
|
@@ -0,0 +1,65 @@
|
|
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 HasFileDownloads
|
24
|
+
def downloadable_files
|
25
|
+
verify_enabled
|
26
|
+
|
27
|
+
@bridge.downloadable_files['names']
|
28
|
+
end
|
29
|
+
|
30
|
+
def download_file(file_name, target_directory)
|
31
|
+
verify_enabled
|
32
|
+
|
33
|
+
response = @bridge.download_file(file_name)
|
34
|
+
contents = response['contents']
|
35
|
+
|
36
|
+
File.open("#{file_name}.zip", 'wb') { |f| f << Base64.decode64(contents) }
|
37
|
+
target_directory += '/' unless target_directory.end_with?('/')
|
38
|
+
FileUtils.mkdir_p(target_directory)
|
39
|
+
|
40
|
+
begin
|
41
|
+
Zip::File.open("#{file_name}.zip") do |zip|
|
42
|
+
zip.each { |entry| zip.extract(entry, "#{target_directory}#{file_name}") }
|
43
|
+
end
|
44
|
+
ensure
|
45
|
+
FileUtils.rm_f("#{file_name}.zip")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def delete_downloadable_files
|
50
|
+
verify_enabled
|
51
|
+
|
52
|
+
@bridge.delete_downloadable_files
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def verify_enabled
|
58
|
+
return if capabilities['se:downloadsEnabled']
|
59
|
+
|
60
|
+
raise Error::WebDriverError, 'You must enable downloads in order to work with downloadable files.'
|
61
|
+
end
|
62
|
+
end # HasFileDownloads
|
63
|
+
end # DriverExtensions
|
64
|
+
end # WebDriver
|
65
|
+
end # Selenium
|
@@ -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
|
@@ -57,6 +57,13 @@ module Selenium
|
|
57
57
|
#
|
58
58
|
|
59
59
|
def on_log_event(kind, &block)
|
60
|
+
if browser == :firefox
|
61
|
+
WebDriver.logger.deprecate(
|
62
|
+
'Driver#on_log_event on Firefox',
|
63
|
+
'the script.add_console_message_handler or the script.add_javascript_error_handler methods',
|
64
|
+
id: :on_log_event
|
65
|
+
)
|
66
|
+
end
|
60
67
|
raise Error::WebDriverError, "Don't know how to handle #{kind} events" unless KINDS.include?(kind)
|
61
68
|
|
62
69
|
enabled = log_listeners[kind].any?
|
@@ -64,7 +71,7 @@ module Selenium
|
|
64
71
|
return if enabled
|
65
72
|
|
66
73
|
devtools.runtime.enable
|
67
|
-
__send__("log_#{kind}_events")
|
74
|
+
__send__(:"log_#{kind}_events")
|
68
75
|
end
|
69
76
|
|
70
77
|
private
|
@@ -114,7 +121,7 @@ module Selenium
|
|
114
121
|
execute_script(mutation_listener)
|
115
122
|
devtools.page.add_script_to_evaluate_on_new_document(source: mutation_listener)
|
116
123
|
|
117
|
-
devtools.runtime.on(:binding_called
|
124
|
+
devtools.runtime.on(:binding_called) { |event| log_mutation_event(event) }
|
118
125
|
end
|
119
126
|
|
120
127
|
def log_mutation_event(params)
|
@@ -137,7 +144,6 @@ module Selenium
|
|
137
144
|
def mutation_listener
|
138
145
|
@mutation_listener ||= read_atom(:mutationListener)
|
139
146
|
end
|
140
|
-
|
141
147
|
end # HasLogEvents
|
142
148
|
end # DriverExtensions
|
143
149
|
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
|