selenium-webdriver 4.0.0.alpha2 → 4.0.0.alpha3
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 +38 -0
- data/lib/selenium/server.rb +2 -2
- data/lib/selenium/webdriver.rb +9 -7
- data/lib/selenium/webdriver/chrome.rb +6 -7
- data/lib/selenium/webdriver/chrome/bridge.rb +21 -3
- data/lib/selenium/webdriver/chrome/driver.rb +3 -41
- data/lib/selenium/webdriver/chrome/options.rb +87 -52
- data/lib/selenium/webdriver/chrome/profile.rb +2 -2
- data/lib/selenium/webdriver/common.rb +1 -0
- data/lib/selenium/webdriver/common/driver.rb +7 -0
- data/lib/selenium/webdriver/common/options.rb +92 -0
- data/lib/selenium/webdriver/common/profile_helper.rb +10 -2
- data/lib/selenium/webdriver/common/service.rb +35 -11
- data/lib/selenium/webdriver/edge.rb +25 -7
- data/lib/selenium/webdriver/edge_chrome/bridge.rb +30 -0
- data/lib/selenium/webdriver/edge_chrome/driver.rb +38 -0
- data/lib/selenium/webdriver/edge_chrome/options.rb +34 -0
- data/lib/selenium/webdriver/edge_chrome/profile.rb +33 -0
- data/lib/selenium/webdriver/edge_chrome/service.rb +40 -0
- data/lib/selenium/webdriver/{edge → edge_html}/driver.rb +2 -19
- data/lib/selenium/webdriver/{edge → edge_html}/options.rb +26 -15
- data/lib/selenium/webdriver/{edge → edge_html}/service.rb +1 -1
- data/lib/selenium/webdriver/firefox.rb +9 -12
- data/lib/selenium/webdriver/firefox/binary.rb +2 -2
- data/lib/selenium/webdriver/firefox/driver.rb +3 -19
- data/lib/selenium/webdriver/firefox/extension.rb +8 -0
- data/lib/selenium/webdriver/firefox/options.rb +45 -48
- data/lib/selenium/webdriver/firefox/profile.rb +5 -3
- data/lib/selenium/webdriver/ie.rb +4 -5
- data/lib/selenium/webdriver/ie/driver.rb +3 -20
- data/lib/selenium/webdriver/ie/options.rb +9 -29
- data/lib/selenium/webdriver/remote.rb +16 -10
- data/lib/selenium/webdriver/remote/capabilities.rb +10 -0
- data/lib/selenium/webdriver/remote/http/default.rb +6 -1
- data/lib/selenium/webdriver/remote/http/persistent.rb +5 -6
- data/lib/selenium/webdriver/safari.rb +5 -6
- data/lib/selenium/webdriver/safari/bridge.rb +3 -3
- data/lib/selenium/webdriver/safari/driver.rb +4 -18
- data/lib/selenium/webdriver/safari/options.rb +18 -12
- data/lib/selenium/webdriver/version.rb +1 -1
- metadata +11 -5
@@ -19,7 +19,7 @@
|
|
19
19
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
|
-
module
|
22
|
+
module EdgeHtml
|
23
23
|
|
24
24
|
#
|
25
25
|
# Driver implementation for Microsoft Edge.
|
@@ -31,7 +31,7 @@ module Selenium
|
|
31
31
|
include DriverExtensions::TakesScreenshot
|
32
32
|
|
33
33
|
def initialize(opts = {})
|
34
|
-
opts[:desired_capabilities]
|
34
|
+
opts[:desired_capabilities] ||= Remote::Capabilities.edge
|
35
35
|
|
36
36
|
opts[:url] ||= service_url(opts)
|
37
37
|
|
@@ -47,23 +47,6 @@ module Selenium
|
|
47
47
|
def browser
|
48
48
|
:edge
|
49
49
|
end
|
50
|
-
|
51
|
-
def quit
|
52
|
-
super
|
53
|
-
ensure
|
54
|
-
@service&.stop
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def create_capabilities(opts)
|
60
|
-
caps = opts.delete(:desired_capabilities) { Remote::Capabilities.edge }
|
61
|
-
options = opts.delete(:options) { Options.new }
|
62
|
-
options = options.as_json
|
63
|
-
caps.merge!(options) unless options.empty?
|
64
|
-
|
65
|
-
caps
|
66
|
-
end
|
67
50
|
end # Driver
|
68
51
|
end # Edge
|
69
52
|
end # WebDriver
|
@@ -19,10 +19,22 @@
|
|
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
|
+
|
29
|
+
CAPABILITIES.each_key do |key|
|
30
|
+
define_method key do
|
31
|
+
@options[key]
|
32
|
+
end
|
33
|
+
|
34
|
+
define_method "#{key}=" do |value|
|
35
|
+
@options[key] = value
|
36
|
+
end
|
37
|
+
end
|
26
38
|
|
27
39
|
#
|
28
40
|
# Create a new Options instance for Edge.
|
@@ -40,9 +52,8 @@ module Selenium
|
|
40
52
|
#
|
41
53
|
|
42
54
|
def initialize(**opts)
|
43
|
-
|
44
|
-
@
|
45
|
-
@start_page = opts.delete(:start_page)
|
55
|
+
super
|
56
|
+
@options[:extensions]&.each(&method(:validate_extension))
|
46
57
|
end
|
47
58
|
|
48
59
|
#
|
@@ -56,9 +67,9 @@ module Selenium
|
|
56
67
|
#
|
57
68
|
|
58
69
|
def add_extension_path(path)
|
59
|
-
|
60
|
-
|
61
|
-
@extension_paths << path
|
70
|
+
validate_extension(path)
|
71
|
+
@options[:extension_paths] ||= []
|
72
|
+
@options[:extension_paths] << path
|
62
73
|
end
|
63
74
|
|
64
75
|
#
|
@@ -66,13 +77,13 @@ module Selenium
|
|
66
77
|
#
|
67
78
|
|
68
79
|
def as_json(*)
|
69
|
-
|
80
|
+
generate_as_json(super)
|
81
|
+
end
|
70
82
|
|
71
|
-
|
72
|
-
opts['ms:extensionPaths'] = @extension_paths if @extension_paths.any?
|
73
|
-
opts['ms:startPage'] = @start_page if @start_page
|
83
|
+
private
|
74
84
|
|
75
|
-
|
85
|
+
def validate_extension(path)
|
86
|
+
raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
|
76
87
|
end
|
77
88
|
end # Options
|
78
89
|
end # Edge
|
@@ -21,19 +21,18 @@ 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 :Binary, 'selenium/webdriver/firefox/binary'
|
29
|
+
autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
|
30
|
+
autoload :Profile, 'selenium/webdriver/firefox/profile'
|
31
|
+
autoload :Bridge, 'selenium/webdriver/firefox/bridge'
|
32
|
+
autoload :Driver, 'selenium/webdriver/firefox/driver'
|
33
|
+
autoload :Options, 'selenium/webdriver/firefox/options'
|
34
|
+
autoload :Service, 'selenium/webdriver/firefox/service'
|
35
|
+
|
37
36
|
DEFAULT_PORT = 7055
|
38
37
|
DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
|
39
38
|
DEFAULT_SECURE_SSL = false
|
@@ -58,5 +57,3 @@ module Selenium
|
|
58
57
|
end # Firefox
|
59
58
|
end # WebDriver
|
60
59
|
end # Selenium
|
61
|
-
|
62
|
-
require 'selenium/webdriver/firefox/service'
|
@@ -53,8 +53,8 @@ module Selenium
|
|
53
53
|
@path = Platform.cygwin_path(@path, windows: true) if Platform.cygwin?
|
54
54
|
|
55
55
|
unless File.file?(@path.to_s)
|
56
|
-
error = "Could not find Firefox binary (os=#{Platform.os}). "
|
57
|
-
|
56
|
+
error = "Could not find Firefox binary (os=#{Platform.os}). " \
|
57
|
+
"Make sure Firefox is installed or set the path manually with #{self}.path="
|
58
58
|
raise Error::WebDriverError, error
|
59
59
|
end
|
60
60
|
|
@@ -32,16 +32,17 @@ module Selenium
|
|
32
32
|
include DriverExtensions::TakesScreenshot
|
33
33
|
|
34
34
|
def initialize(opts = {})
|
35
|
-
opts[:desired_capabilities]
|
35
|
+
opts[:desired_capabilities] ||= Remote::Capabilities.firefox
|
36
36
|
|
37
37
|
opts[:url] ||= service_url(opts)
|
38
38
|
|
39
39
|
listener = opts.delete(:listener)
|
40
40
|
desired_capabilities = opts.delete(:desired_capabilities)
|
41
|
+
options = opts.delete(:options)
|
41
42
|
|
42
43
|
@bridge = Remote::Bridge.new(opts)
|
43
44
|
@bridge.extend Bridge
|
44
|
-
@bridge.create_session(desired_capabilities)
|
45
|
+
@bridge.create_session(desired_capabilities, options)
|
45
46
|
|
46
47
|
super(@bridge, listener: listener)
|
47
48
|
end
|
@@ -49,23 +50,6 @@ module Selenium
|
|
49
50
|
def browser
|
50
51
|
:firefox
|
51
52
|
end
|
52
|
-
|
53
|
-
def quit
|
54
|
-
super
|
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
|
68
|
-
end
|
69
53
|
end # Driver
|
70
54
|
end # Firefox
|
71
55
|
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
|
@@ -20,12 +20,26 @@
|
|
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
|
+
|
33
|
+
CAPABILITIES.each_key do |key|
|
34
|
+
define_method key do
|
35
|
+
@options[key]
|
36
|
+
end
|
37
|
+
|
38
|
+
define_method "#{key}=" do |value|
|
39
|
+
@options[key] = value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
29
43
|
#
|
30
44
|
# Create a new Options instance, only for W3C-capable versions of Firefox.
|
31
45
|
#
|
@@ -42,13 +56,11 @@ 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
|
-
@prefs = opts.delete(:prefs) || {}
|
51
|
-
@options = opts.delete(:options) || {}
|
59
|
+
def initialize(log_level: nil, **opts)
|
60
|
+
super(opts)
|
61
|
+
|
62
|
+
@options[:log] ||= {level: log_level} if log_level
|
63
|
+
process_profile(@options[:profile]) if @options.key?(:profile)
|
52
64
|
end
|
53
65
|
|
54
66
|
#
|
@@ -62,22 +74,8 @@ module Selenium
|
|
62
74
|
#
|
63
75
|
|
64
76
|
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
|
77
|
+
@options[:args] ||= []
|
78
|
+
@options[:args] << arg
|
81
79
|
end
|
82
80
|
|
83
81
|
#
|
@@ -92,7 +90,8 @@ module Selenium
|
|
92
90
|
#
|
93
91
|
|
94
92
|
def add_preference(name, value)
|
95
|
-
prefs
|
93
|
+
@options[:prefs] ||= {}
|
94
|
+
@options[:prefs][name] = value
|
96
95
|
end
|
97
96
|
|
98
97
|
#
|
@@ -122,8 +121,17 @@ module Selenium
|
|
122
121
|
# @param [Profile, String] profile Profile to be used
|
123
122
|
#
|
124
123
|
|
124
|
+
undef profile=
|
125
125
|
def profile=(profile)
|
126
|
-
|
126
|
+
process_profile(profile)
|
127
|
+
end
|
128
|
+
|
129
|
+
def log_level
|
130
|
+
@options.dig(:log, :level)
|
131
|
+
end
|
132
|
+
|
133
|
+
def log_level=(level)
|
134
|
+
@options[:log] = {level: level}
|
127
135
|
end
|
128
136
|
|
129
137
|
#
|
@@ -131,30 +139,19 @@ module Selenium
|
|
131
139
|
#
|
132
140
|
|
133
141
|
def as_json(*)
|
134
|
-
|
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
|
141
|
-
|
142
|
-
{KEY => opts}
|
142
|
+
{KEY => generate_as_json(super)}
|
143
143
|
end
|
144
144
|
|
145
145
|
private
|
146
146
|
|
147
147
|
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
|
148
|
+
@options[:profile] = if profile.nil?
|
149
|
+
nil
|
150
|
+
elsif profile.is_a? Profile
|
151
|
+
profile
|
152
|
+
else
|
153
|
+
Profile.from_name(profile)
|
154
|
+
end
|
158
155
|
end
|
159
156
|
end # Options
|
160
157
|
end # Firefox
|
@@ -53,6 +53,10 @@ module Selenium
|
|
53
53
|
File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
|
54
54
|
).freeze
|
55
55
|
end
|
56
|
+
|
57
|
+
def decoded(json)
|
58
|
+
JSON.parse(json)
|
59
|
+
end
|
56
60
|
end
|
57
61
|
|
58
62
|
#
|
@@ -178,9 +182,7 @@ module Selenium
|
|
178
182
|
end
|
179
183
|
end
|
180
184
|
|
181
|
-
|
182
|
-
Zipper.zip(layout_on_disk)
|
183
|
-
end
|
185
|
+
alias_method :as_json, :encoded
|
184
186
|
|
185
187
|
private
|
186
188
|
|
@@ -17,12 +17,13 @@
|
|
17
17
|
# specific language governing permissions and limitations
|
18
18
|
# under the License.
|
19
19
|
|
20
|
-
require 'selenium/webdriver/ie/driver'
|
21
|
-
require 'selenium/webdriver/ie/options'
|
22
|
-
|
23
20
|
module Selenium
|
24
21
|
module WebDriver
|
25
22
|
module IE
|
23
|
+
autoload :Driver, 'selenium/webdriver/ie/driver'
|
24
|
+
autoload :Options, 'selenium/webdriver/ie/options'
|
25
|
+
autoload :Service, 'selenium/webdriver/ie/service'
|
26
|
+
|
26
27
|
def self.driver_path=(path)
|
27
28
|
WebDriver.logger.deprecate 'Selenium::WebDriver::IE#driver_path=',
|
28
29
|
'Selenium::WebDriver::IE::Service#driver_path='
|
@@ -37,5 +38,3 @@ module Selenium
|
|
37
38
|
end # IE
|
38
39
|
end # WebDriver
|
39
40
|
end # Selenium
|
40
|
-
|
41
|
-
require 'selenium/webdriver/ie/service'
|
@@ -32,15 +32,16 @@ module Selenium
|
|
32
32
|
include DriverExtensions::TakesScreenshot
|
33
33
|
|
34
34
|
def initialize(opts = {})
|
35
|
-
opts[:desired_capabilities]
|
35
|
+
opts[:desired_capabilities] ||= Remote::Capabilities.internet_explorer
|
36
36
|
|
37
37
|
opts[:url] ||= service_url(opts)
|
38
38
|
|
39
39
|
listener = opts.delete(:listener)
|
40
40
|
desired_capabilities = opts.delete(:desired_capabilities)
|
41
|
+
options = opts.delete(:options)
|
41
42
|
|
42
43
|
@bridge = Remote::Bridge.new(opts)
|
43
|
-
@bridge.create_session(desired_capabilities)
|
44
|
+
@bridge.create_session(desired_capabilities, options)
|
44
45
|
|
45
46
|
super(@bridge, listener: listener)
|
46
47
|
end
|
@@ -48,24 +49,6 @@ module Selenium
|
|
48
49
|
def browser
|
49
50
|
:internet_explorer
|
50
51
|
end
|
51
|
-
|
52
|
-
def quit
|
53
|
-
super
|
54
|
-
ensure
|
55
|
-
@service&.stop
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
def create_capabilities(opts)
|
61
|
-
caps = opts.delete(:desired_capabilities) { Remote::Capabilities.internet_explorer }
|
62
|
-
options = opts.delete(:options) { Options.new }
|
63
|
-
options = options.as_json
|
64
|
-
caps.merge!(options) unless options.empty?
|
65
|
-
|
66
|
-
caps
|
67
|
-
end
|
68
|
-
|
69
52
|
end # Driver
|
70
53
|
end # IE
|
71
54
|
end # WebDriver
|