selenium-webdriver 2.45.0 → 3.142.7
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 +795 -3
- data/Gemfile +2 -0
- data/{COPYING → LICENSE} +1 -3
- data/README.md +13 -9
- data/lib/selenium/server.rb +93 -71
- data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
- data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
- data/lib/selenium/webdriver/atoms.rb +37 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
- data/lib/selenium/webdriver/chrome/driver.rb +127 -0
- data/lib/selenium/webdriver/chrome/options.rb +190 -0
- data/lib/selenium/webdriver/chrome/profile.rb +40 -20
- data/lib/selenium/webdriver/chrome/service.rb +46 -62
- data/lib/selenium/webdriver/chrome.rb +34 -6
- data/lib/selenium/webdriver/common/action_builder.rb +69 -56
- data/lib/selenium/webdriver/common/alert.rb +25 -8
- data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
- data/lib/selenium/webdriver/common/driver.rb +90 -63
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
- data/lib/selenium/webdriver/common/element.rb +79 -37
- data/lib/selenium/webdriver/common/error.rb +282 -106
- data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
- data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
- data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
- data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
- data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
- data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
- data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
- data/lib/selenium/webdriver/common/keyboard.rb +27 -12
- data/lib/selenium/webdriver/common/keys.rb +118 -81
- data/lib/selenium/webdriver/common/log_entry.rb +27 -8
- data/lib/selenium/webdriver/common/logger.rb +115 -0
- data/lib/selenium/webdriver/common/logs.rb +24 -7
- data/lib/selenium/webdriver/common/manager.rb +177 -0
- data/lib/selenium/webdriver/common/mouse.rb +29 -12
- data/lib/selenium/webdriver/common/navigation.rb +21 -4
- data/lib/selenium/webdriver/common/options.rb +43 -126
- data/lib/selenium/webdriver/common/platform.rb +101 -97
- data/lib/selenium/webdriver/common/port_prober.rb +24 -17
- data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
- data/lib/selenium/webdriver/common/proxy.rb +86 -73
- data/lib/selenium/webdriver/common/search_context.rb +49 -33
- data/lib/selenium/webdriver/common/service.rb +219 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
- data/lib/selenium/webdriver/common/target_locator.rb +35 -14
- data/lib/selenium/webdriver/common/timeouts.rb +23 -6
- data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
- data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
- data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
- data/lib/selenium/webdriver/common/wait.rb +34 -14
- data/lib/selenium/webdriver/common/window.rb +75 -16
- data/lib/selenium/webdriver/common/zipper.rb +26 -11
- data/lib/selenium/webdriver/common.rb +40 -7
- data/lib/selenium/webdriver/edge/bridge.rb +76 -0
- data/lib/selenium/webdriver/edge/driver.rb +66 -0
- data/lib/selenium/webdriver/edge/options.rb +80 -0
- data/lib/selenium/webdriver/edge/service.rb +52 -0
- data/lib/selenium/webdriver/edge.rb +44 -0
- data/lib/selenium/webdriver/firefox/binary.rb +70 -48
- data/lib/selenium/webdriver/firefox/driver.rb +50 -0
- data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/extension.rb +50 -19
- data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
- data/lib/selenium/webdriver/firefox/options.rb +162 -0
- data/lib/selenium/webdriver/firefox/profile.rb +66 -48
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
- data/lib/selenium/webdriver/firefox/service.rb +52 -0
- data/lib/selenium/webdriver/firefox/util.rb +19 -2
- data/lib/selenium/webdriver/firefox.rb +46 -10
- data/lib/selenium/webdriver/ie/driver.rb +85 -0
- data/lib/selenium/webdriver/ie/options.rb +138 -0
- data/lib/selenium/webdriver/ie/service.rb +54 -0
- data/lib/selenium/webdriver/ie.rb +32 -10
- data/lib/selenium/webdriver/remote/bridge.rb +117 -572
- data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
- data/lib/selenium/webdriver/remote/driver.rb +51 -0
- data/lib/selenium/webdriver/remote/http/common.rb +54 -23
- data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
- data/lib/selenium/webdriver/remote/http/default.rb +85 -42
- data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
- data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
- data/lib/selenium/webdriver/remote/response.rb +68 -30
- data/lib/selenium/webdriver/remote/server_error.rb +22 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
- data/lib/selenium/webdriver/remote.rb +27 -13
- data/lib/selenium/webdriver/safari/bridge.rb +38 -107
- data/lib/selenium/webdriver/safari/driver.rb +68 -0
- data/lib/selenium/webdriver/safari/options.rb +56 -75
- data/lib/selenium/webdriver/safari/service.rb +38 -0
- data/lib/selenium/webdriver/safari.rb +49 -31
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
- data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
- data/lib/selenium/webdriver/support/color.rb +82 -46
- data/lib/selenium/webdriver/support/escaper.rb +43 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
- data/lib/selenium/webdriver/support/select.rb +66 -89
- data/lib/selenium/webdriver/support.rb +20 -0
- data/lib/selenium/webdriver/version.rb +24 -0
- data/lib/selenium/webdriver.rb +55 -25
- data/lib/selenium-webdriver.rb +19 -0
- data/selenium-webdriver.gemspec +42 -29
- metadata +331 -260
- data/Gemfile.lock +0 -48
- data/lib/selenium/client/base.rb +0 -132
- data/lib/selenium/client/driver.rb +0 -10
- data/lib/selenium/client/errors.rb +0 -9
- data/lib/selenium/client/extensions.rb +0 -118
- data/lib/selenium/client/idiomatic.rb +0 -488
- data/lib/selenium/client/javascript_expression_builder.rb +0 -116
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
- data/lib/selenium/client/legacy_driver.rb +0 -1720
- data/lib/selenium/client/protocol.rb +0 -104
- data/lib/selenium/client/selenium_helper.rb +0 -34
- data/lib/selenium/client.rb +0 -38
- data/lib/selenium/rake/server_task.rb +0 -157
- data/lib/selenium/webdriver/android/bridge.rb +0 -49
- data/lib/selenium/webdriver/android.rb +0 -9
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
- data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
- data/lib/selenium/webdriver/common/html5/location.rb +0 -0
- data/lib/selenium/webdriver/common/json_helper.rb +0 -34
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
- data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
- data/lib/selenium/webdriver/ie/bridge.rb +0 -69
- data/lib/selenium/webdriver/ie/server.rb +0 -90
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
- data/lib/selenium/webdriver/iphone.rb +0 -9
- data/lib/selenium/webdriver/opera/bridge.rb +0 -112
- data/lib/selenium/webdriver/opera/service.rb +0 -49
- data/lib/selenium/webdriver/opera.rb +0 -24
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
- data/lib/selenium/webdriver/phantomjs.rb +0 -22
- data/lib/selenium/webdriver/remote/commands.rb +0 -192
- data/lib/selenium/webdriver/safari/browser.rb +0 -20
- data/lib/selenium/webdriver/safari/extensions.rb +0 -170
- data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
- data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
- data/lib/selenium/webdriver/safari/server.rb +0 -145
- data/lib/selenium-client.rb +0 -2
|
@@ -1,18 +1,37 @@
|
|
|
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
|
+
|
|
1
20
|
module Selenium
|
|
2
21
|
module WebDriver
|
|
3
22
|
module Firefox
|
|
4
23
|
class Profile
|
|
5
24
|
include ProfileHelper
|
|
6
25
|
|
|
7
|
-
VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String]
|
|
26
|
+
VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
|
|
8
27
|
WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
|
|
9
28
|
WEBDRIVER_PREFS = {
|
|
10
|
-
:
|
|
11
|
-
:
|
|
12
|
-
:
|
|
13
|
-
:
|
|
14
|
-
:
|
|
15
|
-
}
|
|
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
|
|
16
35
|
|
|
17
36
|
attr_reader :name, :log_file
|
|
18
37
|
attr_writer :secure_ssl, :native_events, :load_no_focus_lib
|
|
@@ -23,11 +42,14 @@ module Selenium
|
|
|
23
42
|
end
|
|
24
43
|
|
|
25
44
|
def from_name(name)
|
|
26
|
-
ini[name]
|
|
45
|
+
profile = ini[name]
|
|
46
|
+
return profile if profile
|
|
47
|
+
|
|
48
|
+
raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
|
|
27
49
|
end
|
|
28
50
|
|
|
29
51
|
def default_preferences
|
|
30
|
-
@default_preferences ||=
|
|
52
|
+
@default_preferences ||= JSON.parse(
|
|
31
53
|
File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
|
|
32
54
|
).freeze
|
|
33
55
|
end
|
|
@@ -59,18 +81,19 @@ module Selenium
|
|
|
59
81
|
@additional_prefs = {}
|
|
60
82
|
else
|
|
61
83
|
# TODO: clean this up
|
|
62
|
-
@native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) ==
|
|
63
|
-
@secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) !=
|
|
64
|
-
@untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) ==
|
|
65
|
-
|
|
84
|
+
@native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == 'true'
|
|
85
|
+
@secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != 'true'
|
|
86
|
+
@untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == 'true'
|
|
87
|
+
# not stored in profile atm, so will always be false.
|
|
88
|
+
@load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == 'true'
|
|
66
89
|
@additional_prefs = model_prefs
|
|
67
90
|
end
|
|
68
91
|
|
|
69
|
-
@extensions
|
|
92
|
+
@extensions = {}
|
|
70
93
|
end
|
|
71
94
|
|
|
72
95
|
def layout_on_disk
|
|
73
|
-
profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir(
|
|
96
|
+
profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-profile')
|
|
74
97
|
FileReaper << profile_dir
|
|
75
98
|
|
|
76
99
|
install_extensions(profile_dir)
|
|
@@ -81,7 +104,6 @@ module Selenium
|
|
|
81
104
|
profile_dir
|
|
82
105
|
end
|
|
83
106
|
|
|
84
|
-
|
|
85
107
|
#
|
|
86
108
|
# Set a preference for this particular profile.
|
|
87
109
|
#
|
|
@@ -90,11 +112,11 @@ module Selenium
|
|
|
90
112
|
#
|
|
91
113
|
|
|
92
114
|
def []=(key, value)
|
|
93
|
-
unless VALID_PREFERENCE_TYPES.any? { |e| value.
|
|
115
|
+
unless VALID_PREFERENCE_TYPES.any? { |e| value.is_a? e }
|
|
94
116
|
raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
|
|
95
117
|
end
|
|
96
118
|
|
|
97
|
-
if value.
|
|
119
|
+
if value.is_a?(String) && Util.stringified?(value)
|
|
98
120
|
raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
|
|
99
121
|
end
|
|
100
122
|
|
|
@@ -111,9 +133,9 @@ module Selenium
|
|
|
111
133
|
end
|
|
112
134
|
|
|
113
135
|
def add_webdriver_extension
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
136
|
+
return if @extensions.key?(:webdriver)
|
|
137
|
+
|
|
138
|
+
add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
|
|
117
139
|
end
|
|
118
140
|
|
|
119
141
|
#
|
|
@@ -145,24 +167,18 @@ module Selenium
|
|
|
145
167
|
end
|
|
146
168
|
|
|
147
169
|
def proxy=(proxy)
|
|
148
|
-
unless proxy.
|
|
149
|
-
raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
|
|
150
|
-
end
|
|
170
|
+
raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}" unless proxy.is_a? Proxy
|
|
151
171
|
|
|
152
172
|
case proxy.type
|
|
153
173
|
when :manual
|
|
154
174
|
self['network.proxy.type'] = 1
|
|
155
175
|
|
|
156
|
-
set_manual_proxy_preference
|
|
157
|
-
set_manual_proxy_preference
|
|
158
|
-
set_manual_proxy_preference
|
|
159
|
-
set_manual_proxy_preference
|
|
176
|
+
set_manual_proxy_preference 'ftp', proxy.ftp
|
|
177
|
+
set_manual_proxy_preference 'http', proxy.http
|
|
178
|
+
set_manual_proxy_preference 'ssl', proxy.ssl
|
|
179
|
+
set_manual_proxy_preference 'socks', proxy.socks
|
|
160
180
|
|
|
161
|
-
|
|
162
|
-
self["network.proxy.no_proxies_on"] = proxy.no_proxy
|
|
163
|
-
else
|
|
164
|
-
self["network.proxy.no_proxies_on"] = ""
|
|
165
|
-
end
|
|
181
|
+
self['network.proxy.no_proxies_on'] = proxy.no_proxy || ''
|
|
166
182
|
when :pac
|
|
167
183
|
self['network.proxy.type'] = 2
|
|
168
184
|
self['network.proxy.autoconfig_url'] = proxy.pac
|
|
@@ -171,8 +187,10 @@ module Selenium
|
|
|
171
187
|
else
|
|
172
188
|
raise ArgumentError, "unsupported proxy type #{proxy.type}"
|
|
173
189
|
end
|
|
190
|
+
end
|
|
174
191
|
|
|
175
|
-
|
|
192
|
+
def encoded
|
|
193
|
+
Zipper.zip(layout_on_disk)
|
|
176
194
|
end
|
|
177
195
|
|
|
178
196
|
private
|
|
@@ -180,17 +198,17 @@ module Selenium
|
|
|
180
198
|
def set_manual_proxy_preference(key, value)
|
|
181
199
|
return unless value
|
|
182
200
|
|
|
183
|
-
host, port = value.to_s.split(
|
|
201
|
+
host, port = value.to_s.split(':', 2)
|
|
184
202
|
|
|
185
203
|
self["network.proxy.#{key}"] = host
|
|
186
204
|
self["network.proxy.#{key}_port"] = Integer(port) if port
|
|
187
205
|
end
|
|
188
206
|
|
|
189
207
|
def install_extensions(directory)
|
|
190
|
-
destination = File.join(directory,
|
|
208
|
+
destination = File.join(directory, 'extensions')
|
|
191
209
|
|
|
192
210
|
@extensions.each do |name, extension|
|
|
193
|
-
|
|
211
|
+
WebDriver.logger.debug({extenstion: name}.inspect)
|
|
194
212
|
extension.write_to(destination)
|
|
195
213
|
end
|
|
196
214
|
end
|
|
@@ -202,7 +220,7 @@ module Selenium
|
|
|
202
220
|
end
|
|
203
221
|
|
|
204
222
|
def delete_extensions_cache(directory)
|
|
205
|
-
FileUtils.rm_f File.join(directory,
|
|
223
|
+
FileUtils.rm_f File.join(directory, 'extensions.cache')
|
|
206
224
|
end
|
|
207
225
|
|
|
208
226
|
def delete_lock_files(directory)
|
|
@@ -228,7 +246,7 @@ module Selenium
|
|
|
228
246
|
prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
|
|
229
247
|
|
|
230
248
|
# If the user sets the home page, we should also start up there
|
|
231
|
-
prefs[
|
|
249
|
+
prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']
|
|
232
250
|
|
|
233
251
|
write_prefs prefs, path
|
|
234
252
|
end
|
|
@@ -238,25 +256,25 @@ module Selenium
|
|
|
238
256
|
return prefs unless File.exist?(path)
|
|
239
257
|
|
|
240
258
|
File.read(path).split("\n").each do |line|
|
|
241
|
-
|
|
242
|
-
key, value = $1.strip, $2.strip
|
|
259
|
+
next unless line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
|
|
243
260
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
261
|
+
key = Regexp.last_match(1).strip
|
|
262
|
+
value = Regexp.last_match(2).strip
|
|
263
|
+
|
|
264
|
+
# wrap the value in an array to make it a valid JSON string.
|
|
265
|
+
prefs[key] = JSON.parse("[#{value}]").first
|
|
247
266
|
end
|
|
248
267
|
|
|
249
268
|
prefs
|
|
250
269
|
end
|
|
251
270
|
|
|
252
271
|
def write_prefs(prefs, path)
|
|
253
|
-
File.open(path,
|
|
272
|
+
File.open(path, 'w') do |file|
|
|
254
273
|
prefs.each do |key, value|
|
|
255
|
-
file.puts %{user_pref("#{key}", #{
|
|
274
|
+
file.puts %{user_pref("#{key}", #{value.to_json});}
|
|
256
275
|
end
|
|
257
|
-
|
|
276
|
+
end
|
|
258
277
|
end
|
|
259
|
-
|
|
260
278
|
end # Profile
|
|
261
279
|
end # Firefox
|
|
262
280
|
end # WebDriver
|
|
@@ -1,12 +1,29 @@
|
|
|
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
|
+
|
|
1
20
|
module Selenium
|
|
2
21
|
module WebDriver
|
|
3
22
|
module Firefox
|
|
4
|
-
|
|
5
23
|
# @api private
|
|
6
24
|
class ProfilesIni
|
|
7
|
-
|
|
8
25
|
def initialize
|
|
9
|
-
@ini_path = File.join(Util.app_data_path,
|
|
26
|
+
@ini_path = File.join(Util.app_data_path, 'profiles.ini')
|
|
10
27
|
@profile_paths = {}
|
|
11
28
|
|
|
12
29
|
parse if File.exist?(@ini_path)
|
|
@@ -33,29 +50,24 @@ module Selenium
|
|
|
33
50
|
string.split("\n").each do |line|
|
|
34
51
|
case line
|
|
35
52
|
when /^\[Profile/
|
|
36
|
-
|
|
37
|
-
@profile_paths[name] = p
|
|
38
|
-
name, path = nil
|
|
39
|
-
end
|
|
53
|
+
name, path = nil if path_for(name, is_relative, path)
|
|
40
54
|
when /^Name=(.+)$/
|
|
41
|
-
name =
|
|
55
|
+
name = Regexp.last_match(1).strip
|
|
42
56
|
when /^IsRelative=(.+)$/
|
|
43
|
-
is_relative =
|
|
57
|
+
is_relative = Regexp.last_match(1).strip == '1'
|
|
44
58
|
when /^Path=(.+)$/
|
|
45
|
-
path =
|
|
59
|
+
path = Regexp.last_match(1).strip
|
|
60
|
+
p = path_for(name, is_relative, path)
|
|
61
|
+
@profile_paths[name] = p if p
|
|
46
62
|
end
|
|
47
63
|
end
|
|
48
|
-
|
|
49
|
-
if p = path_for(name, is_relative, path)
|
|
50
|
-
@profile_paths[name] = p
|
|
51
|
-
end
|
|
52
64
|
end
|
|
53
65
|
|
|
54
66
|
def path_for(name, is_relative, path)
|
|
55
67
|
return unless [name, path].any?
|
|
56
|
-
path = is_relative ? File.join(Util.app_data_path, path) : path
|
|
57
|
-
end
|
|
58
68
|
|
|
69
|
+
is_relative ? File.join(Util.app_data_path, path) : path
|
|
70
|
+
end
|
|
59
71
|
end # ProfilesIni
|
|
60
72
|
end # Firefox
|
|
61
73
|
end # WebDriver
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
|
5
|
+
# distributed with this work for additional information
|
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
|
8
|
+
# "License"); you may not use this file except in compliance
|
|
9
|
+
# with the License. You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
|
14
|
+
# software distributed under the License is distributed on an
|
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
16
|
+
# KIND, either express or implied. See the License for the
|
|
17
|
+
# specific language governing permissions and limitations
|
|
18
|
+
# under the License.
|
|
19
|
+
|
|
20
|
+
module Selenium
|
|
21
|
+
module WebDriver
|
|
22
|
+
module Firefox
|
|
23
|
+
#
|
|
24
|
+
# @api private
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
class Service < WebDriver::Service
|
|
28
|
+
@default_port = 4444
|
|
29
|
+
@executable = 'geckodriver'
|
|
30
|
+
@missing_text = <<~ERROR
|
|
31
|
+
Unable to find Mozilla geckodriver. Please download the server from
|
|
32
|
+
https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.
|
|
33
|
+
More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
|
|
34
|
+
ERROR
|
|
35
|
+
@shutdown_supported = false
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
# Note: This processing is deprecated
|
|
40
|
+
def extract_service_args(driver_opts)
|
|
41
|
+
driver_args = super
|
|
42
|
+
driver_opts = driver_opts.dup
|
|
43
|
+
driver_args << "--binary=#{driver_opts[:binary]}" if driver_opts.key?(:binary)
|
|
44
|
+
driver_args << "--log=#{driver_opts[:log]}" if driver_opts.key?(:log)
|
|
45
|
+
driver_args << "--marionette-port=#{driver_opts[:marionette_port]}" if driver_opts.key?(:marionette_port)
|
|
46
|
+
driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
|
|
47
|
+
driver_args
|
|
48
|
+
end
|
|
49
|
+
end # Service
|
|
50
|
+
end # Firefox
|
|
51
|
+
end # WebDriver
|
|
52
|
+
end # Selenium
|
|
@@ -1,7 +1,25 @@
|
|
|
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
|
+
|
|
1
20
|
module Selenium
|
|
2
21
|
module WebDriver
|
|
3
22
|
module Firefox
|
|
4
|
-
|
|
5
23
|
# @api private
|
|
6
24
|
module Util
|
|
7
25
|
module_function
|
|
@@ -22,7 +40,6 @@ module Selenium
|
|
|
22
40
|
def stringified?(str)
|
|
23
41
|
str =~ /^".*"$/
|
|
24
42
|
end
|
|
25
|
-
|
|
26
43
|
end # Util
|
|
27
44
|
end # Firefox
|
|
28
45
|
end # WebDriver
|
|
@@ -1,30 +1,66 @@
|
|
|
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
|
+
|
|
1
20
|
require 'timeout'
|
|
2
21
|
require 'socket'
|
|
3
22
|
require 'rexml/document'
|
|
4
23
|
|
|
24
|
+
require 'selenium/webdriver/firefox/driver'
|
|
25
|
+
|
|
5
26
|
require 'selenium/webdriver/firefox/util'
|
|
6
27
|
require 'selenium/webdriver/firefox/extension'
|
|
7
|
-
require 'selenium/webdriver/firefox/socket_lock'
|
|
8
28
|
require 'selenium/webdriver/firefox/binary'
|
|
9
29
|
require 'selenium/webdriver/firefox/profiles_ini'
|
|
10
30
|
require 'selenium/webdriver/firefox/profile'
|
|
11
31
|
require 'selenium/webdriver/firefox/launcher'
|
|
12
|
-
require 'selenium/webdriver/firefox/
|
|
32
|
+
require 'selenium/webdriver/firefox/legacy/driver'
|
|
33
|
+
|
|
34
|
+
require 'selenium/webdriver/firefox/marionette/bridge'
|
|
35
|
+
require 'selenium/webdriver/firefox/marionette/driver'
|
|
36
|
+
require 'selenium/webdriver/firefox/options'
|
|
13
37
|
|
|
14
38
|
module Selenium
|
|
15
39
|
module WebDriver
|
|
16
40
|
module Firefox
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
DEFAULT_SECURE_SSL = false
|
|
41
|
+
DEFAULT_PORT = 7055
|
|
42
|
+
DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
|
|
43
|
+
DEFAULT_SECURE_SSL = false
|
|
21
44
|
DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
|
|
22
|
-
DEFAULT_LOAD_NO_FOCUS_LIB
|
|
45
|
+
DEFAULT_LOAD_NO_FOCUS_LIB = false
|
|
46
|
+
|
|
47
|
+
def self.driver_path=(path)
|
|
48
|
+
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
|
|
49
|
+
'Selenium::WebDriver::Firefox::Service#driver_path='
|
|
50
|
+
Selenium::WebDriver::Firefox::Service.driver_path = path
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.driver_path
|
|
54
|
+
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path',
|
|
55
|
+
'Selenium::WebDriver::Firefox::Service#driver_path'
|
|
56
|
+
Selenium::WebDriver::Firefox::Service.driver_path
|
|
57
|
+
end
|
|
23
58
|
|
|
24
59
|
def self.path=(path)
|
|
25
60
|
Binary.path = path
|
|
26
61
|
end
|
|
62
|
+
end # Firefox
|
|
63
|
+
end # WebDriver
|
|
64
|
+
end # Selenium
|
|
27
65
|
|
|
28
|
-
|
|
29
|
-
end
|
|
30
|
-
end
|
|
66
|
+
require 'selenium/webdriver/firefox/service'
|
|
@@ -0,0 +1,85 @@
|
|
|
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 IE
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Driver implementation for Internet Explorer supporting
|
|
26
|
+
# both OSS and W3C dialects of JSON wire protocol.
|
|
27
|
+
# @api private
|
|
28
|
+
#
|
|
29
|
+
|
|
30
|
+
class Driver < WebDriver::Driver
|
|
31
|
+
include DriverExtensions::HasWebStorage
|
|
32
|
+
include DriverExtensions::TakesScreenshot
|
|
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
|
+
@bridge = Remote::Bridge.handshake(**opts)
|
|
41
|
+
super(@bridge, listener: listener)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def browser
|
|
45
|
+
:internet_explorer
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def quit
|
|
49
|
+
super
|
|
50
|
+
ensure
|
|
51
|
+
@service&.stop
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def create_capabilities(opts)
|
|
57
|
+
caps = opts.delete(:desired_capabilities) { Remote::Capabilities.internet_explorer }
|
|
58
|
+
options = opts.delete(:options) { Options.new }
|
|
59
|
+
|
|
60
|
+
if opts.delete(:introduce_flakiness_by_ignoring_security_domains)
|
|
61
|
+
WebDriver.logger.deprecate ':introduce_flakiness_by_ignoring_security_domains',
|
|
62
|
+
'Selenium::WebDriver::IE::Options#ignore_protected_mode_settings='
|
|
63
|
+
options.ignore_protected_mode_settings = true
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
native_events = opts.delete(:native_events)
|
|
67
|
+
unless native_events.nil?
|
|
68
|
+
WebDriver.logger.deprecate ':native_events', 'Selenium::WebDriver::IE::Options#native_events='
|
|
69
|
+
options.native_events = native_events
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Backward compatibility with older IEDriverServer versions
|
|
73
|
+
caps[:ignore_protected_mode_settings] = options.ignore_protected_mode_settings
|
|
74
|
+
caps[:native_events] = options.native_events
|
|
75
|
+
|
|
76
|
+
options = options.as_json
|
|
77
|
+
caps.merge!(options) unless options.empty?
|
|
78
|
+
|
|
79
|
+
caps
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end # Driver
|
|
83
|
+
end # IE
|
|
84
|
+
end # WebDriver
|
|
85
|
+
end # Selenium
|