selenium-webdriver 4.0.0.alpha1 → 4.0.0.alpha6
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 +139 -1
- data/LICENSE +1 -1
- data/lib/selenium/server.rb +3 -3
- data/lib/selenium/webdriver.rb +11 -7
- data/lib/selenium/webdriver/atoms/findElements.js +122 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +84 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +75 -77
- data/lib/selenium/webdriver/chrome.rb +10 -9
- data/lib/selenium/webdriver/chrome/bridge.rb +20 -4
- data/lib/selenium/webdriver/chrome/driver.rb +3 -52
- data/lib/selenium/webdriver/chrome/options.rb +97 -57
- data/lib/selenium/webdriver/chrome/profile.rb +2 -2
- data/lib/selenium/webdriver/chrome/service.rb +0 -4
- data/lib/selenium/webdriver/common.rb +3 -0
- data/lib/selenium/webdriver/common/driver.rb +76 -17
- data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_devtools.rb} +10 -8
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -1
- data/lib/selenium/webdriver/common/logger.rb +48 -16
- data/lib/selenium/webdriver/common/manager.rb +5 -0
- data/lib/selenium/webdriver/common/options.rb +60 -121
- data/lib/selenium/webdriver/common/platform.rb +3 -0
- data/lib/selenium/webdriver/common/port_prober.rb +4 -6
- data/lib/selenium/webdriver/common/profile_helper.rb +10 -2
- 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 +30 -113
- 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/wait.rb +1 -1
- data/lib/selenium/webdriver/devtools.rb +118 -0
- data/lib/selenium/webdriver/devtools/accessibility.rb +62 -0
- data/lib/selenium/webdriver/devtools/animation.rb +98 -0
- data/lib/selenium/webdriver/devtools/application_cache.rb +64 -0
- data/lib/selenium/webdriver/devtools/audits.rb +61 -0
- data/lib/selenium/webdriver/devtools/background_service.rb +67 -0
- data/lib/selenium/webdriver/devtools/browser.rb +123 -0
- data/lib/selenium/webdriver/devtools/cache_storage.rb +73 -0
- data/lib/selenium/webdriver/devtools/cast.rb +70 -0
- data/lib/selenium/webdriver/devtools/console.rb +57 -0
- data/lib/selenium/webdriver/devtools/css.rb +165 -0
- data/lib/selenium/webdriver/devtools/database.rb +64 -0
- data/lib/selenium/webdriver/devtools/debugger.rb +229 -0
- data/lib/selenium/webdriver/devtools/device_orientation.rb +53 -0
- data/lib/selenium/webdriver/devtools/dom.rb +320 -0
- data/lib/selenium/webdriver/devtools/domdebugger.rb +93 -0
- data/lib/selenium/webdriver/devtools/domsnapshot.rb +65 -0
- data/lib/selenium/webdriver/devtools/domstorage.rb +79 -0
- data/lib/selenium/webdriver/devtools/emulation.rb +180 -0
- data/lib/selenium/webdriver/devtools/fetch.rb +97 -0
- data/lib/selenium/webdriver/devtools/headless_experimental.rb +61 -0
- data/lib/selenium/webdriver/devtools/heap_profiler.rb +107 -0
- data/lib/selenium/webdriver/devtools/indexed_db.rb +100 -0
- data/lib/selenium/webdriver/devtools/input.rb +140 -0
- data/lib/selenium/webdriver/devtools/inspector.rb +55 -0
- data/lib/selenium/webdriver/devtools/io.rb +59 -0
- data/lib/selenium/webdriver/devtools/layer_tree.rb +95 -0
- data/lib/selenium/webdriver/devtools/log.rb +66 -0
- data/lib/selenium/webdriver/devtools/media.rb +57 -0
- data/lib/selenium/webdriver/devtools/memory.rb +86 -0
- data/lib/selenium/webdriver/devtools/network.rb +228 -0
- data/lib/selenium/webdriver/devtools/overlay.rb +157 -0
- data/lib/selenium/webdriver/devtools/page.rb +374 -0
- data/lib/selenium/webdriver/devtools/performance.rb +63 -0
- data/lib/selenium/webdriver/devtools/profiler.rb +111 -0
- data/lib/selenium/webdriver/devtools/runtime.rb +193 -0
- data/lib/selenium/webdriver/devtools/schema.rb +46 -0
- data/lib/selenium/webdriver/devtools/security.rb +71 -0
- data/lib/selenium/webdriver/devtools/service_worker.rb +116 -0
- data/lib/selenium/webdriver/devtools/storage.rb +95 -0
- data/lib/selenium/webdriver/devtools/system_info.rb +50 -0
- data/lib/selenium/webdriver/devtools/target.rb +141 -0
- data/lib/selenium/webdriver/devtools/tethering.rb +55 -0
- data/lib/selenium/webdriver/devtools/tracing.rb +76 -0
- data/lib/selenium/webdriver/devtools/web_audio.rb +70 -0
- data/lib/selenium/webdriver/devtools/web_authn.rb +94 -0
- data/lib/selenium/webdriver/edge.rb +29 -9
- data/lib/selenium/webdriver/{firefox/util.rb → edge_chrome/bridge.rb} +11 -20
- data/lib/selenium/webdriver/{common/w3c_options.rb → edge_chrome/driver.rb} +14 -17
- data/lib/selenium/webdriver/edge_chrome/options.rb +36 -0
- data/lib/selenium/webdriver/edge_chrome/profile.rb +33 -0
- data/lib/selenium/webdriver/edge_chrome/service.rb +36 -0
- data/lib/selenium/webdriver/{common/w3c_manager.rb → edge_html/driver.rb} +11 -17
- data/lib/selenium/webdriver/{edge → edge_html}/options.rb +26 -22
- data/lib/selenium/webdriver/{edge → edge_html}/service.rb +2 -6
- data/lib/selenium/webdriver/firefox.rb +18 -15
- data/lib/selenium/webdriver/firefox/bridge.rb +1 -1
- data/lib/selenium/webdriver/firefox/driver.rb +2 -30
- data/lib/selenium/webdriver/firefox/extension.rb +8 -0
- data/lib/selenium/webdriver/firefox/options.rb +47 -52
- data/lib/selenium/webdriver/firefox/profile.rb +7 -78
- data/lib/selenium/webdriver/firefox/service.rb +0 -4
- data/lib/selenium/webdriver/ie.rb +8 -7
- data/lib/selenium/webdriver/ie/driver.rb +0 -32
- data/lib/selenium/webdriver/ie/options.rb +10 -33
- data/lib/selenium/webdriver/ie/service.rb +5 -9
- data/lib/selenium/webdriver/remote.rb +16 -10
- data/lib/selenium/webdriver/remote/bridge.rb +34 -42
- data/lib/selenium/webdriver/remote/capabilities.rb +22 -6
- data/lib/selenium/webdriver/remote/driver.rb +6 -12
- data/lib/selenium/webdriver/remote/http/default.rb +9 -4
- data/lib/selenium/webdriver/remote/http/persistent.rb +5 -6
- data/lib/selenium/webdriver/safari.rb +9 -8
- data/lib/selenium/webdriver/safari/bridge.rb +4 -4
- data/lib/selenium/webdriver/safari/driver.rb +3 -29
- data/lib/selenium/webdriver/safari/options.rb +18 -19
- data/lib/selenium/webdriver/safari/service.rb +0 -4
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/support/cdp_client_generator.rb +77 -0
- data/lib/selenium/webdriver/support/color.rb +2 -2
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +1 -1
- data/lib/selenium/webdriver/support/relative_locator.rb +51 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/selenium-webdriver.gemspec +5 -4
- metadata +81 -42
- data/lib/selenium/webdriver/common/bridge_helper.rb +0 -82
- data/lib/selenium/webdriver/common/keyboard.rb +0 -70
- 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/edge/driver.rb +0 -70
- data/lib/selenium/webdriver/firefox/binary.rb +0 -110
- 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/bridge.rb +0 -49
- 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/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
|
@@ -0,0 +1,36 @@
|
|
|
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/chrome/service'
|
|
21
|
+
|
|
22
|
+
module Selenium
|
|
23
|
+
module WebDriver
|
|
24
|
+
module EdgeChrome
|
|
25
|
+
class Service < Selenium::WebDriver::Chrome::Service
|
|
26
|
+
DEFAULT_PORT = 9515
|
|
27
|
+
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
|
+
SHUTDOWN_SUPPORTED = true
|
|
33
|
+
end # Service
|
|
34
|
+
end # EdgeChrome
|
|
35
|
+
end # WebDriver
|
|
36
|
+
end # Selenium
|
|
@@ -19,27 +19,21 @@
|
|
|
19
19
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
|
-
|
|
22
|
+
module EdgeHtml
|
|
23
23
|
|
|
24
24
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
# @param [String] name the name of the cookie
|
|
28
|
-
# @return [Hash, nil] the cookie, or nil if it wasn't found.
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
def cookie_named(name)
|
|
32
|
-
convert_cookie(@bridge.cookie(name))
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
#
|
|
36
|
-
# Delete all cookies
|
|
25
|
+
# Driver implementation for Microsoft Edge.
|
|
26
|
+
# @api private
|
|
37
27
|
#
|
|
38
28
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
29
|
+
class Driver < WebDriver::Driver
|
|
30
|
+
include DriverExtensions::HasWebStorage
|
|
31
|
+
include DriverExtensions::TakesScreenshot
|
|
42
32
|
|
|
43
|
-
|
|
33
|
+
def browser
|
|
34
|
+
:edge
|
|
35
|
+
end
|
|
36
|
+
end # Driver
|
|
37
|
+
end # EdgeHtml
|
|
44
38
|
end # WebDriver
|
|
45
39
|
end # Selenium
|
|
@@ -19,10 +19,23 @@
|
|
|
19
19
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
|
-
module
|
|
23
|
-
class Options
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
module EdgeHtml
|
|
23
|
+
class Options < WebDriver::Options
|
|
24
|
+
# see https://docs.microsoft.com/en-us/microsoft-edge/webdriver#capabilities
|
|
25
|
+
CAPABILITIES = {in_private: 'ms:inPrivate',
|
|
26
|
+
extension_paths: 'ms:extensionPaths',
|
|
27
|
+
start_page: 'ms:startPage'}.freeze
|
|
28
|
+
BROWSER = 'MicrosoftEdge'
|
|
29
|
+
|
|
30
|
+
CAPABILITIES.each_key do |key|
|
|
31
|
+
define_method key do
|
|
32
|
+
@options[key]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
define_method "#{key}=" do |value|
|
|
36
|
+
@options[key] = value
|
|
37
|
+
end
|
|
38
|
+
end
|
|
26
39
|
|
|
27
40
|
#
|
|
28
41
|
# Create a new Options instance for Edge.
|
|
@@ -40,9 +53,8 @@ module Selenium
|
|
|
40
53
|
#
|
|
41
54
|
|
|
42
55
|
def initialize(**opts)
|
|
43
|
-
|
|
44
|
-
@
|
|
45
|
-
@start_page = opts.delete(:start_page)
|
|
56
|
+
super(**opts)
|
|
57
|
+
@options[:extensions]&.each(&method(:validate_extension))
|
|
46
58
|
end
|
|
47
59
|
|
|
48
60
|
#
|
|
@@ -56,25 +68,17 @@ module Selenium
|
|
|
56
68
|
#
|
|
57
69
|
|
|
58
70
|
def add_extension_path(path)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@extension_paths << path
|
|
71
|
+
validate_extension(path)
|
|
72
|
+
@options[:extension_paths] ||= []
|
|
73
|
+
@options[:extension_paths] << path
|
|
62
74
|
end
|
|
63
75
|
|
|
64
|
-
|
|
65
|
-
# @api private
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
def as_json(*)
|
|
69
|
-
opts = {}
|
|
76
|
+
private
|
|
70
77
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
opts['ms:startPage'] = @start_page if @start_page
|
|
74
|
-
|
|
75
|
-
opts
|
|
78
|
+
def validate_extension(path)
|
|
79
|
+
raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
|
|
76
80
|
end
|
|
77
81
|
end # Options
|
|
78
|
-
end #
|
|
82
|
+
end # EdgeHtml
|
|
79
83
|
end # WebDriver
|
|
80
84
|
end # Selenium
|
|
@@ -19,11 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
|
-
module
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
#
|
|
26
|
-
|
|
22
|
+
module EdgeHtml
|
|
27
23
|
class Service < WebDriver::Service
|
|
28
24
|
DEFAULT_PORT = 17556
|
|
29
25
|
EXECUTABLE = 'MicrosoftWebDriver'
|
|
@@ -46,6 +42,6 @@ module Selenium
|
|
|
46
42
|
driver_args
|
|
47
43
|
end
|
|
48
44
|
end # Service
|
|
49
|
-
end #
|
|
45
|
+
end # EdgeHtml
|
|
50
46
|
end # WebDriver
|
|
51
47
|
end # Service
|
|
@@ -21,19 +21,17 @@ require 'timeout'
|
|
|
21
21
|
require 'socket'
|
|
22
22
|
require 'rexml/document'
|
|
23
23
|
|
|
24
|
-
require 'selenium/webdriver/firefox/driver'
|
|
25
|
-
|
|
26
|
-
require 'selenium/webdriver/firefox/extension'
|
|
27
|
-
require 'selenium/webdriver/firefox/binary'
|
|
28
|
-
require 'selenium/webdriver/firefox/profiles_ini'
|
|
29
|
-
require 'selenium/webdriver/firefox/profile'
|
|
30
|
-
require 'selenium/webdriver/firefox/bridge'
|
|
31
|
-
require 'selenium/webdriver/firefox/driver'
|
|
32
|
-
require 'selenium/webdriver/firefox/options'
|
|
33
|
-
|
|
34
24
|
module Selenium
|
|
35
25
|
module WebDriver
|
|
36
26
|
module Firefox
|
|
27
|
+
autoload :Extension, 'selenium/webdriver/firefox/extension'
|
|
28
|
+
autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
|
|
29
|
+
autoload :Profile, 'selenium/webdriver/firefox/profile'
|
|
30
|
+
autoload :Bridge, 'selenium/webdriver/firefox/bridge'
|
|
31
|
+
autoload :Driver, 'selenium/webdriver/firefox/driver'
|
|
32
|
+
autoload :Options, 'selenium/webdriver/firefox/options'
|
|
33
|
+
autoload :Service, 'selenium/webdriver/firefox/service'
|
|
34
|
+
|
|
37
35
|
DEFAULT_PORT = 7055
|
|
38
36
|
DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
|
|
39
37
|
DEFAULT_SECURE_SSL = false
|
|
@@ -42,21 +40,26 @@ module Selenium
|
|
|
42
40
|
|
|
43
41
|
def self.driver_path=(path)
|
|
44
42
|
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
|
|
45
|
-
'Selenium::WebDriver::Firefox::Service#driver_path='
|
|
43
|
+
'Selenium::WebDriver::Firefox::Service#driver_path=',
|
|
44
|
+
id: :driver_path
|
|
46
45
|
Selenium::WebDriver::Firefox::Service.driver_path = path
|
|
47
46
|
end
|
|
48
47
|
|
|
49
48
|
def self.driver_path
|
|
50
49
|
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path',
|
|
51
|
-
'Selenium::WebDriver::Firefox::Service#driver_path'
|
|
50
|
+
'Selenium::WebDriver::Firefox::Service#driver_path',
|
|
51
|
+
id: :driver_path
|
|
52
52
|
Selenium::WebDriver::Firefox::Service.driver_path
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def self.path=(path)
|
|
56
|
-
|
|
56
|
+
Platform.assert_executable path
|
|
57
|
+
@path = path
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.path
|
|
61
|
+
@path ||= nil
|
|
57
62
|
end
|
|
58
63
|
end # Firefox
|
|
59
64
|
end # WebDriver
|
|
60
65
|
end # Selenium
|
|
61
|
-
|
|
62
|
-
require 'selenium/webdriver/firefox/service'
|
|
@@ -31,40 +31,12 @@ module Selenium
|
|
|
31
31
|
include DriverExtensions::HasWebStorage
|
|
32
32
|
include DriverExtensions::TakesScreenshot
|
|
33
33
|
|
|
34
|
-
def initialize(opts = {})
|
|
35
|
-
opts[:desired_capabilities] = create_capabilities(opts)
|
|
36
|
-
|
|
37
|
-
opts[:url] ||= service_url(opts)
|
|
38
|
-
|
|
39
|
-
listener = opts.delete(:listener)
|
|
40
|
-
desired_capabilities = opts.delete(:desired_capabilities)
|
|
41
|
-
|
|
42
|
-
@bridge = Remote::Bridge.new(opts)
|
|
43
|
-
@bridge.extend Bridge
|
|
44
|
-
@bridge.create_session(desired_capabilities)
|
|
45
|
-
|
|
46
|
-
super(@bridge, listener: listener)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
34
|
def browser
|
|
50
35
|
:firefox
|
|
51
36
|
end
|
|
52
37
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
ensure
|
|
56
|
-
@service&.stop
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
def create_capabilities(opts)
|
|
62
|
-
caps = opts.delete(:desired_capabilities) { Remote::Capabilities.firefox }
|
|
63
|
-
options = opts.delete(:options) { Options.new }
|
|
64
|
-
options = options.as_json
|
|
65
|
-
caps.merge!(options) unless options.empty?
|
|
66
|
-
|
|
67
|
-
caps
|
|
38
|
+
def bridge_class
|
|
39
|
+
Bridge
|
|
68
40
|
end
|
|
69
41
|
end # Driver
|
|
70
42
|
end # Firefox
|
|
@@ -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
|
|
@@ -20,12 +20,27 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Firefox
|
|
23
|
-
class Options
|
|
24
|
-
attr_reader :args, :prefs, :options, :profile
|
|
25
|
-
attr_accessor :binary, :log_level
|
|
26
|
-
|
|
23
|
+
class Options < WebDriver::Options
|
|
27
24
|
KEY = 'moz:firefoxOptions'
|
|
28
25
|
|
|
26
|
+
# see: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html
|
|
27
|
+
CAPABILITIES = {binary: 'binary',
|
|
28
|
+
args: 'args',
|
|
29
|
+
profile: 'profile',
|
|
30
|
+
log: 'log',
|
|
31
|
+
prefs: 'prefs'}.freeze
|
|
32
|
+
BROWSER = 'firefox'
|
|
33
|
+
|
|
34
|
+
CAPABILITIES.each_key do |key|
|
|
35
|
+
define_method key do
|
|
36
|
+
@options[key]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
define_method "#{key}=" do |value|
|
|
40
|
+
@options[key] = value
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
29
44
|
#
|
|
30
45
|
# Create a new Options instance, only for W3C-capable versions of Firefox.
|
|
31
46
|
#
|
|
@@ -42,13 +57,11 @@ module Selenium
|
|
|
42
57
|
# @option opts [Hash] :options A hash for raw options
|
|
43
58
|
#
|
|
44
59
|
|
|
45
|
-
def initialize(**opts)
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@
|
|
49
|
-
@
|
|
50
|
-
@prefs = opts.delete(:prefs) || {}
|
|
51
|
-
@options = opts.delete(:options) || {}
|
|
60
|
+
def initialize(log_level: nil, **opts)
|
|
61
|
+
super(**opts)
|
|
62
|
+
|
|
63
|
+
@options[:log] ||= {level: log_level} if log_level
|
|
64
|
+
process_profile(@options[:profile]) if @options.key?(:profile)
|
|
52
65
|
end
|
|
53
66
|
|
|
54
67
|
#
|
|
@@ -62,22 +75,8 @@ module Selenium
|
|
|
62
75
|
#
|
|
63
76
|
|
|
64
77
|
def add_argument(arg)
|
|
65
|
-
@args
|
|
66
|
-
|
|
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
|
|
78
|
+
@options[:args] ||= []
|
|
79
|
+
@options[:args] << arg
|
|
81
80
|
end
|
|
82
81
|
|
|
83
82
|
#
|
|
@@ -92,7 +91,8 @@ module Selenium
|
|
|
92
91
|
#
|
|
93
92
|
|
|
94
93
|
def add_preference(name, value)
|
|
95
|
-
prefs
|
|
94
|
+
@options[:prefs] ||= {}
|
|
95
|
+
@options[:prefs][name] = value
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
#
|
|
@@ -122,39 +122,34 @@ module Selenium
|
|
|
122
122
|
# @param [Profile, String] profile Profile to be used
|
|
123
123
|
#
|
|
124
124
|
|
|
125
|
+
undef profile=
|
|
125
126
|
def profile=(profile)
|
|
126
|
-
|
|
127
|
+
process_profile(profile)
|
|
127
128
|
end
|
|
128
129
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
def as_json(*)
|
|
134
|
-
opts = @options
|
|
135
|
-
|
|
136
|
-
opts[:profile] = @profile.encoded if @profile
|
|
137
|
-
opts[:args] = @args.to_a if @args.any?
|
|
138
|
-
opts[:binary] = @binary if @binary
|
|
139
|
-
opts[:prefs] = @prefs unless @prefs.empty?
|
|
140
|
-
opts[:log] = {level: @log_level} if @log_level
|
|
130
|
+
def log_level
|
|
131
|
+
@options.dig(:log, :level)
|
|
132
|
+
end
|
|
141
133
|
|
|
142
|
-
|
|
134
|
+
def log_level=(level)
|
|
135
|
+
@options[:log] = {level: level}
|
|
143
136
|
end
|
|
144
137
|
|
|
145
138
|
private
|
|
146
139
|
|
|
140
|
+
def process_browser_options(browser_options)
|
|
141
|
+
options = browser_options[KEY]
|
|
142
|
+
options['binary'] ||= Firefox.path if Firefox.path
|
|
143
|
+
end
|
|
144
|
+
|
|
147
145
|
def process_profile(profile)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
else
|
|
156
|
-
raise Error::WebDriverError, "don't know how to handle profile: #{profile.inspect}"
|
|
157
|
-
end
|
|
146
|
+
@options[:profile] = if profile.nil?
|
|
147
|
+
nil
|
|
148
|
+
elsif profile.is_a? Profile
|
|
149
|
+
profile
|
|
150
|
+
else
|
|
151
|
+
Profile.from_name(profile)
|
|
152
|
+
end
|
|
158
153
|
end
|
|
159
154
|
end # Options
|
|
160
155
|
end # Firefox
|
|
@@ -23,18 +23,10 @@ module Selenium
|
|
|
23
23
|
class Profile
|
|
24
24
|
include ProfileHelper
|
|
25
25
|
|
|
26
|
-
VALID_PREFERENCE_TYPES
|
|
27
|
-
WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
|
|
28
|
-
WEBDRIVER_PREFS = {
|
|
29
|
-
native_events: 'webdriver_enable_native_events',
|
|
30
|
-
untrusted_certs: 'webdriver_accept_untrusted_certs',
|
|
31
|
-
untrusted_issuer: 'webdriver_assume_untrusted_issuer',
|
|
32
|
-
port: 'webdriver_firefox_port',
|
|
33
|
-
log_file: 'webdriver.log.file'
|
|
34
|
-
}.freeze
|
|
26
|
+
VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
|
|
35
27
|
|
|
36
28
|
attr_reader :name, :log_file
|
|
37
|
-
attr_writer :secure_ssl, :
|
|
29
|
+
attr_writer :secure_ssl, :load_no_focus_lib
|
|
38
30
|
|
|
39
31
|
class << self
|
|
40
32
|
def ini
|
|
@@ -48,10 +40,8 @@ module Selenium
|
|
|
48
40
|
raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
|
|
49
41
|
end
|
|
50
42
|
|
|
51
|
-
def
|
|
52
|
-
|
|
53
|
-
File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
|
|
54
|
-
).freeze
|
|
43
|
+
def decoded(json)
|
|
44
|
+
JSON.parse(json)
|
|
55
45
|
end
|
|
56
46
|
end
|
|
57
47
|
|
|
@@ -70,14 +60,7 @@ module Selenium
|
|
|
70
60
|
def initialize(model = nil)
|
|
71
61
|
@model = verify_model(model)
|
|
72
62
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if model_prefs.empty?
|
|
76
|
-
assign_default_preferences
|
|
77
|
-
else
|
|
78
|
-
assign_updated_preferences(model_prefs)
|
|
79
|
-
end
|
|
80
|
-
|
|
63
|
+
@additional_prefs = read_model_prefs
|
|
81
64
|
@extensions = {}
|
|
82
65
|
end
|
|
83
66
|
|
|
@@ -121,12 +104,6 @@ module Selenium
|
|
|
121
104
|
self[WEBDRIVER_PREFS[:log_file]] = file
|
|
122
105
|
end
|
|
123
106
|
|
|
124
|
-
def add_webdriver_extension
|
|
125
|
-
return if @extensions.key?(:webdriver)
|
|
126
|
-
|
|
127
|
-
add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
|
|
128
|
-
end
|
|
129
|
-
|
|
130
107
|
#
|
|
131
108
|
# Add the extension (directory, .zip or .xpi) at the given path to the profile.
|
|
132
109
|
#
|
|
@@ -135,26 +112,6 @@ module Selenium
|
|
|
135
112
|
@extensions[name] = Extension.new(path)
|
|
136
113
|
end
|
|
137
114
|
|
|
138
|
-
def native_events?
|
|
139
|
-
@native_events == true
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
def load_no_focus_lib?
|
|
143
|
-
@load_no_focus_lib == true
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
def secure_ssl?
|
|
147
|
-
@secure_ssl == true
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
def assume_untrusted_certificate_issuer?
|
|
151
|
-
@untrusted_issuer == true
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
def assume_untrusted_certificate_issuer=(bool)
|
|
155
|
-
@untrusted_issuer = bool
|
|
156
|
-
end
|
|
157
|
-
|
|
158
115
|
def proxy=(proxy)
|
|
159
116
|
raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}" unless proxy.is_a? Proxy
|
|
160
117
|
|
|
@@ -178,30 +135,10 @@ module Selenium
|
|
|
178
135
|
end
|
|
179
136
|
end
|
|
180
137
|
|
|
181
|
-
|
|
182
|
-
Zipper.zip(layout_on_disk)
|
|
183
|
-
end
|
|
138
|
+
alias_method :as_json, :encoded
|
|
184
139
|
|
|
185
140
|
private
|
|
186
141
|
|
|
187
|
-
def assign_default_preferences
|
|
188
|
-
@native_events = DEFAULT_ENABLE_NATIVE_EVENTS
|
|
189
|
-
@secure_ssl = DEFAULT_SECURE_SSL
|
|
190
|
-
@untrusted_issuer = DEFAULT_ASSUME_UNTRUSTED_ISSUER
|
|
191
|
-
@load_no_focus_lib = DEFAULT_LOAD_NO_FOCUS_LIB
|
|
192
|
-
|
|
193
|
-
@additional_prefs = {}
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def assign_updated_preferences(model_prefs)
|
|
197
|
-
@native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == 'true'
|
|
198
|
-
@secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != 'true'
|
|
199
|
-
@untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == 'true'
|
|
200
|
-
# not stored in profile atm, so will always be false.
|
|
201
|
-
@load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == 'true'
|
|
202
|
-
@additional_prefs = model_prefs
|
|
203
|
-
end
|
|
204
|
-
|
|
205
142
|
def set_manual_proxy_preference(key, value)
|
|
206
143
|
return unless value
|
|
207
144
|
|
|
@@ -242,15 +179,7 @@ module Selenium
|
|
|
242
179
|
|
|
243
180
|
def update_user_prefs_in(directory)
|
|
244
181
|
path = File.join(directory, 'user.js')
|
|
245
|
-
prefs = read_user_prefs(path)
|
|
246
|
-
|
|
247
|
-
prefs.merge! self.class.default_preferences.fetch 'mutable'
|
|
248
|
-
prefs.merge! @additional_prefs
|
|
249
|
-
prefs.merge! self.class.default_preferences.fetch 'frozen'
|
|
250
|
-
|
|
251
|
-
prefs[WEBDRIVER_PREFS[:untrusted_certs]] = !secure_ssl?
|
|
252
|
-
prefs[WEBDRIVER_PREFS[:native_events]] = native_events?
|
|
253
|
-
prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
|
|
182
|
+
prefs = read_user_prefs(path).merge(@additional_prefs)
|
|
254
183
|
|
|
255
184
|
# If the user sets the home page, we should also start up there
|
|
256
185
|
prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']
|