selenium-webdriver 3.142.7 → 4.16.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 +5 -5
- data/CHANGES +685 -5
- data/Gemfile +6 -1
- data/LICENSE +1 -1
- data/NOTICE +2 -0
- data/README.md +4 -5
- 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 +93 -90
- data/lib/selenium/webdriver/atoms/findElements.js +122 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +100 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +77 -78
- data/lib/selenium/webdriver/atoms/mutationListener.js +55 -0
- data/lib/selenium/webdriver/atoms.rb +5 -3
- data/lib/selenium/webdriver/bidi/browsing_context.rb +88 -0
- data/lib/selenium/webdriver/bidi/browsing_context_info.rb +35 -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/bidi/log/filter_by.rb +40 -0
- 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_inspector.rb +143 -0
- data/lib/selenium/webdriver/bidi/navigate_result.rb +33 -0
- data/lib/selenium/webdriver/bidi/session.rb +51 -0
- data/lib/selenium/webdriver/{common/keyboard.rb → bidi.rb} +21 -35
- data/lib/selenium/webdriver/chrome/driver.rb +9 -86
- data/lib/selenium/webdriver/chrome/features.rb +48 -0
- data/lib/selenium/webdriver/chrome/options.rb +9 -158
- data/lib/selenium/webdriver/chrome/profile.rb +3 -80
- data/lib/selenium/webdriver/chrome/service.rb +7 -29
- data/lib/selenium/webdriver/chrome.rb +5 -20
- data/lib/selenium/webdriver/chromium/driver.rb +60 -0
- data/lib/selenium/webdriver/{chrome/bridge.rb → chromium/features.rb} +48 -17
- 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 +126 -238
- data/lib/selenium/webdriver/common/child_process.rb +124 -0
- data/lib/selenium/webdriver/common/driver.rb +82 -43
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/{has_location.rb → full_page_screenshot.rb} +13 -11
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +49 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +87 -0
- data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_bidi.rb} +9 -9
- data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +86 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +36 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +42 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +41 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_file_downloads.rb +65 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +36 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +143 -0
- data/lib/selenium/webdriver/common/driver_extensions/{has_remote_status.rb → has_logs.rb} +4 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +16 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +69 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -13
- data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +75 -0
- data/lib/selenium/webdriver/common/driver_extensions/{rotatable.rb → prints_page.rb} +18 -20
- data/lib/selenium/webdriver/common/driver_finder.rb +45 -0
- data/lib/selenium/webdriver/common/element.rb +89 -29
- data/lib/selenium/webdriver/common/error.rb +53 -194
- 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 -22
- data/lib/selenium/webdriver/common/interactions/interactions.rb +24 -4
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +10 -6
- 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 +71 -82
- data/lib/selenium/webdriver/common/interactions/pointer_cancel.rb +45 -0
- 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 +113 -0
- data/lib/selenium/webdriver/common/{w3c_manager.rb → interactions/wheel_input.rb} +14 -17
- data/lib/selenium/webdriver/common/keys.rb +1 -0
- data/lib/selenium/webdriver/common/local_driver.rb +46 -0
- data/lib/selenium/webdriver/common/log_entry.rb +2 -2
- data/lib/selenium/webdriver/common/logger.rb +119 -19
- data/lib/selenium/webdriver/common/manager.rb +11 -38
- data/lib/selenium/webdriver/common/options.rb +154 -23
- data/lib/selenium/webdriver/common/platform.rb +15 -52
- data/lib/selenium/webdriver/common/port_prober.rb +4 -6
- data/lib/selenium/webdriver/common/profile_helper.rb +11 -9
- data/lib/selenium/webdriver/common/proxy.rb +8 -5
- data/lib/selenium/webdriver/common/search_context.rb +7 -9
- data/lib/selenium/webdriver/common/selenium_manager.rb +140 -0
- data/lib/selenium/webdriver/common/service.rb +26 -143
- data/lib/selenium/webdriver/common/service_manager.rb +144 -0
- data/lib/selenium/webdriver/common/shadow_root.rb +86 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +4 -4
- data/lib/selenium/webdriver/common/socket_poller.rb +4 -4
- data/lib/selenium/webdriver/common/takes_screenshot.rb +65 -0
- data/lib/selenium/webdriver/common/target_locator.rb +31 -4
- data/lib/selenium/webdriver/common/timeouts.rb +31 -4
- 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 +164 -0
- data/lib/selenium/webdriver/common/window.rb +6 -10
- data/lib/selenium/webdriver/common/zipper.rb +4 -10
- data/lib/selenium/webdriver/common.rb +43 -20
- data/lib/selenium/webdriver/devtools/console_event.rb +36 -0
- data/lib/selenium/webdriver/devtools/exception_event.rb +34 -0
- data/lib/selenium/webdriver/devtools/mutation_event.rb +35 -0
- data/lib/selenium/webdriver/devtools/network_interceptor.rb +173 -0
- data/lib/selenium/webdriver/devtools/pinned_script.rb +57 -0
- data/lib/selenium/webdriver/devtools/request.rb +65 -0
- data/lib/selenium/webdriver/devtools/response.rb +64 -0
- data/lib/selenium/webdriver/devtools.rb +96 -0
- data/lib/selenium/webdriver/edge/driver.rb +11 -27
- data/lib/selenium/webdriver/edge/features.rb +48 -0
- data/lib/selenium/webdriver/edge/options.rb +18 -43
- data/lib/selenium/webdriver/edge/profile.rb +33 -0
- data/lib/selenium/webdriver/edge/service.rb +8 -23
- data/lib/selenium/webdriver/edge.rb +11 -16
- data/lib/selenium/webdriver/firefox/driver.rb +38 -19
- data/lib/selenium/webdriver/firefox/extension.rb +8 -0
- data/lib/selenium/webdriver/firefox/features.rb +70 -0
- data/lib/selenium/webdriver/firefox/options.rb +73 -61
- data/lib/selenium/webdriver/firefox/profile.rb +20 -72
- data/lib/selenium/webdriver/firefox/service.rb +3 -25
- data/lib/selenium/webdriver/firefox/util.rb +1 -1
- data/lib/selenium/webdriver/firefox.rb +17 -28
- data/lib/selenium/webdriver/ie/driver.rb +5 -45
- data/lib/selenium/webdriver/ie/features.rb +34 -0
- data/lib/selenium/webdriver/ie/options.rb +14 -44
- data/lib/selenium/webdriver/ie/service.rb +3 -27
- data/lib/selenium/webdriver/ie.rb +4 -16
- data/lib/selenium/webdriver/remote/bridge/commands.rb +164 -0
- data/lib/selenium/webdriver/remote/bridge.rb +574 -88
- data/lib/selenium/webdriver/remote/capabilities.rb +144 -158
- data/lib/selenium/webdriver/remote/driver.rb +45 -14
- data/lib/selenium/webdriver/remote/features.rb +75 -0
- data/lib/selenium/webdriver/remote/http/common.rb +3 -8
- data/lib/selenium/webdriver/remote/http/curb.rb +1 -3
- data/lib/selenium/webdriver/remote/http/default.rb +24 -33
- data/lib/selenium/webdriver/remote/response.rb +17 -49
- data/lib/selenium/webdriver/remote/server_error.rb +1 -1
- data/lib/selenium/webdriver/remote.rb +15 -12
- data/lib/selenium/webdriver/safari/driver.rb +7 -29
- data/lib/selenium/webdriver/safari/{bridge.rb → features.rb} +7 -5
- data/lib/selenium/webdriver/safari/options.rb +12 -27
- data/lib/selenium/webdriver/safari/service.rb +13 -11
- data/lib/selenium/webdriver/safari.rb +14 -20
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
- data/lib/selenium/webdriver/support/color.rb +24 -24
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +5 -5
- data/lib/selenium/webdriver/support/guards/guard.rb +90 -0
- data/lib/selenium/webdriver/{firefox/marionette/bridge.rb → support/guards/guard_condition.rb} +21 -20
- data/lib/selenium/webdriver/support/guards.rb +95 -0
- data/lib/selenium/webdriver/support/relative_locator.rb +50 -0
- data/lib/selenium/webdriver/support/select.rb +6 -4
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +19 -17
- data/selenium-webdriver.gemspec +36 -18
- metadata +161 -91
- data/lib/selenium/webdriver/common/bridge_helper.rb +0 -82
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +0 -58
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +0 -64
- data/lib/selenium/webdriver/common/mouse.rb +0 -89
- data/lib/selenium/webdriver/common/touch_action_builder.rb +0 -78
- data/lib/selenium/webdriver/common/touch_screen.rb +0 -123
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +0 -212
- data/lib/selenium/webdriver/edge/bridge.rb +0 -76
- data/lib/selenium/webdriver/firefox/binary.rb +0 -187
- data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -69
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +0 -111
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +0 -83
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +0 -90
- data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/remote/http/persistent.rb +0 -60
- data/lib/selenium/webdriver/remote/oss/bridge.rb +0 -594
- data/lib/selenium/webdriver/remote/oss/commands.rb +0 -223
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +0 -605
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +0 -310
- data/lib/selenium/webdriver/remote/w3c/commands.rb +0 -157
|
@@ -17,49 +17,33 @@
|
|
|
17
17
|
# specific language governing permissions and limitations
|
|
18
18
|
# under the License.
|
|
19
19
|
|
|
20
|
+
require 'selenium/webdriver/chromium/driver'
|
|
21
|
+
|
|
20
22
|
module Selenium
|
|
21
23
|
module WebDriver
|
|
22
24
|
module Edge
|
|
23
|
-
|
|
24
25
|
#
|
|
25
26
|
# Driver implementation for Microsoft Edge.
|
|
26
27
|
# @api private
|
|
27
28
|
#
|
|
28
29
|
|
|
29
|
-
class Driver <
|
|
30
|
-
include
|
|
31
|
-
|
|
32
|
-
def initialize(opts = {})
|
|
33
|
-
opts[:desired_capabilities] ||= Remote::Capabilities.edge
|
|
34
|
-
|
|
35
|
-
opts[:url] ||= service_url(opts)
|
|
36
|
-
|
|
37
|
-
listener = opts.delete(:listener)
|
|
30
|
+
class Driver < Chromium::Driver
|
|
31
|
+
include LocalDriver
|
|
38
32
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
desired_capabilities = opts.delete(:desired_capabilities)
|
|
43
|
-
bridge = Remote::Bridge.new(opts)
|
|
44
|
-
capabilities = bridge.create_session(desired_capabilities)
|
|
45
|
-
|
|
46
|
-
WebDriver.logger.info 'Forcing W3C dialect.'
|
|
47
|
-
@bridge = Remote::W3C::Bridge.new(capabilities, bridge.session_id, **opts)
|
|
48
|
-
@bridge.extend Edge::Bridge
|
|
49
|
-
|
|
50
|
-
super(@bridge, listener: listener)
|
|
33
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
|
34
|
+
caps, url = initialize_local_driver(options, service, url)
|
|
35
|
+
super(caps: caps, url: url, **opts)
|
|
51
36
|
end
|
|
52
37
|
|
|
53
38
|
def browser
|
|
54
39
|
:edge
|
|
55
40
|
end
|
|
56
41
|
|
|
57
|
-
|
|
58
|
-
super
|
|
59
|
-
ensure
|
|
60
|
-
@service&.stop
|
|
61
|
-
end
|
|
42
|
+
private
|
|
62
43
|
|
|
44
|
+
def devtools_address
|
|
45
|
+
"http://#{capabilities['ms:edgeOptions']['debuggerAddress']}"
|
|
46
|
+
end
|
|
63
47
|
end # Driver
|
|
64
48
|
end # Edge
|
|
65
49
|
end # WebDriver
|
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
require 'selenium/webdriver/chromium/features'
|
|
21
|
+
|
|
22
|
+
module Selenium
|
|
23
|
+
module WebDriver
|
|
24
|
+
module Edge
|
|
25
|
+
module Features
|
|
26
|
+
include WebDriver::Chromium::Features
|
|
27
|
+
|
|
28
|
+
EDGE_COMMANDS = {
|
|
29
|
+
get_cast_sinks: [:get, 'session/:session_id/ms/cast/get_sinks'],
|
|
30
|
+
set_cast_sink_to_use: [:post, 'session/:session_id/ms/cast/set_sink_to_use'],
|
|
31
|
+
start_cast_tab_mirroring: [:post, 'session/:session_id/ms/cast/start_tab_mirroring'],
|
|
32
|
+
start_cast_desktop_mirroring: [:post, 'session/:session_id/ms/cast/start_desktop_mirroring'],
|
|
33
|
+
get_cast_issue_message: [:get, 'session/:session_id/ms/cast/get_issue_message'],
|
|
34
|
+
stop_casting: [:post, 'session/:session_id/ms/cast/stop_casting'],
|
|
35
|
+
send_command: [:post, 'session/:session_id/ms/cdp/execute']
|
|
36
|
+
}.freeze
|
|
37
|
+
|
|
38
|
+
def command_list
|
|
39
|
+
EDGE_COMMANDS.merge(CHROMIUM_COMMANDS).merge(self.class::COMMANDS)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def commands(command)
|
|
43
|
+
command_list[command]
|
|
44
|
+
end
|
|
45
|
+
end # Bridge
|
|
46
|
+
end # Edge
|
|
47
|
+
end # WebDriver
|
|
48
|
+
end # Selenium
|
|
@@ -17,62 +17,37 @@
|
|
|
17
17
|
# specific language governing permissions and limitations
|
|
18
18
|
# under the License.
|
|
19
19
|
|
|
20
|
+
require 'selenium/webdriver/chromium/options'
|
|
21
|
+
|
|
20
22
|
module Selenium
|
|
21
23
|
module WebDriver
|
|
22
24
|
module Edge
|
|
23
|
-
class Options
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
class Options < Chromium::Options
|
|
26
|
+
KEY = 'ms:edgeOptions'
|
|
27
|
+
BROWSER = 'MicrosoftEdge'
|
|
26
28
|
|
|
27
29
|
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
#
|
|
31
|
-
# options = Selenium::WebDriver::Edge::Options.new(in_private: true)
|
|
32
|
-
# driver = Selenium::WebDriver.for :edge, options: options
|
|
33
|
-
#
|
|
34
|
-
# @param [Hash] opts the pre-defined options to create the Edge::Options with
|
|
35
|
-
# @option opts [Boolean] :in_private Start in private mode. Default is false
|
|
36
|
-
# @option opts [Array<String>] :extension_paths A list of full paths to extensions to install on startup
|
|
37
|
-
# @option opts [String] :start_page Default page to start with
|
|
38
|
-
#
|
|
39
|
-
# @see https://docs.microsoft.com/en-us/microsoft-edge/webdriver
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
def initialize(**opts)
|
|
43
|
-
@in_private = opts.delete(:in_private) || false
|
|
44
|
-
@extension_paths = opts.delete(:extension_paths) || []
|
|
45
|
-
@start_page = opts.delete(:start_page)
|
|
46
|
-
end
|
|
47
|
-
|
|
30
|
+
# Changes the browser name enable webview2
|
|
31
|
+
# see: https://learn.microsoft.com/en-us/microsoft-edge/webview2/how-to/webdriver
|
|
32
|
+
# Automation of WebView2 apps with Microsoft Edge WebDriver
|
|
48
33
|
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
# @example
|
|
34
|
+
# @example Enable webview2
|
|
52
35
|
# options = Selenium::WebDriver::Edge::Options.new
|
|
53
|
-
# options.
|
|
54
|
-
#
|
|
55
|
-
# @param [String] path The local path to the extension folder
|
|
36
|
+
# options.webview2!
|
|
56
37
|
#
|
|
57
38
|
|
|
58
|
-
def
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@extension_paths << path
|
|
39
|
+
def webview2!
|
|
40
|
+
@options[:browser_name] = 'webview2'
|
|
62
41
|
end
|
|
63
42
|
|
|
64
|
-
|
|
65
|
-
# @api private
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
def as_json(*)
|
|
69
|
-
opts = {}
|
|
43
|
+
private
|
|
70
44
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
45
|
+
def enable_logging(browser_options)
|
|
46
|
+
browser_options['ms:loggingPrefs'] = @logging_prefs
|
|
47
|
+
end
|
|
74
48
|
|
|
75
|
-
|
|
49
|
+
def binary_path
|
|
50
|
+
Edge.path
|
|
76
51
|
end
|
|
77
52
|
end # Options
|
|
78
53
|
end # Edge
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
require 'selenium/webdriver/chromium/profile'
|
|
21
|
+
|
|
22
|
+
module Selenium
|
|
23
|
+
module WebDriver
|
|
24
|
+
module Edge
|
|
25
|
+
#
|
|
26
|
+
# @private
|
|
27
|
+
#
|
|
28
|
+
|
|
29
|
+
class Profile < Chromium::Profile
|
|
30
|
+
end # Profile
|
|
31
|
+
end # Edge
|
|
32
|
+
end # WebDriver
|
|
33
|
+
end # Selenium
|
|
@@ -20,33 +20,18 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Edge
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
#
|
|
26
|
-
|
|
27
23
|
class Service < WebDriver::Service
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Unable to find MicrosoftWebDriver. Please download the server from
|
|
32
|
-
https://www.microsoft.com/en-us/download/details.aspx?id=48212 and place it somewhere on your PATH.
|
|
33
|
-
More info at https://github.com/SeleniumHQ/selenium/wiki/MicrosoftWebDriver.
|
|
34
|
-
ERROR
|
|
35
|
-
@shutdown_supported = true
|
|
24
|
+
DEFAULT_PORT = 9515
|
|
25
|
+
EXECUTABLE = 'msedgedriver'
|
|
26
|
+
SHUTDOWN_SUPPORTED = true
|
|
36
27
|
|
|
37
|
-
|
|
28
|
+
def log
|
|
29
|
+
return @log unless @log.is_a? String
|
|
38
30
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
driver_args = super
|
|
42
|
-
driver_opts = driver_opts.dup
|
|
43
|
-
driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key? :host
|
|
44
|
-
driver_args << "--package=#{driver_opts[:package]}" if driver_opts.key? :package
|
|
45
|
-
driver_args << "--silent" if driver_opts[:silent] == true
|
|
46
|
-
driver_args << "--verbose" if driver_opts[:verbose] == true
|
|
47
|
-
driver_args
|
|
31
|
+
@args << "--log-path=#{@log}"
|
|
32
|
+
@log = nil
|
|
48
33
|
end
|
|
49
34
|
end # Service
|
|
50
35
|
end # Edge
|
|
51
36
|
end # WebDriver
|
|
52
|
-
end #
|
|
37
|
+
end # Selenium
|
|
@@ -17,28 +17,23 @@
|
|
|
17
17
|
# specific language governing permissions and limitations
|
|
18
18
|
# under the License.
|
|
19
19
|
|
|
20
|
-
require 'net/http'
|
|
21
|
-
|
|
22
|
-
require 'selenium/webdriver/edge/bridge'
|
|
23
|
-
require 'selenium/webdriver/edge/driver'
|
|
24
|
-
require 'selenium/webdriver/edge/options'
|
|
25
|
-
|
|
26
20
|
module Selenium
|
|
27
21
|
module WebDriver
|
|
28
22
|
module Edge
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
autoload :Features, 'selenium/webdriver/edge/features'
|
|
24
|
+
autoload :Driver, 'selenium/webdriver/edge/driver'
|
|
25
|
+
autoload :Profile, 'selenium/webdriver/edge/profile'
|
|
26
|
+
autoload :Options, 'selenium/webdriver/edge/options'
|
|
27
|
+
autoload :Service, 'selenium/webdriver/edge/service'
|
|
28
|
+
|
|
29
|
+
def self.path=(path)
|
|
30
|
+
Platform.assert_executable path
|
|
31
|
+
@path = path
|
|
33
32
|
end
|
|
34
33
|
|
|
35
|
-
def self.
|
|
36
|
-
|
|
37
|
-
'Selenium::WebDriver::Edge::Service#driver_path'
|
|
38
|
-
Selenium::WebDriver::Edge::Service.driver_path
|
|
34
|
+
def self.path
|
|
35
|
+
@path ||= nil
|
|
39
36
|
end
|
|
40
37
|
end # Edge
|
|
41
38
|
end # WebDriver
|
|
42
39
|
end # Selenium
|
|
43
|
-
|
|
44
|
-
require 'selenium/webdriver/edge/service'
|
|
@@ -20,30 +20,49 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Firefox
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
23
|
+
#
|
|
24
|
+
# Driver implementation for Firefox using GeckoDriver.
|
|
25
|
+
# @api private
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
class Driver < WebDriver::Driver
|
|
29
|
+
EXTENSIONS = [DriverExtensions::HasAddons,
|
|
30
|
+
DriverExtensions::FullPageScreenshot,
|
|
31
|
+
DriverExtensions::HasContext,
|
|
32
|
+
DriverExtensions::HasBiDi,
|
|
33
|
+
DriverExtensions::HasDevTools,
|
|
34
|
+
DriverExtensions::HasLogEvents,
|
|
35
|
+
DriverExtensions::HasNetworkInterception,
|
|
36
|
+
DriverExtensions::HasWebStorage,
|
|
37
|
+
DriverExtensions::PrintsPage].freeze
|
|
38
|
+
|
|
39
|
+
include LocalDriver
|
|
40
|
+
|
|
41
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
|
42
|
+
caps, url = initialize_local_driver(options, service, url)
|
|
43
|
+
super(caps: caps, url: url, **opts)
|
|
44
|
+
end
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
def browser
|
|
47
|
+
:firefox
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
40
51
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
def devtools_url
|
|
53
|
+
if capabilities['moz:debuggerAddress'].nil?
|
|
54
|
+
raise(Error::WebDriverError, 'DevTools is not supported by this version of Firefox; use v85 or higher')
|
|
44
55
|
end
|
|
56
|
+
|
|
57
|
+
uri = URI("http://#{capabilities['moz:debuggerAddress']}")
|
|
58
|
+
response = Net::HTTP.get(uri.hostname, '/json/version', uri.port)
|
|
59
|
+
|
|
60
|
+
JSON.parse(response)['webSocketDebuggerUrl']
|
|
45
61
|
end
|
|
46
62
|
|
|
63
|
+
def devtools_version
|
|
64
|
+
Firefox::DEVTOOLS_VERSION
|
|
65
|
+
end
|
|
47
66
|
end # Driver
|
|
48
67
|
end # Firefox
|
|
49
68
|
end # WebDriver
|
|
@@ -87,6 +87,14 @@ module Selenium
|
|
|
87
87
|
return unless File.exist?(manifest_path)
|
|
88
88
|
|
|
89
89
|
manifest = JSON.parse(File.read(manifest_path))
|
|
90
|
+
applications_gecko_id(manifest) || name_and_version(manifest)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def applications_gecko_id(manifest)
|
|
94
|
+
manifest.dig('applications', 'gecko', 'id')&.strip
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def name_and_version(manifest)
|
|
90
98
|
[manifest['name'].delete(' '), manifest['version']].join('@')
|
|
91
99
|
end
|
|
92
100
|
end # Extension
|
|
@@ -0,0 +1,70 @@
|
|
|
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 Firefox
|
|
23
|
+
module Features
|
|
24
|
+
FIREFOX_COMMANDS = {
|
|
25
|
+
get_context: [:get, 'session/:session_id/moz/context'],
|
|
26
|
+
set_context: [:post, 'session/:session_id/moz/context'],
|
|
27
|
+
install_addon: [:post, 'session/:session_id/moz/addon/install'],
|
|
28
|
+
uninstall_addon: [:post, 'session/:session_id/moz/addon/uninstall'],
|
|
29
|
+
full_page_screenshot: [:get, 'session/:session_id/moz/screenshot/full']
|
|
30
|
+
}.freeze
|
|
31
|
+
|
|
32
|
+
def command_list
|
|
33
|
+
FIREFOX_COMMANDS.merge(self.class::COMMANDS)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def commands(command)
|
|
37
|
+
command_list[command]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def install_addon(path, temporary)
|
|
41
|
+
addon = if File.directory?(path)
|
|
42
|
+
Zipper.zip(path)
|
|
43
|
+
else
|
|
44
|
+
File.open(path, 'rb') { |crx_file| Base64.strict_encode64 crx_file.read }
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
payload = {addon: addon}
|
|
48
|
+
payload[:temporary] = temporary unless temporary.nil?
|
|
49
|
+
execute :install_addon, {}, payload
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def uninstall_addon(id)
|
|
53
|
+
execute :uninstall_addon, {}, {id: id}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def full_screenshot
|
|
57
|
+
execute :full_page_screenshot
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def context=(context)
|
|
61
|
+
execute :set_context, {}, {context: context}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def context
|
|
65
|
+
execute :get_context
|
|
66
|
+
end
|
|
67
|
+
end # Bridge
|
|
68
|
+
end # Firefox
|
|
69
|
+
end # WebDriver
|
|
70
|
+
end # Selenium
|
|
@@ -20,12 +20,26 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Firefox
|
|
23
|
-
class Options < WebDriver::
|
|
24
|
-
|
|
25
|
-
attr_accessor :binary, :log_level
|
|
23
|
+
class Options < WebDriver::Options
|
|
24
|
+
attr_accessor :debugger_address
|
|
26
25
|
|
|
27
26
|
KEY = 'moz:firefoxOptions'
|
|
28
27
|
|
|
28
|
+
# see: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
|
|
29
|
+
CAPABILITIES = {binary: 'binary',
|
|
30
|
+
args: 'args',
|
|
31
|
+
log: 'log',
|
|
32
|
+
prefs: 'prefs',
|
|
33
|
+
env: 'env',
|
|
34
|
+
android_package: 'androidPackage',
|
|
35
|
+
android_activity: 'androidActivity',
|
|
36
|
+
android_device_serial: 'androidDeviceSerial',
|
|
37
|
+
android_intent_arguments: 'androidIntentArguments'}.freeze
|
|
38
|
+
BROWSER = 'firefox'
|
|
39
|
+
|
|
40
|
+
# NOTE: special handling of 'profile' to validate when set instead of when used
|
|
41
|
+
attr_reader :profile
|
|
42
|
+
|
|
29
43
|
#
|
|
30
44
|
# Create a new Options instance, only for W3C-capable versions of Firefox.
|
|
31
45
|
#
|
|
@@ -42,13 +56,18 @@ module Selenium
|
|
|
42
56
|
# @option opts [Hash] :options A hash for raw options
|
|
43
57
|
#
|
|
44
58
|
|
|
45
|
-
def initialize(**opts)
|
|
46
|
-
@
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@options
|
|
59
|
+
def initialize(log_level: nil, **opts)
|
|
60
|
+
@debugger_address = opts.delete(:debugger_address) { true }
|
|
61
|
+
opts[:accept_insecure_certs] = true unless opts.key?(:accept_insecure_certs)
|
|
62
|
+
|
|
63
|
+
super(**opts)
|
|
64
|
+
|
|
65
|
+
@options[:args] ||= []
|
|
66
|
+
@options[:prefs] ||= {}
|
|
67
|
+
@options[:env] ||= {}
|
|
68
|
+
@options[:log] ||= {level: log_level} if log_level
|
|
69
|
+
|
|
70
|
+
process_profile(@options.delete(:profile))
|
|
52
71
|
end
|
|
53
72
|
|
|
54
73
|
#
|
|
@@ -62,22 +81,7 @@ module Selenium
|
|
|
62
81
|
#
|
|
63
82
|
|
|
64
83
|
def add_argument(arg)
|
|
65
|
-
@args << arg
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
#
|
|
69
|
-
# Add a new option not yet handled by these bindings.
|
|
70
|
-
#
|
|
71
|
-
# @example
|
|
72
|
-
# options = Selenium::WebDriver::Firefox::Options.new
|
|
73
|
-
# options.add_option(:foo, 'bar')
|
|
74
|
-
#
|
|
75
|
-
# @param [String, Symbol] name Name of the option
|
|
76
|
-
# @param [Boolean, String, Integer] value Value of the option
|
|
77
|
-
#
|
|
78
|
-
|
|
79
|
-
def add_option(name, value)
|
|
80
|
-
@options[name] = value
|
|
84
|
+
@options[:args] << arg
|
|
81
85
|
end
|
|
82
86
|
|
|
83
87
|
#
|
|
@@ -92,19 +96,7 @@ module Selenium
|
|
|
92
96
|
#
|
|
93
97
|
|
|
94
98
|
def add_preference(name, value)
|
|
95
|
-
prefs[name] = value
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
#
|
|
99
|
-
# Run Firefox in headless mode.
|
|
100
|
-
#
|
|
101
|
-
# @example Enable headless mode
|
|
102
|
-
# options = Selenium::WebDriver::Firefox::Options.new
|
|
103
|
-
# options.headless!
|
|
104
|
-
#
|
|
105
|
-
|
|
106
|
-
def headless!
|
|
107
|
-
add_argument '-headless'
|
|
99
|
+
@options[:prefs][name] = value
|
|
108
100
|
end
|
|
109
101
|
|
|
110
102
|
#
|
|
@@ -123,38 +115,58 @@ module Selenium
|
|
|
123
115
|
#
|
|
124
116
|
|
|
125
117
|
def profile=(profile)
|
|
126
|
-
|
|
118
|
+
process_profile(profile)
|
|
127
119
|
end
|
|
128
120
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
121
|
+
def log_level
|
|
122
|
+
@options.dig(:log, :level)
|
|
123
|
+
end
|
|
132
124
|
|
|
133
|
-
def
|
|
134
|
-
|
|
125
|
+
def log_level=(level)
|
|
126
|
+
@options[:log] = {level: level}
|
|
127
|
+
end
|
|
135
128
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
129
|
+
#
|
|
130
|
+
# Enables mobile browser use on Android.
|
|
131
|
+
#
|
|
132
|
+
# @see https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions#android
|
|
133
|
+
#
|
|
134
|
+
# @param [String] package The package name of the Chrome or WebView app.
|
|
135
|
+
# @param [String] serial_number The serial number of the device on which to launch the application.
|
|
136
|
+
# If not specified and multiple devices are attached, an error will be returned.
|
|
137
|
+
# @param [String] activity The fully qualified class name of the activity to be launched.
|
|
138
|
+
# @param [Array] intent_arguments Arguments to launch the intent with.
|
|
139
|
+
#
|
|
141
140
|
|
|
142
|
-
|
|
141
|
+
def enable_android(package: 'org.mozilla.firefox', serial_number: nil, activity: nil, intent_arguments: nil)
|
|
142
|
+
@options[:android_package] = package
|
|
143
|
+
@options[:android_activity] = activity unless activity.nil?
|
|
144
|
+
@options[:android_device_serial] = serial_number unless serial_number.nil?
|
|
145
|
+
@options[:android_intent_arguments] = intent_arguments unless intent_arguments.nil?
|
|
143
146
|
end
|
|
144
147
|
|
|
145
148
|
private
|
|
146
149
|
|
|
150
|
+
def process_browser_options(browser_options)
|
|
151
|
+
browser_options['moz:debuggerAddress'] = true if @debugger_address
|
|
152
|
+
options = browser_options[KEY]
|
|
153
|
+
options['binary'] ||= Firefox.path if Firefox.path
|
|
154
|
+
options['profile'] = @profile if @profile
|
|
155
|
+
end
|
|
156
|
+
|
|
147
157
|
def process_profile(profile)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
+
@profile = case profile
|
|
159
|
+
when nil
|
|
160
|
+
nil
|
|
161
|
+
when Profile
|
|
162
|
+
profile
|
|
163
|
+
else
|
|
164
|
+
Profile.from_name(profile)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def camelize?(key)
|
|
169
|
+
key != 'prefs'
|
|
158
170
|
end
|
|
159
171
|
end # Options
|
|
160
172
|
end # Firefox
|