selenium-webdriver 4.1.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.
- checksums.yaml +4 -4
- data/CHANGES +295 -1
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/NOTICE +1 -1
- data/README.md +2 -2
- 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 +36 -39
- data/lib/selenium/webdriver/atoms/findElements.js +3 -4
- data/lib/selenium/webdriver/atoms/getAttribute.js +0 -0
- data/lib/selenium/webdriver/atoms/isDisplayed.js +0 -0
- 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 +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/{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_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/bidi.rb +56 -0
- data/lib/selenium/webdriver/chrome/driver.rb +9 -29
- data/lib/selenium/webdriver/chrome/features.rb +6 -68
- 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 +4 -19
- data/lib/selenium/webdriver/chrome.rb +0 -16
- data/lib/selenium/webdriver/chromium/driver.rb +60 -0
- data/lib/selenium/webdriver/chromium/features.rb +103 -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 +62 -22
- data/lib/selenium/webdriver/common/child_process.rb +124 -0
- data/lib/selenium/webdriver/common/driver.rb +31 -81
- 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_launching.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +1 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +2 -69
- 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 +45 -0
- data/lib/selenium/webdriver/common/element.rb +8 -8
- data/lib/selenium/webdriver/common/error.rb +28 -5
- 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 -70
- 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 +113 -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 +46 -0
- data/lib/selenium/webdriver/common/logger.rb +90 -25
- data/lib/selenium/webdriver/common/manager.rb +0 -27
- data/lib/selenium/webdriver/common/options.rb +13 -17
- data/lib/selenium/webdriver/common/platform.rb +5 -51
- 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 +2 -2
- data/lib/selenium/webdriver/common/search_context.rb +0 -6
- data/lib/selenium/webdriver/common/selenium_manager.rb +134 -0
- data/lib/selenium/webdriver/common/service.rb +21 -30
- data/lib/selenium/webdriver/common/service_manager.rb +8 -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 +2 -2
- data/lib/selenium/webdriver/common/takes_screenshot.rb +2 -3
- data/lib/selenium/webdriver/common/target_locator.rb +2 -3
- 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/websocket_connection.rb +164 -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 +21 -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 +4 -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 +6 -6
- data/lib/selenium/webdriver/firefox/options.rb +7 -16
- data/lib/selenium/webdriver/firefox/profile.rb +8 -12
- data/lib/selenium/webdriver/firefox/service.rb +0 -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/options.rb +4 -3
- data/lib/selenium/webdriver/ie/service.rb +0 -22
- data/lib/selenium/webdriver/ie.rb +0 -14
- data/lib/selenium/webdriver/remote/{commands.rb → bridge/commands.rb} +15 -8
- data/lib/selenium/webdriver/remote/bridge.rb +65 -35
- data/lib/selenium/webdriver/remote/capabilities.rb +3 -53
- data/lib/selenium/webdriver/remote/driver.rb +31 -14
- data/lib/selenium/webdriver/remote/http/common.rb +3 -3
- data/lib/selenium/webdriver/remote/http/curb.rb +1 -3
- data/lib/selenium/webdriver/remote/http/default.rb +8 -14
- data/lib/selenium/webdriver/remote/response.rb +2 -3
- data/lib/selenium/webdriver/remote/server_error.rb +1 -1
- data/lib/selenium/webdriver/remote.rb +0 -1
- data/lib/selenium/webdriver/safari/driver.rb +7 -1
- data/lib/selenium/webdriver/safari/features.rb +0 -2
- 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/guards/guard.rb +0 -2
- data/lib/selenium/webdriver/support/guards/guard_condition.rb +1 -3
- data/lib/selenium/webdriver/support/guards.rb +1 -1
- 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 +6 -4
- data/selenium-webdriver.gemspec +14 -12
- metadata +73 -65
- 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
|
@@ -17,19 +17,20 @@
|
|
|
17
17
|
# specific language governing permissions and limitations
|
|
18
18
|
# under the License.
|
|
19
19
|
|
|
20
|
-
require 'selenium/webdriver/chrome/service'
|
|
21
|
-
|
|
22
20
|
module Selenium
|
|
23
21
|
module WebDriver
|
|
24
22
|
module Edge
|
|
25
|
-
class Service <
|
|
23
|
+
class Service < WebDriver::Service
|
|
26
24
|
DEFAULT_PORT = 9515
|
|
27
25
|
EXECUTABLE = 'msedgedriver'
|
|
28
|
-
MISSING_TEXT = <<~ERROR
|
|
29
|
-
Unable to find msedgedriver. Please download the server from
|
|
30
|
-
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ and place it somewhere on your PATH.
|
|
31
|
-
ERROR
|
|
32
26
|
SHUTDOWN_SUPPORTED = true
|
|
27
|
+
|
|
28
|
+
def log
|
|
29
|
+
return @log unless @log.is_a? String
|
|
30
|
+
|
|
31
|
+
@args << "--log-path=#{@log}"
|
|
32
|
+
@log = nil
|
|
33
|
+
end
|
|
33
34
|
end # Service
|
|
34
35
|
end # Edge
|
|
35
36
|
end # WebDriver
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Firefox
|
|
23
|
-
|
|
24
23
|
#
|
|
25
24
|
# Driver implementation for Firefox using GeckoDriver.
|
|
26
25
|
# @api private
|
|
@@ -30,12 +29,20 @@ module Selenium
|
|
|
30
29
|
EXTENSIONS = [DriverExtensions::HasAddons,
|
|
31
30
|
DriverExtensions::FullPageScreenshot,
|
|
32
31
|
DriverExtensions::HasContext,
|
|
32
|
+
DriverExtensions::HasBiDi,
|
|
33
33
|
DriverExtensions::HasDevTools,
|
|
34
34
|
DriverExtensions::HasLogEvents,
|
|
35
35
|
DriverExtensions::HasNetworkInterception,
|
|
36
36
|
DriverExtensions::HasWebStorage,
|
|
37
37
|
DriverExtensions::PrintsPage].freeze
|
|
38
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
|
|
45
|
+
|
|
39
46
|
def browser
|
|
40
47
|
:firefox
|
|
41
48
|
end
|
|
@@ -44,7 +51,7 @@ module Selenium
|
|
|
44
51
|
|
|
45
52
|
def devtools_url
|
|
46
53
|
if capabilities['moz:debuggerAddress'].nil?
|
|
47
|
-
raise(Error::WebDriverError,
|
|
54
|
+
raise(Error::WebDriverError, 'DevTools is not supported by this version of Firefox; use v85 or higher')
|
|
48
55
|
end
|
|
49
56
|
|
|
50
57
|
uri = URI("http://#{capabilities['moz:debuggerAddress']}")
|
|
@@ -21,7 +21,6 @@ module Selenium
|
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Firefox
|
|
23
23
|
module Features
|
|
24
|
-
|
|
25
24
|
FIREFOX_COMMANDS = {
|
|
26
25
|
get_context: [:get, 'session/:session_id/moz/context'],
|
|
27
26
|
set_context: [:post, 'session/:session_id/moz/context'],
|
|
@@ -35,12 +34,13 @@ module Selenium
|
|
|
35
34
|
end
|
|
36
35
|
|
|
37
36
|
def install_addon(path, temporary)
|
|
38
|
-
if
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
addon = if File.directory?(path)
|
|
38
|
+
Zipper.zip(path)
|
|
39
|
+
else
|
|
40
|
+
File.open(path, 'rb') { |crx_file| Base64.strict_encode64 crx_file.read }
|
|
41
|
+
end
|
|
42
42
|
|
|
43
|
-
payload = {
|
|
43
|
+
payload = {addon: addon}
|
|
44
44
|
payload[:temporary] = temporary unless temporary.nil?
|
|
45
45
|
execute :install_addon, {}, payload
|
|
46
46
|
end
|
|
@@ -25,11 +25,12 @@ module Selenium
|
|
|
25
25
|
|
|
26
26
|
KEY = 'moz:firefoxOptions'
|
|
27
27
|
|
|
28
|
-
# see: https://
|
|
28
|
+
# see: https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
|
|
29
29
|
CAPABILITIES = {binary: 'binary',
|
|
30
30
|
args: 'args',
|
|
31
31
|
log: 'log',
|
|
32
32
|
prefs: 'prefs',
|
|
33
|
+
env: 'env',
|
|
33
34
|
android_package: 'androidPackage',
|
|
34
35
|
android_activity: 'androidActivity',
|
|
35
36
|
android_device_serial: 'androidDeviceSerial',
|
|
@@ -44,7 +45,7 @@ module Selenium
|
|
|
44
45
|
#
|
|
45
46
|
# @example
|
|
46
47
|
# options = Selenium::WebDriver::Firefox::Options.new(args: ['--host=127.0.0.1'])
|
|
47
|
-
# driver = Selenium::WebDriver.for :firefox,
|
|
48
|
+
# driver = Selenium::WebDriver.for :firefox, options: options
|
|
48
49
|
#
|
|
49
50
|
# @param [Hash] opts the pre-defined options to create the Firefox::Options with
|
|
50
51
|
# @option opts [String] :binary Path to the Firefox executable to use
|
|
@@ -56,12 +57,14 @@ module Selenium
|
|
|
56
57
|
#
|
|
57
58
|
|
|
58
59
|
def initialize(log_level: nil, **opts)
|
|
59
|
-
@debugger_address = opts.delete(:debugger_address)
|
|
60
|
+
@debugger_address = opts.delete(:debugger_address) { true }
|
|
61
|
+
opts[:accept_insecure_certs] = true unless opts.key?(:accept_insecure_certs)
|
|
60
62
|
|
|
61
63
|
super(**opts)
|
|
62
64
|
|
|
63
65
|
@options[:args] ||= []
|
|
64
66
|
@options[:prefs] ||= {}
|
|
67
|
+
@options[:env] ||= {}
|
|
65
68
|
@options[:log] ||= {level: log_level} if log_level
|
|
66
69
|
|
|
67
70
|
process_profile(@options.delete(:profile))
|
|
@@ -96,18 +99,6 @@ module Selenium
|
|
|
96
99
|
@options[:prefs][name] = value
|
|
97
100
|
end
|
|
98
101
|
|
|
99
|
-
#
|
|
100
|
-
# Run Firefox in headless mode.
|
|
101
|
-
#
|
|
102
|
-
# @example Enable headless mode
|
|
103
|
-
# options = Selenium::WebDriver::Firefox::Options.new
|
|
104
|
-
# options.headless!
|
|
105
|
-
#
|
|
106
|
-
|
|
107
|
-
def headless!
|
|
108
|
-
add_argument '-headless'
|
|
109
|
-
end
|
|
110
|
-
|
|
111
102
|
#
|
|
112
103
|
# Sets Firefox profile.
|
|
113
104
|
#
|
|
@@ -175,7 +166,7 @@ module Selenium
|
|
|
175
166
|
end
|
|
176
167
|
|
|
177
168
|
def camelize?(key)
|
|
178
|
-
key !=
|
|
169
|
+
key != 'prefs'
|
|
179
170
|
end
|
|
180
171
|
end # Options
|
|
181
172
|
end # Firefox
|
|
@@ -26,11 +26,11 @@ module Selenium
|
|
|
26
26
|
VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
|
|
27
27
|
|
|
28
28
|
DEFAULT_PREFERENCES = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
'browser.newtabpage.enabled' => false,
|
|
30
|
+
'browser.startup.homepage' => 'about:blank',
|
|
31
|
+
'browser.usedOnWindows10.introURL' => 'about:blank',
|
|
32
|
+
'network.captive-portal-service.enabled' => false,
|
|
33
|
+
'security.csp.enable' => false
|
|
34
34
|
}.freeze
|
|
35
35
|
|
|
36
36
|
attr_reader :name, :log_file
|
|
@@ -96,7 +96,7 @@ module Selenium
|
|
|
96
96
|
raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
|
|
97
97
|
end
|
|
98
98
|
|
|
99
|
-
if value.is_a?(String) && stringified?(value)
|
|
99
|
+
if value.is_a?(String) && Util.stringified?(value)
|
|
100
100
|
raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
|
|
101
101
|
end
|
|
102
102
|
|
|
@@ -143,7 +143,7 @@ module Selenium
|
|
|
143
143
|
end
|
|
144
144
|
end
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
alias as_json encoded
|
|
147
147
|
|
|
148
148
|
private
|
|
149
149
|
|
|
@@ -160,7 +160,7 @@ module Selenium
|
|
|
160
160
|
destination = File.join(directory, 'extensions')
|
|
161
161
|
|
|
162
162
|
@extensions.each do |name, extension|
|
|
163
|
-
WebDriver.logger.debug({
|
|
163
|
+
WebDriver.logger.debug({extension: name}.inspect, id: :firefox_profile)
|
|
164
164
|
extension.write_to(destination)
|
|
165
165
|
end
|
|
166
166
|
end
|
|
@@ -221,10 +221,6 @@ module Selenium
|
|
|
221
221
|
end
|
|
222
222
|
end
|
|
223
223
|
end
|
|
224
|
-
|
|
225
|
-
def stringified?(str)
|
|
226
|
-
/^".*"$/.match?(str)
|
|
227
|
-
end
|
|
228
224
|
end # Profile
|
|
229
225
|
end # Firefox
|
|
230
226
|
end # WebDriver
|
|
@@ -23,25 +23,7 @@ module Selenium
|
|
|
23
23
|
class Service < WebDriver::Service
|
|
24
24
|
DEFAULT_PORT = 4444
|
|
25
25
|
EXECUTABLE = 'geckodriver'
|
|
26
|
-
MISSING_TEXT = <<~ERROR
|
|
27
|
-
Unable to find Mozilla geckodriver. Please download the server from
|
|
28
|
-
https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.
|
|
29
|
-
More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
|
|
30
|
-
ERROR
|
|
31
26
|
SHUTDOWN_SUPPORTED = false
|
|
32
|
-
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
# NOTE: This processing is deprecated
|
|
36
|
-
def extract_service_args(driver_opts)
|
|
37
|
-
driver_args = super
|
|
38
|
-
driver_opts = driver_opts.dup
|
|
39
|
-
driver_args << "--binary=#{driver_opts[:binary]}" if driver_opts.key?(:binary)
|
|
40
|
-
driver_args << "--log=#{driver_opts[:log]}" if driver_opts.key?(:log)
|
|
41
|
-
driver_args << "--marionette-port=#{driver_opts[:marionette_port]}" if driver_opts.key?(:marionette_port)
|
|
42
|
-
driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
|
|
43
|
-
driver_args
|
|
44
|
-
end
|
|
45
27
|
end # Service
|
|
46
28
|
end # Firefox
|
|
47
29
|
end # WebDriver
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
# @api private
|
|
24
|
+
module Util
|
|
25
|
+
module_function
|
|
26
|
+
|
|
27
|
+
def app_data_path
|
|
28
|
+
case Platform.os
|
|
29
|
+
when :windows
|
|
30
|
+
"#{ENV.fetch('APPDATA')}\\Mozilla\\Firefox"
|
|
31
|
+
when :macosx
|
|
32
|
+
"#{Platform.home}/Library/Application Support/Firefox"
|
|
33
|
+
when :unix, :linux
|
|
34
|
+
"#{Platform.home}/.mozilla/firefox"
|
|
35
|
+
else
|
|
36
|
+
raise "Unknown os: #{Platform.os}"
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def stringified?(str)
|
|
41
|
+
str =~ /^".*"$/
|
|
42
|
+
end
|
|
43
|
+
end # Util
|
|
44
|
+
end # Firefox
|
|
45
|
+
end # WebDriver
|
|
46
|
+
end # Selenium
|
|
@@ -24,6 +24,7 @@ require 'rexml/document'
|
|
|
24
24
|
module Selenium
|
|
25
25
|
module WebDriver
|
|
26
26
|
module Firefox
|
|
27
|
+
autoload :Util, 'selenium/webdriver/firefox/util'
|
|
27
28
|
autoload :Extension, 'selenium/webdriver/firefox/extension'
|
|
28
29
|
autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
|
|
29
30
|
autoload :Profile, 'selenium/webdriver/firefox/profile'
|
|
@@ -41,20 +42,6 @@ module Selenium
|
|
|
41
42
|
# until WebDriver Bidi is available.
|
|
42
43
|
DEVTOOLS_VERSION = 85
|
|
43
44
|
|
|
44
|
-
def self.driver_path=(path)
|
|
45
|
-
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
|
|
46
|
-
'Selenium::WebDriver::Firefox::Service#driver_path=',
|
|
47
|
-
id: :driver_path
|
|
48
|
-
Selenium::WebDriver::Firefox::Service.driver_path = path
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def self.driver_path
|
|
52
|
-
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path',
|
|
53
|
-
'Selenium::WebDriver::Firefox::Service#driver_path',
|
|
54
|
-
id: :driver_path
|
|
55
|
-
Selenium::WebDriver::Firefox::Service.driver_path
|
|
56
|
-
end
|
|
57
|
-
|
|
58
45
|
def self.path=(path)
|
|
59
46
|
Platform.assert_executable path
|
|
60
47
|
@path = path
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module IE
|
|
23
|
-
|
|
24
23
|
#
|
|
25
24
|
# Driver implementation for Internet Explorer supporting
|
|
26
25
|
# both OSS and W3C dialects of JSON wire protocol.
|
|
@@ -30,6 +29,13 @@ module Selenium
|
|
|
30
29
|
class Driver < WebDriver::Driver
|
|
31
30
|
EXTENSIONS = [DriverExtensions::HasWebStorage].freeze
|
|
32
31
|
|
|
32
|
+
include LocalDriver
|
|
33
|
+
|
|
34
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
|
35
|
+
caps, url = initialize_local_driver(options, service, url)
|
|
36
|
+
super(caps: caps, url: url, **opts)
|
|
37
|
+
end
|
|
38
|
+
|
|
33
39
|
def browser
|
|
34
40
|
:internet_explorer
|
|
35
41
|
end
|
|
@@ -41,7 +41,8 @@ module Selenium
|
|
|
41
41
|
use_per_process_proxy: 'ie.usePerProcessProxy',
|
|
42
42
|
use_legacy_file_upload_dialog_handling: 'ie.useLegacyFileUploadDialogHandling',
|
|
43
43
|
attach_to_edge_chrome: 'ie.edgechromium',
|
|
44
|
-
edge_executable_path: 'ie.edgepath'
|
|
44
|
+
edge_executable_path: 'ie.edgepath',
|
|
45
|
+
ignore_process_match: 'ie.ignoreprocessmatch'
|
|
45
46
|
}.freeze
|
|
46
47
|
BROWSER = 'internet explorer'
|
|
47
48
|
|
|
@@ -52,12 +53,12 @@ module Selenium
|
|
|
52
53
|
#
|
|
53
54
|
# @example
|
|
54
55
|
# options = Selenium::WebDriver::IE::Options.new(args: ['--host=127.0.0.1'])
|
|
55
|
-
# driver = Selenium::WebDriver.for(:ie,
|
|
56
|
+
# driver = Selenium::WebDriver.for(:ie, options: options)
|
|
56
57
|
#
|
|
57
58
|
# @example
|
|
58
59
|
# options = Selenium::WebDriver::IE::Options.new
|
|
59
60
|
# options.element_scroll_behavior = Selenium::WebDriver::IE::Options::SCROLL_BOTTOM
|
|
60
|
-
# driver = Selenium::WebDriver.for(:ie,
|
|
61
|
+
# driver = Selenium::WebDriver.for(:ie, options: options)
|
|
61
62
|
#
|
|
62
63
|
# @param [Hash] opts the pre-defined options
|
|
63
64
|
# @option opts [Array<String>] args
|
|
@@ -23,29 +23,7 @@ module Selenium
|
|
|
23
23
|
class Service < WebDriver::Service
|
|
24
24
|
DEFAULT_PORT = 5555
|
|
25
25
|
EXECUTABLE = 'IEDriverServer'
|
|
26
|
-
MISSING_TEXT = <<~ERROR
|
|
27
|
-
Unable to find IEDriverServer. Please download the server from
|
|
28
|
-
https://www.selenium.dev/downloads/ and place it somewhere on your PATH.
|
|
29
|
-
More info at https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver.
|
|
30
|
-
ERROR
|
|
31
26
|
SHUTDOWN_SUPPORTED = true
|
|
32
|
-
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
# NOTE: This processing is deprecated
|
|
36
|
-
def extract_service_args(driver_opts)
|
|
37
|
-
driver_args = super
|
|
38
|
-
driver_opts = driver_opts.dup
|
|
39
|
-
driver_args << "--log-level=#{driver_opts[:log_level].to_s.upcase}" if driver_opts.key?(:log_level)
|
|
40
|
-
driver_args << "--log-file=#{driver_opts[:log_file]}" if driver_opts.key?(:log_file)
|
|
41
|
-
if driver_opts.key?(:implementation)
|
|
42
|
-
driver_args << "--implementation=#{driver_opts[:implementation].to_s.upcase}"
|
|
43
|
-
end
|
|
44
|
-
driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
|
|
45
|
-
driver_args << "--extract_path=#{driver_opts[:extract_path]}" if driver_opts.key?(:extract_path)
|
|
46
|
-
driver_args << "--silent" if driver_opts[:silent] == true
|
|
47
|
-
driver_args
|
|
48
|
-
end
|
|
49
27
|
end # Server
|
|
50
28
|
end # IE
|
|
51
29
|
end # WebDriver
|
|
@@ -23,20 +23,6 @@ module Selenium
|
|
|
23
23
|
autoload :Driver, 'selenium/webdriver/ie/driver'
|
|
24
24
|
autoload :Options, 'selenium/webdriver/ie/options'
|
|
25
25
|
autoload :Service, 'selenium/webdriver/ie/service'
|
|
26
|
-
|
|
27
|
-
def self.driver_path=(path)
|
|
28
|
-
WebDriver.logger.deprecate 'Selenium::WebDriver::IE#driver_path=',
|
|
29
|
-
'Selenium::WebDriver::IE::Service#driver_path=',
|
|
30
|
-
id: :driver_path
|
|
31
|
-
Selenium::WebDriver::IE::Service.driver_path = path
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def self.driver_path
|
|
35
|
-
WebDriver.logger.deprecate 'Selenium::WebDriver::IE#driver_path',
|
|
36
|
-
'Selenium::WebDriver::IE::Service#driver_path',
|
|
37
|
-
id: :driver_path
|
|
38
|
-
Selenium::WebDriver::IE::Service.driver_path
|
|
39
|
-
end
|
|
40
26
|
end # IE
|
|
41
27
|
end # WebDriver
|
|
42
28
|
end # Selenium
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Remote
|
|
23
|
-
|
|
24
23
|
#
|
|
25
24
|
# https://w3c.github.io/webdriver/#endpoints
|
|
26
25
|
# @api private
|
|
@@ -60,10 +59,6 @@ module Selenium
|
|
|
60
59
|
fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
|
|
61
60
|
minimize_window: [:post, 'session/:session_id/window/minimize'],
|
|
62
61
|
maximize_window: [:post, 'session/:session_id/window/maximize'],
|
|
63
|
-
set_window_size: [:post, 'session/:session_id/window/size'],
|
|
64
|
-
get_window_size: [:get, 'session/:session_id/window/size'],
|
|
65
|
-
set_window_position: [:post, 'session/:session_id/window/position'],
|
|
66
|
-
get_window_position: [:get, 'session/:session_id/window/position'],
|
|
67
62
|
set_window_rect: [:post, 'session/:session_id/window/rect'],
|
|
68
63
|
get_window_rect: [:get, 'session/:session_id/window/rect'],
|
|
69
64
|
switch_to_frame: [:post, 'session/:session_id/frame'],
|
|
@@ -130,7 +125,6 @@ module Selenium
|
|
|
130
125
|
#
|
|
131
126
|
|
|
132
127
|
element_click: [:post, 'session/:session_id/element/:id/click'],
|
|
133
|
-
element_tap: [:post, 'session/:session_id/element/:id/tap'],
|
|
134
128
|
element_clear: [:post, 'session/:session_id/element/:id/clear'],
|
|
135
129
|
element_send_keys: [:post, 'session/:session_id/element/:id/value'],
|
|
136
130
|
|
|
@@ -154,9 +148,22 @@ module Selenium
|
|
|
154
148
|
# server extensions
|
|
155
149
|
#
|
|
156
150
|
|
|
157
|
-
upload_file: [:post, 'session/:session_id/se/file']
|
|
158
|
-
}.freeze
|
|
151
|
+
upload_file: [:post, 'session/:session_id/se/file'],
|
|
159
152
|
|
|
153
|
+
#
|
|
154
|
+
# virtual-authenticator
|
|
155
|
+
#
|
|
156
|
+
|
|
157
|
+
add_virtual_authenticator: [:post, 'session/:session_id/webauthn/authenticator'],
|
|
158
|
+
remove_virtual_authenticator: [:delete, 'session/:session_id/webauthn/authenticator/:authenticatorId'],
|
|
159
|
+
add_credential: [:post, 'session/:session_id/webauthn/authenticator/:authenticatorId/credential'],
|
|
160
|
+
get_credentials: [:get, 'session/:session_id/webauthn/authenticator/:authenticatorId/credentials'],
|
|
161
|
+
remove_credential: [:delete,
|
|
162
|
+
'session/:session_id/webauthn/authenticator/:authenticatorId/credentials/:credentialId'],
|
|
163
|
+
remove_all_credentials: [:delete, 'session/:session_id/webauthn/authenticator/:authenticatorId/credentials'],
|
|
164
|
+
set_user_verified: [:post, 'session/:session_id/webauthn/authenticator/:authenticatorId/uv']
|
|
165
|
+
|
|
166
|
+
}.freeze
|
|
160
167
|
end # Bridge
|
|
161
168
|
end # Remote
|
|
162
169
|
end # WebDriver
|