selenium-webdriver 4.0.0.alpha3 → 4.0.0.beta1
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 +160 -5
- data/LICENSE +1 -1
- data/README.md +4 -5
- data/lib/selenium/server.rb +19 -27
- data/lib/selenium/webdriver.rb +3 -3
- data/lib/selenium/webdriver/atoms/findElements.js +123 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +104 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +76 -78
- data/lib/selenium/webdriver/atoms/mutationListener.js +38 -0
- data/lib/selenium/webdriver/chrome.rb +4 -2
- data/lib/selenium/webdriver/chrome/bridge.rb +4 -6
- data/lib/selenium/webdriver/chrome/driver.rb +19 -17
- data/lib/selenium/webdriver/chrome/features.rb +66 -0
- data/lib/selenium/webdriver/chrome/options.rb +55 -38
- data/lib/selenium/webdriver/chrome/profile.rb +1 -1
- data/lib/selenium/webdriver/chrome/service.rb +1 -5
- data/lib/selenium/webdriver/common.rb +7 -2
- data/lib/selenium/webdriver/common/driver.rb +84 -21
- data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +89 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +38 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +5 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +149 -0
- data/lib/selenium/webdriver/{edge_chrome/bridge.rb → common/driver_extensions/has_logs.rb} +7 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -27
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +1 -0
- data/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +32 -0
- data/lib/selenium/webdriver/common/element.rb +5 -0
- data/lib/selenium/webdriver/common/logger.rb +48 -16
- data/lib/selenium/webdriver/common/manager.rb +11 -1
- data/lib/selenium/webdriver/common/options.rb +53 -12
- data/lib/selenium/webdriver/common/platform.rb +6 -1
- data/lib/selenium/webdriver/common/port_prober.rb +4 -6
- data/lib/selenium/webdriver/common/proxy.rb +0 -0
- data/lib/selenium/webdriver/common/search_context.rb +3 -2
- data/lib/selenium/webdriver/common/service.rb +12 -127
- data/lib/selenium/webdriver/common/service_manager.rb +151 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +2 -2
- data/lib/selenium/webdriver/common/takes_screenshot.rb +63 -0
- data/lib/selenium/webdriver/common/target_locator.rb +4 -4
- data/lib/selenium/webdriver/common/wait.rb +1 -1
- data/lib/selenium/webdriver/devtools.rb +135 -0
- data/lib/selenium/webdriver/devtools/console_event.rb +38 -0
- data/lib/selenium/webdriver/devtools/exception_event.rb +36 -0
- data/lib/selenium/webdriver/devtools/mutation_event.rb +37 -0
- data/lib/selenium/webdriver/devtools/v85/accessibility.rb +64 -0
- data/lib/selenium/webdriver/devtools/v85/animation.rb +100 -0
- data/lib/selenium/webdriver/devtools/v85/application_cache.rb +66 -0
- data/lib/selenium/webdriver/devtools/v85/audits.rb +63 -0
- data/lib/selenium/webdriver/devtools/v85/background_service.rb +69 -0
- data/lib/selenium/webdriver/devtools/v85/browser.rb +125 -0
- data/lib/selenium/webdriver/devtools/v85/cache_storage.rb +75 -0
- data/lib/selenium/webdriver/devtools/v85/cast.rb +72 -0
- data/lib/selenium/webdriver/devtools/v85/console.rb +59 -0
- data/lib/selenium/webdriver/devtools/v85/css.rb +167 -0
- data/lib/selenium/webdriver/devtools/v85/database.rb +66 -0
- data/lib/selenium/webdriver/devtools/v85/debugger.rb +231 -0
- data/lib/selenium/webdriver/devtools/v85/device_orientation.rb +55 -0
- data/lib/selenium/webdriver/devtools/v85/dom.rb +322 -0
- data/lib/selenium/webdriver/devtools/v85/dom_debugger.rb +95 -0
- data/lib/selenium/webdriver/devtools/v85/dom_snapshot.rb +67 -0
- data/lib/selenium/webdriver/devtools/v85/dom_storage.rb +81 -0
- data/lib/selenium/webdriver/devtools/v85/emulation.rb +182 -0
- data/lib/selenium/webdriver/devtools/v85/fetch.rb +99 -0
- data/lib/selenium/webdriver/devtools/v85/headless_experimental.rb +63 -0
- data/lib/selenium/webdriver/devtools/v85/heap_profiler.rb +109 -0
- data/lib/selenium/webdriver/devtools/v85/indexed_db.rb +102 -0
- data/lib/selenium/webdriver/devtools/v85/input.rb +143 -0
- data/lib/selenium/webdriver/devtools/v85/inspector.rb +57 -0
- data/lib/selenium/webdriver/devtools/v85/io.rb +61 -0
- data/lib/selenium/webdriver/devtools/v85/layer_tree.rb +97 -0
- data/lib/selenium/webdriver/devtools/v85/log.rb +68 -0
- data/lib/selenium/webdriver/devtools/v85/media.rb +59 -0
- data/lib/selenium/webdriver/devtools/v85/memory.rb +88 -0
- data/lib/selenium/webdriver/devtools/v85/network.rb +230 -0
- data/lib/selenium/webdriver/devtools/v85/overlay.rb +160 -0
- data/lib/selenium/webdriver/devtools/v85/page.rb +376 -0
- data/lib/selenium/webdriver/devtools/v85/performance.rb +65 -0
- data/lib/selenium/webdriver/devtools/v85/profiler.rb +113 -0
- data/lib/selenium/webdriver/devtools/v85/runtime.rb +196 -0
- data/lib/selenium/webdriver/devtools/v85/schema.rb +48 -0
- data/lib/selenium/webdriver/devtools/v85/security.rb +73 -0
- data/lib/selenium/webdriver/devtools/v85/service_worker.rb +118 -0
- data/lib/selenium/webdriver/devtools/v85/storage.rb +97 -0
- data/lib/selenium/webdriver/devtools/v85/system_info.rb +52 -0
- data/lib/selenium/webdriver/devtools/v85/target.rb +145 -0
- data/lib/selenium/webdriver/devtools/v85/tethering.rb +57 -0
- data/lib/selenium/webdriver/devtools/v85/tracing.rb +78 -0
- data/lib/selenium/webdriver/devtools/v85/web_audio.rb +72 -0
- data/lib/selenium/webdriver/devtools/v85/web_authn.rb +96 -0
- data/lib/selenium/webdriver/devtools/v86/accessibility.rb +64 -0
- data/lib/selenium/webdriver/devtools/v86/animation.rb +100 -0
- data/lib/selenium/webdriver/devtools/v86/application_cache.rb +66 -0
- data/lib/selenium/webdriver/devtools/v86/audits.rb +63 -0
- data/lib/selenium/webdriver/devtools/v86/background_service.rb +69 -0
- data/lib/selenium/webdriver/devtools/v86/browser.rb +125 -0
- data/lib/selenium/webdriver/devtools/v86/cache_storage.rb +75 -0
- data/lib/selenium/webdriver/devtools/v86/cast.rb +72 -0
- data/lib/selenium/webdriver/devtools/v86/console.rb +59 -0
- data/lib/selenium/webdriver/devtools/v86/css.rb +181 -0
- data/lib/selenium/webdriver/devtools/v86/database.rb +66 -0
- data/lib/selenium/webdriver/devtools/v86/debugger.rb +233 -0
- data/lib/selenium/webdriver/devtools/v86/device_orientation.rb +55 -0
- data/lib/selenium/webdriver/devtools/v86/dom.rb +329 -0
- data/lib/selenium/webdriver/devtools/v86/dom_debugger.rb +95 -0
- data/lib/selenium/webdriver/devtools/v86/dom_snapshot.rb +67 -0
- data/lib/selenium/webdriver/devtools/v86/dom_storage.rb +81 -0
- data/lib/selenium/webdriver/devtools/v86/emulation.rb +193 -0
- data/lib/selenium/webdriver/devtools/v86/fetch.rb +99 -0
- data/lib/selenium/webdriver/devtools/v86/headless_experimental.rb +63 -0
- data/lib/selenium/webdriver/devtools/v86/heap_profiler.rb +109 -0
- data/lib/selenium/webdriver/devtools/v86/indexed_db.rb +102 -0
- data/lib/selenium/webdriver/devtools/v86/input.rb +143 -0
- data/lib/selenium/webdriver/devtools/v86/inspector.rb +57 -0
- data/lib/selenium/webdriver/devtools/v86/io.rb +61 -0
- data/lib/selenium/webdriver/devtools/v86/layer_tree.rb +97 -0
- data/lib/selenium/webdriver/devtools/v86/log.rb +68 -0
- data/lib/selenium/webdriver/devtools/v86/media.rb +59 -0
- data/lib/selenium/webdriver/devtools/v86/memory.rb +88 -0
- data/lib/selenium/webdriver/devtools/v86/network.rb +235 -0
- data/lib/selenium/webdriver/devtools/v86/overlay.rb +183 -0
- data/lib/selenium/webdriver/devtools/v86/page.rb +376 -0
- data/lib/selenium/webdriver/devtools/v86/performance.rb +65 -0
- data/lib/selenium/webdriver/devtools/v86/profiler.rb +113 -0
- data/lib/selenium/webdriver/devtools/v86/runtime.rb +196 -0
- data/lib/selenium/webdriver/devtools/v86/schema.rb +48 -0
- data/lib/selenium/webdriver/devtools/v86/security.rb +73 -0
- data/lib/selenium/webdriver/devtools/v86/service_worker.rb +118 -0
- data/lib/selenium/webdriver/devtools/v86/storage.rb +97 -0
- data/lib/selenium/webdriver/devtools/v86/system_info.rb +52 -0
- data/lib/selenium/webdriver/devtools/v86/target.rb +145 -0
- data/lib/selenium/webdriver/devtools/v86/tethering.rb +57 -0
- data/lib/selenium/webdriver/devtools/v86/tracing.rb +78 -0
- data/lib/selenium/webdriver/devtools/v86/web_audio.rb +72 -0
- data/lib/selenium/webdriver/devtools/v86/web_authn.rb +102 -0
- data/lib/selenium/webdriver/devtools/v87/accessibility.rb +73 -0
- data/lib/selenium/webdriver/devtools/v87/animation.rb +100 -0
- data/lib/selenium/webdriver/devtools/v87/application_cache.rb +66 -0
- data/lib/selenium/webdriver/devtools/v87/audits.rb +63 -0
- data/lib/selenium/webdriver/devtools/v87/background_service.rb +69 -0
- data/lib/selenium/webdriver/devtools/v87/browser.rb +125 -0
- data/lib/selenium/webdriver/devtools/v87/cache_storage.rb +75 -0
- data/lib/selenium/webdriver/devtools/v87/cast.rb +72 -0
- data/lib/selenium/webdriver/{edge_html/driver.rb → devtools/v87/console.rb} +36 -30
- data/lib/selenium/webdriver/devtools/v87/css.rb +181 -0
- data/lib/selenium/webdriver/devtools/v87/database.rb +66 -0
- data/lib/selenium/webdriver/devtools/v87/debugger.rb +233 -0
- data/lib/selenium/webdriver/devtools/v87/device_orientation.rb +55 -0
- data/lib/selenium/webdriver/devtools/v87/dom.rb +329 -0
- data/lib/selenium/webdriver/devtools/v87/dom_debugger.rb +95 -0
- data/lib/selenium/webdriver/devtools/v87/dom_snapshot.rb +67 -0
- data/lib/selenium/webdriver/devtools/v87/dom_storage.rb +81 -0
- data/lib/selenium/webdriver/devtools/v87/emulation.rb +193 -0
- data/lib/selenium/webdriver/devtools/v87/fetch.rb +99 -0
- data/lib/selenium/webdriver/devtools/v87/headless_experimental.rb +63 -0
- data/lib/selenium/webdriver/devtools/v87/heap_profiler.rb +109 -0
- data/lib/selenium/webdriver/devtools/v87/indexed_db.rb +102 -0
- data/lib/selenium/webdriver/devtools/v87/input.rb +143 -0
- data/lib/selenium/webdriver/devtools/v87/inspector.rb +57 -0
- data/lib/selenium/webdriver/devtools/v87/io.rb +61 -0
- data/lib/selenium/webdriver/devtools/v87/layer_tree.rb +97 -0
- data/lib/selenium/webdriver/devtools/v87/log.rb +68 -0
- data/lib/selenium/webdriver/devtools/v87/media.rb +59 -0
- data/lib/selenium/webdriver/devtools/v87/memory.rb +88 -0
- data/lib/selenium/webdriver/devtools/v87/network.rb +247 -0
- data/lib/selenium/webdriver/devtools/v87/overlay.rb +183 -0
- data/lib/selenium/webdriver/devtools/v87/page.rb +376 -0
- data/lib/selenium/webdriver/devtools/v87/performance.rb +65 -0
- data/lib/selenium/webdriver/devtools/v87/profiler.rb +125 -0
- data/lib/selenium/webdriver/devtools/v87/runtime.rb +196 -0
- data/lib/selenium/webdriver/devtools/v87/schema.rb +48 -0
- data/lib/selenium/webdriver/devtools/v87/security.rb +73 -0
- data/lib/selenium/webdriver/devtools/v87/service_worker.rb +118 -0
- data/lib/selenium/webdriver/devtools/v87/storage.rb +97 -0
- data/lib/selenium/webdriver/devtools/v87/system_info.rb +52 -0
- data/lib/selenium/webdriver/devtools/v87/target.rb +145 -0
- data/lib/selenium/webdriver/devtools/v87/tethering.rb +57 -0
- data/lib/selenium/webdriver/devtools/v87/tracing.rb +78 -0
- data/lib/selenium/webdriver/devtools/v87/web_audio.rb +72 -0
- data/lib/selenium/webdriver/devtools/v87/web_authn.rb +102 -0
- data/lib/selenium/webdriver/devtools/v88/accessibility.rb +73 -0
- data/lib/selenium/webdriver/devtools/v88/animation.rb +100 -0
- data/lib/selenium/webdriver/devtools/v88/application_cache.rb +66 -0
- data/lib/selenium/webdriver/devtools/v88/audits.rb +63 -0
- data/lib/selenium/webdriver/devtools/v88/background_service.rb +69 -0
- data/lib/selenium/webdriver/devtools/v88/browser.rb +130 -0
- data/lib/selenium/webdriver/devtools/v88/cache_storage.rb +75 -0
- data/lib/selenium/webdriver/devtools/v88/cast.rb +72 -0
- data/lib/selenium/webdriver/devtools/v88/console.rb +59 -0
- data/lib/selenium/webdriver/devtools/v88/css.rb +181 -0
- data/lib/selenium/webdriver/devtools/v88/database.rb +66 -0
- data/lib/selenium/webdriver/devtools/v88/debugger.rb +233 -0
- data/lib/selenium/webdriver/devtools/v88/device_orientation.rb +55 -0
- data/lib/selenium/webdriver/devtools/v88/dom.rb +329 -0
- data/lib/selenium/webdriver/devtools/v88/dom_debugger.rb +95 -0
- data/lib/selenium/webdriver/devtools/v88/dom_snapshot.rb +67 -0
- data/lib/selenium/webdriver/devtools/v88/dom_storage.rb +81 -0
- data/lib/selenium/webdriver/devtools/v88/emulation.rb +198 -0
- data/lib/selenium/webdriver/devtools/v88/fetch.rb +99 -0
- data/lib/selenium/webdriver/devtools/v88/headless_experimental.rb +63 -0
- data/lib/selenium/webdriver/devtools/v88/heap_profiler.rb +109 -0
- data/lib/selenium/webdriver/devtools/v88/indexed_db.rb +102 -0
- data/lib/selenium/webdriver/devtools/v88/input.rb +148 -0
- data/lib/selenium/webdriver/devtools/v88/inspector.rb +57 -0
- data/lib/selenium/webdriver/devtools/v88/io.rb +61 -0
- data/lib/selenium/webdriver/devtools/v88/layer_tree.rb +97 -0
- data/lib/selenium/webdriver/devtools/v88/log.rb +68 -0
- data/lib/selenium/webdriver/devtools/v88/media.rb +59 -0
- data/lib/selenium/webdriver/devtools/v88/memory.rb +88 -0
- data/lib/selenium/webdriver/devtools/v88/network.rb +247 -0
- data/lib/selenium/webdriver/devtools/v88/overlay.rb +183 -0
- data/lib/selenium/webdriver/devtools/v88/page.rb +376 -0
- data/lib/selenium/webdriver/devtools/v88/performance.rb +65 -0
- data/lib/selenium/webdriver/devtools/v88/profiler.rb +125 -0
- data/lib/selenium/webdriver/devtools/v88/runtime.rb +197 -0
- data/lib/selenium/webdriver/devtools/v88/schema.rb +48 -0
- data/lib/selenium/webdriver/devtools/v88/security.rb +73 -0
- data/lib/selenium/webdriver/devtools/v88/service_worker.rb +118 -0
- data/lib/selenium/webdriver/devtools/v88/storage.rb +103 -0
- data/lib/selenium/webdriver/devtools/v88/system_info.rb +52 -0
- data/lib/selenium/webdriver/devtools/v88/target.rb +145 -0
- data/lib/selenium/webdriver/devtools/v88/tethering.rb +57 -0
- data/lib/selenium/webdriver/devtools/v88/tracing.rb +79 -0
- data/lib/selenium/webdriver/devtools/v88/web_audio.rb +72 -0
- data/lib/selenium/webdriver/devtools/v88/web_authn.rb +102 -0
- data/lib/selenium/webdriver/edge.rb +7 -27
- data/lib/selenium/webdriver/edge/bridge.rb +37 -0
- data/lib/selenium/webdriver/{edge_chrome → edge}/driver.rb +14 -4
- data/lib/selenium/webdriver/edge/features.rb +39 -0
- data/lib/selenium/webdriver/{edge_chrome → edge}/options.rb +12 -3
- data/lib/selenium/webdriver/{edge_chrome → edge}/profile.rb +2 -2
- data/lib/selenium/webdriver/{edge_chrome → edge}/service.rb +2 -6
- data/lib/selenium/webdriver/firefox.rb +10 -4
- data/lib/selenium/webdriver/firefox/bridge.rb +1 -1
- data/lib/selenium/webdriver/firefox/driver.rb +14 -14
- data/lib/selenium/webdriver/firefox/features.rb +47 -0
- data/lib/selenium/webdriver/firefox/options.rb +26 -29
- data/lib/selenium/webdriver/firefox/profile.rb +13 -76
- data/lib/selenium/webdriver/firefox/service.rb +1 -5
- data/lib/selenium/webdriver/ie.rb +4 -2
- data/lib/selenium/webdriver/ie/driver.rb +0 -16
- data/lib/selenium/webdriver/ie/options.rb +7 -20
- data/lib/selenium/webdriver/ie/service.rb +6 -10
- data/lib/selenium/webdriver/remote/bridge.rb +43 -67
- data/lib/selenium/webdriver/remote/capabilities.rb +13 -19
- data/lib/selenium/webdriver/remote/commands.rb +1 -0
- data/lib/selenium/webdriver/remote/driver.rb +10 -12
- data/lib/selenium/webdriver/remote/http/default.rb +6 -7
- data/lib/selenium/webdriver/remote/http/persistent.rb +6 -0
- data/lib/selenium/webdriver/safari.rb +11 -2
- data/lib/selenium/webdriver/safari/bridge.rb +1 -1
- data/lib/selenium/webdriver/safari/driver.rb +4 -17
- data/lib/selenium/webdriver/{common/driver_extensions/rotatable.rb → safari/features.rb} +26 -36
- data/lib/selenium/webdriver/safari/options.rb +1 -33
- data/lib/selenium/webdriver/safari/service.rb +0 -4
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -1
- data/lib/selenium/webdriver/support/color.rb +2 -2
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +2 -2
- data/lib/selenium/webdriver/support/relative_locator.rb +51 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/selenium-webdriver.gemspec +10 -7
- data/selenium_server_deploy.jar +0 -0
- metadata +254 -26
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +0 -64
- data/lib/selenium/webdriver/edge_html/options.rb +0 -91
- data/lib/selenium/webdriver/edge_html/service.rb +0 -51
- data/lib/selenium/webdriver/firefox/binary.rb +0 -110
- data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -69
|
@@ -21,14 +21,14 @@ module Selenium
|
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Chrome
|
|
23
23
|
class Options < WebDriver::Options
|
|
24
|
-
attr_accessor :profile
|
|
24
|
+
attr_accessor :profile, :logging_prefs
|
|
25
25
|
|
|
26
26
|
KEY = 'goog:chromeOptions'
|
|
27
|
+
BROWSER = 'chrome'
|
|
27
28
|
|
|
28
29
|
# see: http://chromedriver.chromium.org/capabilities
|
|
29
30
|
CAPABILITIES = {args: 'args',
|
|
30
31
|
binary: 'binary',
|
|
31
|
-
extensions: 'extensions',
|
|
32
32
|
local_state: 'localState',
|
|
33
33
|
prefs: 'prefs',
|
|
34
34
|
detach: 'detach',
|
|
@@ -39,15 +39,8 @@ module Selenium
|
|
|
39
39
|
perf_logging_prefs: 'perfLoggingPrefs',
|
|
40
40
|
window_types: 'windowTypes'}.freeze
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@options[key]
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
define_method "#{key}=" do |value|
|
|
48
|
-
@options[key] = value
|
|
49
|
-
end
|
|
50
|
-
end
|
|
42
|
+
# NOTE: special handling of 'extensions' to validate when set instead of when used
|
|
43
|
+
attr_reader :extensions
|
|
51
44
|
|
|
52
45
|
# Create a new Options instance.
|
|
53
46
|
#
|
|
@@ -73,12 +66,24 @@ module Selenium
|
|
|
73
66
|
# @option opts [Array<String>] :window_types A list of window types to appear in the list of window handles
|
|
74
67
|
#
|
|
75
68
|
|
|
76
|
-
def initialize(profile: nil,
|
|
77
|
-
super(opts)
|
|
69
|
+
def initialize(profile: nil, **opts)
|
|
70
|
+
super(**opts)
|
|
78
71
|
|
|
79
72
|
@profile = profile
|
|
80
|
-
|
|
81
|
-
@options[
|
|
73
|
+
|
|
74
|
+
@options = {args: [],
|
|
75
|
+
prefs: {},
|
|
76
|
+
emulation: {},
|
|
77
|
+
extensions: [],
|
|
78
|
+
local_state: {},
|
|
79
|
+
exclude_switches: [],
|
|
80
|
+
perf_logging_prefs: {},
|
|
81
|
+
window_types: []}.merge(@options)
|
|
82
|
+
|
|
83
|
+
@logging_prefs = options.delete(:logging_prefs) || {}
|
|
84
|
+
@encoded_extensions = @options.delete(:encoded_extensions) || []
|
|
85
|
+
@extensions = []
|
|
86
|
+
(@options.delete(:extensions)).each(&method(:validate_extension))
|
|
82
87
|
end
|
|
83
88
|
|
|
84
89
|
#
|
|
@@ -93,8 +98,21 @@ module Selenium
|
|
|
93
98
|
|
|
94
99
|
def add_extension(path)
|
|
95
100
|
validate_extension(path)
|
|
96
|
-
|
|
97
|
-
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#
|
|
104
|
+
# Add an extension by local path.
|
|
105
|
+
#
|
|
106
|
+
# @example
|
|
107
|
+
# extensions = ['/path/to/extension.crx', '/path/to/other.crx']
|
|
108
|
+
# options = Selenium::WebDriver::Chrome::Options.new
|
|
109
|
+
# options.extensions = extensions
|
|
110
|
+
#
|
|
111
|
+
# @param [Array<String>] :extensions A list of paths to (.crx) Chrome extensions to install on startup
|
|
112
|
+
#
|
|
113
|
+
|
|
114
|
+
def extensions=(extensions)
|
|
115
|
+
extensions.each(&method(:validate_extension))
|
|
98
116
|
end
|
|
99
117
|
|
|
100
118
|
#
|
|
@@ -108,10 +126,8 @@ module Selenium
|
|
|
108
126
|
#
|
|
109
127
|
|
|
110
128
|
def add_encoded_extension(encoded)
|
|
111
|
-
@
|
|
112
|
-
@options[:encoded_extensions] << encoded
|
|
129
|
+
@encoded_extensions << encoded
|
|
113
130
|
end
|
|
114
|
-
alias_method :encoded_extension=, :add_encoded_extension
|
|
115
131
|
|
|
116
132
|
#
|
|
117
133
|
# Add a command-line argument to use when starting Chrome.
|
|
@@ -124,7 +140,6 @@ module Selenium
|
|
|
124
140
|
#
|
|
125
141
|
|
|
126
142
|
def add_argument(arg)
|
|
127
|
-
@options[:args] ||= []
|
|
128
143
|
@options[:args] << arg
|
|
129
144
|
end
|
|
130
145
|
|
|
@@ -140,7 +155,6 @@ module Selenium
|
|
|
140
155
|
#
|
|
141
156
|
|
|
142
157
|
def add_preference(name, value)
|
|
143
|
-
@options[:prefs] ||= {}
|
|
144
158
|
@options[:prefs][name] = value
|
|
145
159
|
end
|
|
146
160
|
|
|
@@ -169,7 +183,7 @@ module Selenium
|
|
|
169
183
|
# options = Selenium::WebDriver::Chrome::Options.new
|
|
170
184
|
# options.add_emulation(device_metrics: {width: 400, height: 800, pixelRatio: 1, touch: true})
|
|
171
185
|
#
|
|
172
|
-
# @param [Hash] opts the pre-defined options for adding
|
|
186
|
+
# @param [Hash] opts the pre-defined options for adding mobile emulation values
|
|
173
187
|
# @option opts [String] :device_name A valid device name from the Chrome DevTools Emulation panel
|
|
174
188
|
# @option opts [Hash] :device_metrics Hash containing width, height, pixelRatio, touch
|
|
175
189
|
# @option opts [String] :user_agent Full user agent
|
|
@@ -179,30 +193,27 @@ module Selenium
|
|
|
179
193
|
@options[:emulation] = opts
|
|
180
194
|
end
|
|
181
195
|
|
|
182
|
-
|
|
183
|
-
# @api private
|
|
184
|
-
#
|
|
196
|
+
private
|
|
185
197
|
|
|
186
|
-
def
|
|
187
|
-
|
|
198
|
+
def enable_logging(browser_options)
|
|
199
|
+
browser_options['goog:loggingPrefs'] = @logging_prefs
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def process_browser_options(browser_options)
|
|
203
|
+
enable_logging(browser_options) unless @logging_prefs.empty?
|
|
188
204
|
|
|
205
|
+
options = browser_options[self.class::KEY]
|
|
206
|
+
options['binary'] ||= binary_path if binary_path
|
|
189
207
|
if @profile
|
|
190
208
|
options['args'] ||= []
|
|
191
|
-
options['args'] << "--user-data-dir=#{@profile
|
|
209
|
+
options['args'] << "--user-data-dir=#{@profile.directory}"
|
|
192
210
|
end
|
|
193
211
|
|
|
194
|
-
|
|
195
|
-
extensions = options['extensions'] || []
|
|
196
|
-
encoded_extensions = options.delete(:encoded_extensions) || []
|
|
197
|
-
|
|
198
|
-
options['extensions'] = extensions.map(&method(:encode_extension)) + encoded_extensions
|
|
199
|
-
options.delete('extensions') if options['extensions'].empty?
|
|
212
|
+
return if (@encoded_extensions + @extensions).empty?
|
|
200
213
|
|
|
201
|
-
|
|
214
|
+
options['extensions'] = @encoded_extensions + @extensions.map(&method(:encode_extension))
|
|
202
215
|
end
|
|
203
216
|
|
|
204
|
-
private
|
|
205
|
-
|
|
206
217
|
def binary_path
|
|
207
218
|
Chrome.path
|
|
208
219
|
end
|
|
@@ -214,6 +225,12 @@ module Selenium
|
|
|
214
225
|
def validate_extension(path)
|
|
215
226
|
raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.file?(path)
|
|
216
227
|
raise Error::WebDriverError, "file was not an extension #{path.inspect}" unless File.extname(path) == '.crx'
|
|
228
|
+
|
|
229
|
+
@extensions << path
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def camelize?(key)
|
|
233
|
+
!['prefs'].include?(key)
|
|
217
234
|
end
|
|
218
235
|
end # Options
|
|
219
236
|
end # Chrome
|
|
@@ -20,10 +20,6 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Chrome
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
#
|
|
26
|
-
|
|
27
23
|
class Service < WebDriver::Service
|
|
28
24
|
DEFAULT_PORT = 9515
|
|
29
25
|
EXECUTABLE = 'chromedriver'
|
|
@@ -36,7 +32,7 @@ module Selenium
|
|
|
36
32
|
|
|
37
33
|
private
|
|
38
34
|
|
|
39
|
-
#
|
|
35
|
+
# NOTE: This processing is deprecated
|
|
40
36
|
def extract_service_args(driver_opts)
|
|
41
37
|
driver_args = super
|
|
42
38
|
driver_opts = driver_opts.dup
|
|
@@ -23,6 +23,7 @@ require 'selenium/webdriver/common/proxy'
|
|
|
23
23
|
require 'selenium/webdriver/common/log_entry'
|
|
24
24
|
require 'selenium/webdriver/common/file_reaper'
|
|
25
25
|
require 'selenium/webdriver/common/service'
|
|
26
|
+
require 'selenium/webdriver/common/service_manager'
|
|
26
27
|
require 'selenium/webdriver/common/socket_lock'
|
|
27
28
|
require 'selenium/webdriver/common/socket_poller'
|
|
28
29
|
require 'selenium/webdriver/common/port_prober'
|
|
@@ -49,8 +50,6 @@ require 'selenium/webdriver/common/action_builder'
|
|
|
49
50
|
require 'selenium/webdriver/common/html5/shared_web_storage'
|
|
50
51
|
require 'selenium/webdriver/common/html5/local_storage'
|
|
51
52
|
require 'selenium/webdriver/common/html5/session_storage'
|
|
52
|
-
require 'selenium/webdriver/common/driver_extensions/takes_screenshot'
|
|
53
|
-
require 'selenium/webdriver/common/driver_extensions/rotatable'
|
|
54
53
|
require 'selenium/webdriver/common/driver_extensions/has_web_storage'
|
|
55
54
|
require 'selenium/webdriver/common/driver_extensions/downloads_files'
|
|
56
55
|
require 'selenium/webdriver/common/driver_extensions/has_location'
|
|
@@ -60,10 +59,16 @@ require 'selenium/webdriver/common/driver_extensions/has_network_conditions'
|
|
|
60
59
|
require 'selenium/webdriver/common/driver_extensions/has_network_connection'
|
|
61
60
|
require 'selenium/webdriver/common/driver_extensions/has_permissions'
|
|
62
61
|
require 'selenium/webdriver/common/driver_extensions/has_debugger'
|
|
62
|
+
require 'selenium/webdriver/common/driver_extensions/prints_page'
|
|
63
63
|
require 'selenium/webdriver/common/driver_extensions/uploads_files'
|
|
64
64
|
require 'selenium/webdriver/common/driver_extensions/has_addons'
|
|
65
|
+
require 'selenium/webdriver/common/driver_extensions/has_devtools'
|
|
66
|
+
require 'selenium/webdriver/common/driver_extensions/has_authentication'
|
|
67
|
+
require 'selenium/webdriver/common/driver_extensions/has_logs'
|
|
68
|
+
require 'selenium/webdriver/common/driver_extensions/has_log_events'
|
|
65
69
|
require 'selenium/webdriver/common/keys'
|
|
66
70
|
require 'selenium/webdriver/common/profile_helper'
|
|
67
71
|
require 'selenium/webdriver/common/options'
|
|
72
|
+
require 'selenium/webdriver/common/takes_screenshot'
|
|
68
73
|
require 'selenium/webdriver/common/driver'
|
|
69
74
|
require 'selenium/webdriver/common/element'
|
|
@@ -30,6 +30,7 @@ module Selenium
|
|
|
30
30
|
|
|
31
31
|
class Driver
|
|
32
32
|
include SearchContext
|
|
33
|
+
include TakesScreenshot
|
|
33
34
|
|
|
34
35
|
class << self
|
|
35
36
|
#
|
|
@@ -43,21 +44,17 @@ module Selenium
|
|
|
43
44
|
def for(browser, opts = {})
|
|
44
45
|
case browser
|
|
45
46
|
when :chrome
|
|
46
|
-
Chrome::Driver.new(opts)
|
|
47
|
+
Chrome::Driver.new(**opts)
|
|
47
48
|
when :internet_explorer, :ie
|
|
48
|
-
IE::Driver.new(opts)
|
|
49
|
+
IE::Driver.new(**opts)
|
|
49
50
|
when :safari
|
|
50
|
-
Safari::Driver.new(opts)
|
|
51
|
+
Safari::Driver.new(**opts)
|
|
51
52
|
when :firefox, :ff
|
|
52
|
-
Firefox::Driver.new(opts)
|
|
53
|
+
Firefox::Driver.new(**opts)
|
|
53
54
|
when :edge
|
|
54
|
-
Edge::Driver.new(opts)
|
|
55
|
-
when :edge_chrome
|
|
56
|
-
EdgeChrome::Driver.new(opts)
|
|
57
|
-
when :edge_html
|
|
58
|
-
EdgeHtml::Driver.new(opts)
|
|
55
|
+
Edge::Driver.new(**opts)
|
|
59
56
|
when :remote
|
|
60
|
-
Remote::Driver.new(opts)
|
|
57
|
+
Remote::Driver.new(**opts)
|
|
61
58
|
else
|
|
62
59
|
raise ArgumentError, "unknown driver: #{browser.inspect}"
|
|
63
60
|
end
|
|
@@ -71,16 +68,26 @@ module Selenium
|
|
|
71
68
|
# @api private
|
|
72
69
|
#
|
|
73
70
|
|
|
74
|
-
def initialize(bridge, listener: nil)
|
|
71
|
+
def initialize(bridge: nil, listener: nil, **opts)
|
|
75
72
|
@service = nil
|
|
76
|
-
|
|
77
|
-
@bridge = Support::EventFiringBridge.new(bridge, listener)
|
|
73
|
+
bridge ||= create_bridge(**opts)
|
|
74
|
+
@bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
|
|
78
75
|
end
|
|
79
76
|
|
|
80
77
|
def inspect
|
|
81
78
|
format '#<%<class>s:0x%<hash>x browser=%<browser>s>', class: self.class, hash: hash * 2, browser: bridge.browser.inspect
|
|
82
79
|
end
|
|
83
80
|
|
|
81
|
+
#
|
|
82
|
+
# information about whether a remote end is in a state in which it can create new sessions,
|
|
83
|
+
# and may include additional meta information.
|
|
84
|
+
#
|
|
85
|
+
# @return [Hash]
|
|
86
|
+
#
|
|
87
|
+
def status
|
|
88
|
+
@bridge.status
|
|
89
|
+
end
|
|
90
|
+
|
|
84
91
|
#
|
|
85
92
|
# @return [Navigation]
|
|
86
93
|
# @see Navigation
|
|
@@ -276,7 +283,7 @@ module Selenium
|
|
|
276
283
|
end
|
|
277
284
|
|
|
278
285
|
def browser
|
|
279
|
-
bridge
|
|
286
|
+
bridge&.browser
|
|
280
287
|
end
|
|
281
288
|
|
|
282
289
|
def capabilities
|
|
@@ -294,20 +301,76 @@ module Selenium
|
|
|
294
301
|
|
|
295
302
|
attr_reader :bridge
|
|
296
303
|
|
|
304
|
+
def create_bridge(**opts)
|
|
305
|
+
opts[:url] ||= service_url(opts)
|
|
306
|
+
caps = opts.delete(:capabilities)
|
|
307
|
+
# NOTE: This is deprecated
|
|
308
|
+
cap_array = caps.is_a?(Hash) ? [caps] : Array(caps)
|
|
309
|
+
|
|
310
|
+
desired_capabilities = opts.delete(:desired_capabilities)
|
|
311
|
+
if desired_capabilities
|
|
312
|
+
WebDriver.logger.deprecate(':desired_capabilities as a parameter for driver initialization',
|
|
313
|
+
':capabilities with an Array value of capabilities/options if necessary',
|
|
314
|
+
id: :desired_capabilities)
|
|
315
|
+
desired_capabilities = Remote::Capabilities.new(desired_capabilities) if desired_capabilities.is_a?(Hash)
|
|
316
|
+
cap_array << desired_capabilities
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
options = opts.delete(:options)
|
|
320
|
+
if options
|
|
321
|
+
WebDriver.logger.deprecate(':options as a parameter for driver initialization',
|
|
322
|
+
':capabilities with an Array of value capabilities/options if necessary',
|
|
323
|
+
id: :browser_options)
|
|
324
|
+
cap_array << options
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
capabilities = generate_capabilities(cap_array)
|
|
328
|
+
|
|
329
|
+
bridge_opts = {http_client: opts.delete(:http_client), url: opts.delete(:url)}
|
|
330
|
+
raise ArgumentError, "Unable to create a driver with parameters: #{opts}" unless opts.empty?
|
|
331
|
+
|
|
332
|
+
bridge = (respond_to?(:bridge_class) ? bridge_class : Remote::Bridge).new(**bridge_opts)
|
|
333
|
+
|
|
334
|
+
bridge.create_session(capabilities)
|
|
335
|
+
bridge
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
def generate_capabilities(cap_array)
|
|
339
|
+
cap_array.map { |cap|
|
|
340
|
+
if cap.is_a? Symbol
|
|
341
|
+
cap = Remote::Capabilities.send(cap)
|
|
342
|
+
elsif cap.is_a? Hash
|
|
343
|
+
WebDriver.logger.deprecate("passing a Hash value to :capabilities",
|
|
344
|
+
'Capabilities instance initialized with the Hash, or build values with Options class',
|
|
345
|
+
id: :capabilities_hash)
|
|
346
|
+
cap = Remote::Capabilities.new(cap)
|
|
347
|
+
elsif !cap.respond_to? :as_json
|
|
348
|
+
msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not"
|
|
349
|
+
raise ArgumentError, msg
|
|
350
|
+
end
|
|
351
|
+
cap&.as_json
|
|
352
|
+
}.inject(:merge) || Remote::Capabilities.send(browser || :new)
|
|
353
|
+
end
|
|
354
|
+
|
|
297
355
|
def service_url(opts)
|
|
298
|
-
|
|
356
|
+
service_config = opts.delete(:service)
|
|
299
357
|
%i[driver_opts driver_path port].each do |key|
|
|
300
358
|
next unless opts.key? key
|
|
301
359
|
|
|
302
|
-
WebDriver.logger.deprecate(":#{key}", ':service with an instance of Selenium::WebDriver::Service'
|
|
360
|
+
WebDriver.logger.deprecate(":#{key}", ':service with an instance of Selenium::WebDriver::Service',
|
|
361
|
+
id: "service_#{key}".to_sym)
|
|
303
362
|
end
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
@service.
|
|
363
|
+
service_config ||= Service.send(browser,
|
|
364
|
+
args: opts.delete(:driver_opts),
|
|
365
|
+
path: opts.delete(:driver_path),
|
|
366
|
+
port: opts.delete(:port))
|
|
367
|
+
@service = service_config.launch
|
|
309
368
|
@service.uri
|
|
310
369
|
end
|
|
370
|
+
|
|
371
|
+
def screenshot
|
|
372
|
+
bridge.screenshot
|
|
373
|
+
end
|
|
311
374
|
end # Driver
|
|
312
375
|
end # WebDriver
|
|
313
376
|
end # Selenium
|
|
@@ -0,0 +1,89 @@
|
|
|
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 HasAuthentication
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# Registers basic authentication handler which is automatically
|
|
27
|
+
# used whenever browser gets an authentication required response.
|
|
28
|
+
# This currently relies on DevTools so is only supported in
|
|
29
|
+
# Chromium browsers.
|
|
30
|
+
#
|
|
31
|
+
# @example Authenticate any request
|
|
32
|
+
# driver.register(username: 'admin', password: '123456')
|
|
33
|
+
#
|
|
34
|
+
# @example Authenticate based on URL
|
|
35
|
+
# driver.register(username: 'admin1', password: '123456', uri: /mysite1\.com/)
|
|
36
|
+
# driver.register(username: 'admin2', password: '123456', uri: /mysite2\.com/)
|
|
37
|
+
#
|
|
38
|
+
# @param [String] username
|
|
39
|
+
# @param [String] password
|
|
40
|
+
# @param [Regexp] uri to associate the credentials with
|
|
41
|
+
#
|
|
42
|
+
|
|
43
|
+
def register(username:, password:, uri: //)
|
|
44
|
+
auth_handlers << {username: username, password: password, uri: uri}
|
|
45
|
+
|
|
46
|
+
devtools.network.set_cache_disabled(cache_disabled: true)
|
|
47
|
+
devtools.fetch.on(:auth_required) do |params|
|
|
48
|
+
authenticate(params['requestId'], params.dig('request', 'url'))
|
|
49
|
+
end
|
|
50
|
+
devtools.fetch.on(:request_paused) do |params|
|
|
51
|
+
devtools.fetch.continue_request(request_id: params['requestId'])
|
|
52
|
+
end
|
|
53
|
+
devtools.fetch.enable(handle_auth_requests: true)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def auth_handlers
|
|
59
|
+
@auth_handlers ||= []
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def authenticate(request_id, url)
|
|
63
|
+
credentials = auth_handlers.find do |handler|
|
|
64
|
+
url.match?(handler[:uri])
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
if credentials
|
|
68
|
+
devtools.fetch.continue_with_auth(
|
|
69
|
+
request_id: request_id,
|
|
70
|
+
auth_challenge_response: {
|
|
71
|
+
response: 'ProvideCredentials',
|
|
72
|
+
username: credentials[:username],
|
|
73
|
+
password: credentials[:password]
|
|
74
|
+
}
|
|
75
|
+
)
|
|
76
|
+
else
|
|
77
|
+
devtools.fetch.continue_with_auth(
|
|
78
|
+
request_id: request_id,
|
|
79
|
+
auth_challenge_response: {
|
|
80
|
+
response: 'CancelAuth'
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
end # HasAuthentication
|
|
87
|
+
end # DriverExtensions
|
|
88
|
+
end # WebDriver
|
|
89
|
+
end # Selenium
|