selenium-webdriver 2.53.4 → 3.8.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 +7 -0
- data/CHANGES +363 -10
- data/LICENSE +1 -1
- data/README.md +2 -3
- data/lib/selenium-webdriver.rb +0 -2
- data/lib/selenium/server.rb +69 -70
- data/lib/selenium/webdriver.rb +32 -23
- data/lib/selenium/webdriver/atoms.rb +18 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +8 -0
- data/lib/selenium/webdriver/chrome.rb +8 -6
- data/lib/selenium/webdriver/chrome/driver.rb +112 -0
- data/lib/selenium/webdriver/chrome/options.rb +168 -0
- data/lib/selenium/webdriver/chrome/profile.rb +17 -17
- data/lib/selenium/webdriver/chrome/service.rb +22 -89
- data/lib/selenium/webdriver/common.rb +13 -6
- data/lib/selenium/webdriver/common/action_builder.rb +49 -57
- data/lib/selenium/webdriver/common/alert.rb +5 -15
- data/lib/selenium/webdriver/common/bridge_helper.rb +10 -17
- data/lib/selenium/webdriver/common/driver.rb +53 -68
- data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_addons.rb} +13 -23
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +1 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -5
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +4 -9
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +7 -7
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -7
- data/lib/selenium/webdriver/common/element.rb +57 -39
- data/lib/selenium/webdriver/common/error.rb +204 -106
- data/lib/selenium/webdriver/common/file_reaper.rb +3 -11
- data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -10
- data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -10
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +7 -18
- data/lib/selenium/webdriver/{safari/options.rb → common/interactions/input_device.rb} +20 -31
- data/lib/selenium/webdriver/common/interactions/interaction.rb +50 -0
- data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +16 -15
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +143 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +62 -0
- data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +11 -6
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +353 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +132 -0
- data/lib/selenium/webdriver/common/keyboard.rb +7 -14
- data/lib/selenium/webdriver/common/keys.rb +99 -82
- data/lib/selenium/webdriver/common/log_entry.rb +3 -6
- data/lib/selenium/webdriver/common/logger.rb +140 -0
- data/lib/selenium/webdriver/common/logs.rb +2 -6
- data/lib/selenium/webdriver/common/mouse.rb +9 -14
- data/lib/selenium/webdriver/common/navigation.rb +2 -6
- data/lib/selenium/webdriver/common/options.rb +20 -23
- data/lib/selenium/webdriver/common/platform.rb +70 -97
- data/lib/selenium/webdriver/common/port_prober.rb +3 -4
- data/lib/selenium/webdriver/common/profile_helper.rb +6 -11
- data/lib/selenium/webdriver/common/proxy.rb +58 -72
- data/lib/selenium/webdriver/common/search_context.rb +22 -29
- data/lib/selenium/webdriver/common/service.rb +161 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +6 -14
- data/lib/selenium/webdriver/common/socket_poller.rb +5 -12
- data/lib/selenium/webdriver/common/target_locator.rb +11 -15
- data/lib/selenium/webdriver/common/timeouts.rb +4 -8
- data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -6
- data/lib/selenium/webdriver/common/touch_screen.rb +19 -23
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +209 -0
- data/lib/selenium/webdriver/{phantomjs.rb → common/w3c_options.rb} +16 -14
- data/lib/selenium/webdriver/common/wait.rb +6 -13
- data/lib/selenium/webdriver/common/window.rb +48 -17
- data/lib/selenium/webdriver/common/zipper.rb +6 -10
- data/lib/selenium/webdriver/edge.rb +5 -12
- data/lib/selenium/webdriver/edge/bridge.rb +32 -63
- data/lib/selenium/webdriver/edge/driver.rb +73 -0
- data/lib/selenium/webdriver/edge/service.rb +18 -87
- data/lib/selenium/webdriver/firefox.rb +20 -11
- data/lib/selenium/webdriver/firefox/binary.rb +40 -56
- data/lib/selenium/webdriver/firefox/driver.rb +48 -0
- data/lib/selenium/webdriver/firefox/extension.rb +18 -8
- data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -11
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +13 -22
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +79 -0
- data/lib/selenium/webdriver/{iphone.rb → firefox/marionette/bridge.rb} +25 -6
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +96 -0
- data/lib/selenium/webdriver/firefox/options.rb +149 -0
- data/lib/selenium/webdriver/firefox/profile.rb +46 -46
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -18
- data/lib/selenium/webdriver/firefox/service.rb +23 -83
- data/lib/selenium/webdriver/firefox/util.rb +0 -4
- data/lib/selenium/webdriver/ie.rb +4 -8
- data/lib/selenium/webdriver/ie/driver.rb +90 -0
- data/lib/selenium/webdriver/ie/options.rb +136 -0
- data/lib/selenium/webdriver/ie/service.rb +58 -0
- data/lib/selenium/webdriver/remote.rb +8 -16
- data/lib/selenium/webdriver/remote/bridge.rb +96 -565
- data/lib/selenium/webdriver/remote/capabilities.rb +76 -94
- data/lib/selenium/webdriver/remote/driver.rb +49 -0
- data/lib/selenium/webdriver/remote/http/common.rb +22 -20
- data/lib/selenium/webdriver/remote/http/curb.rb +9 -12
- data/lib/selenium/webdriver/remote/http/default.rb +54 -41
- data/lib/selenium/webdriver/remote/http/persistent.rb +9 -8
- data/lib/selenium/webdriver/remote/oss/bridge.rb +586 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +221 -0
- data/lib/selenium/webdriver/remote/response.rb +39 -27
- data/lib/selenium/webdriver/remote/server_error.rb +1 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +573 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +290 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +148 -0
- data/lib/selenium/webdriver/safari.rb +20 -29
- data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +21 -30
- data/lib/selenium/webdriver/safari/service.rb +57 -0
- data/lib/selenium/webdriver/support.rb +1 -2
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -4
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -5
- data/lib/selenium/webdriver/support/color.rb +57 -42
- data/lib/selenium/webdriver/support/escaper.rb +41 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -40
- data/lib/selenium/webdriver/support/select.rb +33 -86
- data/selenium-webdriver.gemspec +22 -25
- metadata +254 -261
- data/lib/selenium-client.rb +0 -21
- data/lib/selenium/client.rb +0 -57
- data/lib/selenium/client/base.rb +0 -151
- data/lib/selenium/client/driver.rb +0 -29
- data/lib/selenium/client/errors.rb +0 -28
- data/lib/selenium/client/extensions.rb +0 -132
- data/lib/selenium/client/idiomatic.rb +0 -507
- data/lib/selenium/client/javascript_expression_builder.rb +0 -135
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
- data/lib/selenium/client/legacy_driver.rb +0 -1722
- data/lib/selenium/client/protocol.rb +0 -123
- data/lib/selenium/client/selenium_helper.rb +0 -49
- data/lib/selenium/rake/server_task.rb +0 -176
- data/lib/selenium/webdriver/android/bridge.rb +0 -68
- data/lib/selenium/webdriver/chrome/bridge.rb +0 -139
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
- data/lib/selenium/webdriver/common/html5/location.rb +0 -19
- data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
- data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
- data/lib/selenium/webdriver/ie/bridge.rb +0 -88
- data/lib/selenium/webdriver/ie/server.rb +0 -133
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
- data/lib/selenium/webdriver/remote/commands.rb +0 -211
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
- data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
- data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
- data/lib/selenium/webdriver/safari/bridge.rb +0 -135
- data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
- data/lib/selenium/webdriver/safari/server.rb +0 -187
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -23,15 +21,15 @@ module Selenium
|
|
|
23
21
|
class Profile
|
|
24
22
|
include ProfileHelper
|
|
25
23
|
|
|
26
|
-
VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String]
|
|
24
|
+
VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
|
|
27
25
|
WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
|
|
28
26
|
WEBDRIVER_PREFS = {
|
|
29
|
-
:
|
|
30
|
-
:
|
|
31
|
-
:
|
|
32
|
-
:
|
|
33
|
-
:
|
|
34
|
-
}
|
|
27
|
+
native_events: 'webdriver_enable_native_events',
|
|
28
|
+
untrusted_certs: 'webdriver_accept_untrusted_certs',
|
|
29
|
+
untrusted_issuer: 'webdriver_assume_untrusted_issuer',
|
|
30
|
+
port: 'webdriver_firefox_port',
|
|
31
|
+
log_file: 'webdriver.log.file'
|
|
32
|
+
}.freeze
|
|
35
33
|
|
|
36
34
|
attr_reader :name, :log_file
|
|
37
35
|
attr_writer :secure_ssl, :native_events, :load_no_focus_lib
|
|
@@ -42,7 +40,9 @@ module Selenium
|
|
|
42
40
|
end
|
|
43
41
|
|
|
44
42
|
def from_name(name)
|
|
45
|
-
ini[name]
|
|
43
|
+
profile = ini[name]
|
|
44
|
+
return profile if profile
|
|
45
|
+
raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def default_preferences
|
|
@@ -78,18 +78,19 @@ module Selenium
|
|
|
78
78
|
@additional_prefs = {}
|
|
79
79
|
else
|
|
80
80
|
# TODO: clean this up
|
|
81
|
-
@native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) ==
|
|
82
|
-
@secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) !=
|
|
83
|
-
@untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) ==
|
|
84
|
-
|
|
81
|
+
@native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == 'true'
|
|
82
|
+
@secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != 'true'
|
|
83
|
+
@untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == 'true'
|
|
84
|
+
# not stored in profile atm, so will always be false.
|
|
85
|
+
@load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == 'true'
|
|
85
86
|
@additional_prefs = model_prefs
|
|
86
87
|
end
|
|
87
88
|
|
|
88
|
-
@extensions
|
|
89
|
+
@extensions = {}
|
|
89
90
|
end
|
|
90
91
|
|
|
91
92
|
def layout_on_disk
|
|
92
|
-
profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir(
|
|
93
|
+
profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-profile')
|
|
93
94
|
FileReaper << profile_dir
|
|
94
95
|
|
|
95
96
|
install_extensions(profile_dir)
|
|
@@ -100,7 +101,6 @@ module Selenium
|
|
|
100
101
|
profile_dir
|
|
101
102
|
end
|
|
102
103
|
|
|
103
|
-
|
|
104
104
|
#
|
|
105
105
|
# Set a preference for this particular profile.
|
|
106
106
|
#
|
|
@@ -109,11 +109,11 @@ module Selenium
|
|
|
109
109
|
#
|
|
110
110
|
|
|
111
111
|
def []=(key, value)
|
|
112
|
-
unless VALID_PREFERENCE_TYPES.any? { |e| value.
|
|
112
|
+
unless VALID_PREFERENCE_TYPES.any? { |e| value.is_a? e }
|
|
113
113
|
raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
-
if value.
|
|
116
|
+
if value.is_a?(String) && Util.stringified?(value)
|
|
117
117
|
raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
|
|
118
118
|
end
|
|
119
119
|
|
|
@@ -130,9 +130,8 @@ module Selenium
|
|
|
130
130
|
end
|
|
131
131
|
|
|
132
132
|
def add_webdriver_extension
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
end
|
|
133
|
+
return if @extensions.key?(:webdriver)
|
|
134
|
+
add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
|
|
136
135
|
end
|
|
137
136
|
|
|
138
137
|
#
|
|
@@ -164,7 +163,7 @@ module Selenium
|
|
|
164
163
|
end
|
|
165
164
|
|
|
166
165
|
def proxy=(proxy)
|
|
167
|
-
unless proxy.
|
|
166
|
+
unless proxy.is_a? Proxy
|
|
168
167
|
raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
|
|
169
168
|
end
|
|
170
169
|
|
|
@@ -172,16 +171,16 @@ module Selenium
|
|
|
172
171
|
when :manual
|
|
173
172
|
self['network.proxy.type'] = 1
|
|
174
173
|
|
|
175
|
-
set_manual_proxy_preference
|
|
176
|
-
set_manual_proxy_preference
|
|
177
|
-
set_manual_proxy_preference
|
|
178
|
-
set_manual_proxy_preference
|
|
174
|
+
set_manual_proxy_preference 'ftp', proxy.ftp
|
|
175
|
+
set_manual_proxy_preference 'http', proxy.http
|
|
176
|
+
set_manual_proxy_preference 'ssl', proxy.ssl
|
|
177
|
+
set_manual_proxy_preference 'socks', proxy.socks
|
|
179
178
|
|
|
180
|
-
if proxy.no_proxy
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
179
|
+
self['network.proxy.no_proxies_on'] = if proxy.no_proxy
|
|
180
|
+
proxy.no_proxy
|
|
181
|
+
else
|
|
182
|
+
''
|
|
183
|
+
end
|
|
185
184
|
when :pac
|
|
186
185
|
self['network.proxy.type'] = 2
|
|
187
186
|
self['network.proxy.autoconfig_url'] = proxy.pac
|
|
@@ -190,8 +189,10 @@ module Selenium
|
|
|
190
189
|
else
|
|
191
190
|
raise ArgumentError, "unsupported proxy type #{proxy.type}"
|
|
192
191
|
end
|
|
192
|
+
end
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
def encoded
|
|
195
|
+
Zipper.zip(layout_on_disk)
|
|
195
196
|
end
|
|
196
197
|
|
|
197
198
|
private
|
|
@@ -199,17 +200,17 @@ module Selenium
|
|
|
199
200
|
def set_manual_proxy_preference(key, value)
|
|
200
201
|
return unless value
|
|
201
202
|
|
|
202
|
-
host, port = value.to_s.split(
|
|
203
|
+
host, port = value.to_s.split(':', 2)
|
|
203
204
|
|
|
204
205
|
self["network.proxy.#{key}"] = host
|
|
205
206
|
self["network.proxy.#{key}_port"] = Integer(port) if port
|
|
206
207
|
end
|
|
207
208
|
|
|
208
209
|
def install_extensions(directory)
|
|
209
|
-
destination = File.join(directory,
|
|
210
|
+
destination = File.join(directory, 'extensions')
|
|
210
211
|
|
|
211
212
|
@extensions.each do |name, extension|
|
|
212
|
-
|
|
213
|
+
WebDriver.logger.debug({extenstion: name}.inspect)
|
|
213
214
|
extension.write_to(destination)
|
|
214
215
|
end
|
|
215
216
|
end
|
|
@@ -221,7 +222,7 @@ module Selenium
|
|
|
221
222
|
end
|
|
222
223
|
|
|
223
224
|
def delete_extensions_cache(directory)
|
|
224
|
-
FileUtils.rm_f File.join(directory,
|
|
225
|
+
FileUtils.rm_f File.join(directory, 'extensions.cache')
|
|
225
226
|
end
|
|
226
227
|
|
|
227
228
|
def delete_lock_files(directory)
|
|
@@ -247,7 +248,7 @@ module Selenium
|
|
|
247
248
|
prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
|
|
248
249
|
|
|
249
250
|
# If the user sets the home page, we should also start up there
|
|
250
|
-
prefs[
|
|
251
|
+
prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']
|
|
251
252
|
|
|
252
253
|
write_prefs prefs, path
|
|
253
254
|
end
|
|
@@ -257,25 +258,24 @@ module Selenium
|
|
|
257
258
|
return prefs unless File.exist?(path)
|
|
258
259
|
|
|
259
260
|
File.read(path).split("\n").each do |line|
|
|
260
|
-
|
|
261
|
-
|
|
261
|
+
next unless line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
|
|
262
|
+
key = Regexp.last_match(1).strip
|
|
263
|
+
value = Regexp.last_match(2).strip
|
|
262
264
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
end
|
|
265
|
+
# wrap the value in an array to make it a valid JSON string.
|
|
266
|
+
prefs[key] = JSON.parse("[#{value}]").first
|
|
266
267
|
end
|
|
267
268
|
|
|
268
269
|
prefs
|
|
269
270
|
end
|
|
270
271
|
|
|
271
272
|
def write_prefs(prefs, path)
|
|
272
|
-
File.open(path,
|
|
273
|
+
File.open(path, 'w') do |file|
|
|
273
274
|
prefs.each do |key, value|
|
|
274
275
|
file.puts %{user_pref("#{key}", #{value.to_json});}
|
|
275
276
|
end
|
|
276
|
-
|
|
277
|
+
end
|
|
277
278
|
end
|
|
278
|
-
|
|
279
279
|
end # Profile
|
|
280
280
|
end # Firefox
|
|
281
281
|
end # WebDriver
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,12 +18,10 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Firefox
|
|
23
|
-
|
|
24
21
|
# @api private
|
|
25
22
|
class ProfilesIni
|
|
26
|
-
|
|
27
23
|
def initialize
|
|
28
|
-
@ini_path = File.join(Util.app_data_path,
|
|
24
|
+
@ini_path = File.join(Util.app_data_path, 'profiles.ini')
|
|
29
25
|
@profile_paths = {}
|
|
30
26
|
|
|
31
27
|
parse if File.exist?(@ini_path)
|
|
@@ -52,29 +48,23 @@ module Selenium
|
|
|
52
48
|
string.split("\n").each do |line|
|
|
53
49
|
case line
|
|
54
50
|
when /^\[Profile/
|
|
55
|
-
|
|
56
|
-
@profile_paths[name] = p
|
|
57
|
-
name, path = nil
|
|
58
|
-
end
|
|
51
|
+
name, path = nil if path_for(name, is_relative, path)
|
|
59
52
|
when /^Name=(.+)$/
|
|
60
|
-
name =
|
|
53
|
+
name = Regexp.last_match(1).strip
|
|
61
54
|
when /^IsRelative=(.+)$/
|
|
62
|
-
is_relative =
|
|
55
|
+
is_relative = Regexp.last_match(1).strip == '1'
|
|
63
56
|
when /^Path=(.+)$/
|
|
64
|
-
path =
|
|
57
|
+
path = Regexp.last_match(1).strip
|
|
58
|
+
p = path_for(name, is_relative, path)
|
|
59
|
+
@profile_paths[name] = p if p
|
|
65
60
|
end
|
|
66
61
|
end
|
|
67
|
-
|
|
68
|
-
if p = path_for(name, is_relative, path)
|
|
69
|
-
@profile_paths[name] = p
|
|
70
|
-
end
|
|
71
62
|
end
|
|
72
63
|
|
|
73
64
|
def path_for(name, is_relative, path)
|
|
74
65
|
return unless [name, path].any?
|
|
75
|
-
|
|
66
|
+
is_relative ? File.join(Util.app_data_path, path) : path
|
|
76
67
|
end
|
|
77
|
-
|
|
78
68
|
end # ProfilesIni
|
|
79
69
|
end # Firefox
|
|
80
70
|
end # WebDriver
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,104 +18,46 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Firefox
|
|
23
|
-
|
|
24
21
|
#
|
|
25
22
|
# @api private
|
|
26
23
|
#
|
|
27
|
-
class Service
|
|
28
|
-
START_TIMEOUT = 20
|
|
29
|
-
SOCKET_LOCK_TIMEOUT = 45
|
|
30
|
-
STOP_TIMEOUT = 5
|
|
31
|
-
DEFAULT_PORT = 4444
|
|
32
|
-
MISSING_TEXT = "Unable to find geckodriver. Please download the executable from https://github.com/mozilla/geckodriver/releases"
|
|
33
|
-
|
|
34
|
-
def self.executable_path
|
|
35
|
-
@executable_path ||= (
|
|
36
|
-
path = Platform.find_binary("geckodriver*") || Platform.find_binary("wires*")
|
|
37
|
-
path or raise Error::WebDriverError, MISSING_TEXT
|
|
38
|
-
Platform.assert_executable path
|
|
39
|
-
|
|
40
|
-
path
|
|
41
|
-
)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def self.executable_path=(path)
|
|
45
|
-
Platform.assert_executable path
|
|
46
|
-
@executable_path = path
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def self.default_service(*extra_args)
|
|
50
|
-
new executable_path, DEFAULT_PORT, *extra_args
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def initialize(executable_path, port, *extra_args)
|
|
54
|
-
@executable_path = executable_path
|
|
55
|
-
@host = Platform.localhost
|
|
56
|
-
@port = Integer(port)
|
|
57
|
-
|
|
58
|
-
raise Error::WebDriverError, "invalid port: #{@port}" if @port < 1
|
|
59
|
-
|
|
60
|
-
@extra_args = extra_args
|
|
61
|
-
end
|
|
62
24
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
end
|
|
25
|
+
class Service < WebDriver::Service
|
|
26
|
+
DEFAULT_PORT = 4444
|
|
27
|
+
@executable = 'geckodriver*'.freeze
|
|
28
|
+
@missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
|
|
29
|
+
Unable to find Mozilla geckodriver. Please download the server from
|
|
30
|
+
https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.
|
|
31
|
+
More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
|
|
32
|
+
ERROR
|
|
72
33
|
|
|
73
34
|
def stop
|
|
74
|
-
return if @process.nil? || @process.exited?
|
|
75
|
-
|
|
76
|
-
Net::HTTP.start(@host, @port) do |http|
|
|
77
|
-
http.open_timeout = STOP_TIMEOUT / 2
|
|
78
|
-
http.read_timeout = STOP_TIMEOUT / 2
|
|
79
|
-
|
|
80
|
-
http.head("/shutdown")
|
|
81
|
-
end
|
|
82
|
-
ensure
|
|
83
35
|
stop_process
|
|
84
36
|
end
|
|
85
37
|
|
|
86
|
-
|
|
87
|
-
URI.parse "http://#{@host}:#{@port}"
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def find_free_port
|
|
91
|
-
@port = PortProber.above @port
|
|
92
|
-
end
|
|
38
|
+
private
|
|
93
39
|
|
|
94
40
|
def start_process
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
41
|
+
@process = build_process(@executable_path,
|
|
42
|
+
"--binary=#{Firefox::Binary.path}",
|
|
43
|
+
"--port=#{@port}",
|
|
44
|
+
*@extra_args)
|
|
99
45
|
@process.start
|
|
100
46
|
end
|
|
101
47
|
|
|
102
|
-
def
|
|
103
|
-
@
|
|
104
|
-
rescue ChildProcess::TimeoutError
|
|
105
|
-
@process.stop STOP_TIMEOUT
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def connect_until_stable
|
|
109
|
-
@socket_poller = SocketPoller.new @host, @port, START_TIMEOUT
|
|
110
|
-
|
|
111
|
-
unless @socket_poller.connected?
|
|
112
|
-
raise Error::WebDriverError, "unable to connect to Mozilla geckodriver #{@host}:#{@port}"
|
|
113
|
-
end
|
|
48
|
+
def cannot_connect_error_text
|
|
49
|
+
"unable to connect to Mozilla geckodriver #{@host}:#{@port}"
|
|
114
50
|
end
|
|
115
51
|
|
|
116
|
-
def
|
|
117
|
-
|
|
52
|
+
def extract_service_args(driver_opts)
|
|
53
|
+
driver_args = super
|
|
54
|
+
driver_args << "--binary=#{driver_opts[:binary]}" if driver_opts.key?(:binary)
|
|
55
|
+
driver_args << "–-log=#{driver_opts[:log]}" if driver_opts.key?(:log)
|
|
56
|
+
driver_args << "–-marionette-port=#{driver_opts[:marionette_port]}" if driver_opts.key?(:marionette_port)
|
|
57
|
+
driver_args << "–-host=#{driver_opts[:host]}" if driver_opts.key?(:host)
|
|
58
|
+
driver_args
|
|
118
59
|
end
|
|
119
|
-
|
|
120
60
|
end # Service
|
|
121
61
|
end # Firefox
|
|
122
62
|
end # WebDriver
|
|
123
|
-
end #
|
|
63
|
+
end # Selenium
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,7 +18,6 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Firefox
|
|
23
|
-
|
|
24
21
|
# @api private
|
|
25
22
|
module Util
|
|
26
23
|
module_function
|
|
@@ -41,7 +38,6 @@ module Selenium
|
|
|
41
38
|
def stringified?(str)
|
|
42
39
|
str =~ /^".*"$/
|
|
43
40
|
end
|
|
44
|
-
|
|
45
41
|
end # Util
|
|
46
42
|
end # Firefox
|
|
47
43
|
end # WebDriver
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -17,10 +15,12 @@
|
|
|
17
15
|
# specific language governing permissions and limitations
|
|
18
16
|
# under the License.
|
|
19
17
|
|
|
18
|
+
require 'selenium/webdriver/ie/driver'
|
|
19
|
+
require 'selenium/webdriver/ie/options'
|
|
20
|
+
require 'selenium/webdriver/ie/service'
|
|
21
|
+
|
|
20
22
|
module Selenium
|
|
21
23
|
module WebDriver
|
|
22
|
-
|
|
23
|
-
# @api private
|
|
24
24
|
module IE
|
|
25
25
|
def self.driver_path=(path)
|
|
26
26
|
Platform.assert_executable path
|
|
@@ -30,10 +30,6 @@ module Selenium
|
|
|
30
30
|
def self.driver_path
|
|
31
31
|
@driver_path ||= nil
|
|
32
32
|
end
|
|
33
|
-
|
|
34
33
|
end # IE
|
|
35
34
|
end # WebDriver
|
|
36
35
|
end # Selenium
|
|
37
|
-
|
|
38
|
-
require 'selenium/webdriver/ie/server'
|
|
39
|
-
require 'selenium/webdriver/ie/bridge'
|