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
|
|
@@ -25,19 +23,18 @@ module Selenium
|
|
|
25
23
|
# server is being asked to create.
|
|
26
24
|
#
|
|
27
25
|
class Capabilities
|
|
28
|
-
|
|
29
26
|
DEFAULTS = {
|
|
30
|
-
:
|
|
31
|
-
:
|
|
32
|
-
:
|
|
33
|
-
:
|
|
34
|
-
:
|
|
35
|
-
:
|
|
36
|
-
:
|
|
37
|
-
:
|
|
38
|
-
:
|
|
39
|
-
:
|
|
40
|
-
}
|
|
27
|
+
browser_name: '',
|
|
28
|
+
version: '',
|
|
29
|
+
platform: :any,
|
|
30
|
+
javascript_enabled: false,
|
|
31
|
+
css_selectors_enabled: false,
|
|
32
|
+
takes_screenshot: false,
|
|
33
|
+
native_events: false,
|
|
34
|
+
rotatable: false,
|
|
35
|
+
firefox_profile: nil,
|
|
36
|
+
proxy: nil
|
|
37
|
+
}.freeze
|
|
41
38
|
|
|
42
39
|
DEFAULTS.each_key do |key|
|
|
43
40
|
define_method key do
|
|
@@ -49,108 +46,94 @@ module Selenium
|
|
|
49
46
|
end
|
|
50
47
|
end
|
|
51
48
|
|
|
49
|
+
#
|
|
50
|
+
# Returns javascript_enabled capability.
|
|
51
|
+
# It is true if not set explicitly.
|
|
52
|
+
#
|
|
53
|
+
def javascript_enabled
|
|
54
|
+
javascript_enabled = @capabilities.fetch(:javascript_enabled)
|
|
55
|
+
javascript_enabled.nil? ? true : javascript_enabled
|
|
56
|
+
end
|
|
57
|
+
|
|
52
58
|
alias_method :css_selectors_enabled?, :css_selectors_enabled
|
|
53
|
-
alias_method :javascript_enabled
|
|
54
|
-
alias_method :native_events
|
|
55
|
-
alias_method :takes_screenshot
|
|
56
|
-
alias_method :rotatable
|
|
59
|
+
alias_method :javascript_enabled?, :javascript_enabled
|
|
60
|
+
alias_method :native_events?, :native_events
|
|
61
|
+
alias_method :takes_screenshot?, :takes_screenshot
|
|
62
|
+
alias_method :rotatable?, :rotatable
|
|
57
63
|
|
|
58
64
|
#
|
|
59
65
|
# Convenience methods for the common choices.
|
|
60
66
|
#
|
|
61
67
|
|
|
62
68
|
class << self
|
|
63
|
-
def android(opts = {})
|
|
64
|
-
new({
|
|
65
|
-
:browser_name => "android",
|
|
66
|
-
:platform => :android,
|
|
67
|
-
:javascript_enabled => true,
|
|
68
|
-
:rotatable => true,
|
|
69
|
-
:takes_screenshot => true
|
|
70
|
-
}.merge(opts))
|
|
71
|
-
end
|
|
72
|
-
|
|
73
69
|
def chrome(opts = {})
|
|
74
70
|
new({
|
|
75
|
-
:
|
|
76
|
-
:
|
|
77
|
-
:
|
|
78
|
-
|
|
79
|
-
:driver => "ALL"}
|
|
80
|
-
}.merge(opts))
|
|
71
|
+
browser_name: 'chrome',
|
|
72
|
+
javascript_enabled: true,
|
|
73
|
+
css_selectors_enabled: true
|
|
74
|
+
}.merge(opts))
|
|
81
75
|
end
|
|
82
76
|
|
|
83
77
|
def edge(opts = {})
|
|
84
|
-
|
|
78
|
+
new({
|
|
79
|
+
browser_name: 'MicrosoftEdge',
|
|
80
|
+
platform: :windows,
|
|
81
|
+
javascript_enabled: true,
|
|
82
|
+
takes_screenshot: true,
|
|
83
|
+
css_selectors_enabled: true
|
|
84
|
+
}.merge(opts))
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
def firefox(opts = {})
|
|
88
|
-
return W3CCapabilities.firefox(opts) if opts[:marionette]
|
|
89
|
-
|
|
90
88
|
new({
|
|
91
|
-
:
|
|
92
|
-
:
|
|
93
|
-
:
|
|
94
|
-
:
|
|
89
|
+
browser_name: 'firefox',
|
|
90
|
+
javascript_enabled: true,
|
|
91
|
+
takes_screenshot: true,
|
|
92
|
+
css_selectors_enabled: true
|
|
95
93
|
}.merge(opts))
|
|
96
94
|
end
|
|
97
95
|
|
|
98
96
|
def htmlunit(opts = {})
|
|
99
97
|
new({
|
|
100
|
-
:
|
|
98
|
+
browser_name: 'htmlunit'
|
|
101
99
|
}.merge(opts))
|
|
102
100
|
end
|
|
103
101
|
|
|
104
102
|
def htmlunitwithjs(opts = {})
|
|
105
103
|
new({
|
|
106
|
-
:
|
|
107
|
-
:
|
|
104
|
+
browser_name: 'htmlunit',
|
|
105
|
+
javascript_enabled: true
|
|
108
106
|
}.merge(opts))
|
|
109
107
|
end
|
|
110
108
|
|
|
111
109
|
def internet_explorer(opts = {})
|
|
112
110
|
new({
|
|
113
|
-
:
|
|
114
|
-
:
|
|
115
|
-
:
|
|
116
|
-
:
|
|
117
|
-
:
|
|
111
|
+
browser_name: 'internet explorer',
|
|
112
|
+
platform: :windows,
|
|
113
|
+
takes_screenshot: true,
|
|
114
|
+
css_selectors_enabled: true,
|
|
115
|
+
native_events: true
|
|
118
116
|
}.merge(opts))
|
|
119
117
|
end
|
|
120
118
|
alias_method :ie, :internet_explorer
|
|
121
119
|
|
|
122
|
-
def iphone(opts = {})
|
|
123
|
-
new({
|
|
124
|
-
:browser_name => "iPhone",
|
|
125
|
-
:platform => :mac,
|
|
126
|
-
:javascript_enabled => true
|
|
127
|
-
}.merge(opts))
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def ipad(opts = {})
|
|
131
|
-
new({
|
|
132
|
-
:browser_name => "iPad",
|
|
133
|
-
:platform => :mac,
|
|
134
|
-
:javascript_enabled => true
|
|
135
|
-
}.merge(opts))
|
|
136
|
-
end
|
|
137
|
-
|
|
138
120
|
def phantomjs(opts = {})
|
|
121
|
+
WebDriver.logger.deprecate 'Selenium support for PhantomJS', 'headless Chrome/Firefox or HTMLUnit'
|
|
139
122
|
new({
|
|
140
|
-
:
|
|
141
|
-
:
|
|
142
|
-
:
|
|
143
|
-
:
|
|
123
|
+
browser_name: 'phantomjs',
|
|
124
|
+
javascript_enabled: true,
|
|
125
|
+
takes_screenshot: true,
|
|
126
|
+
css_selectors_enabled: true
|
|
144
127
|
}.merge(opts))
|
|
145
128
|
end
|
|
146
129
|
|
|
147
130
|
def safari(opts = {})
|
|
148
131
|
new({
|
|
149
|
-
:
|
|
150
|
-
:
|
|
151
|
-
:
|
|
152
|
-
:
|
|
153
|
-
:
|
|
132
|
+
browser_name: 'safari',
|
|
133
|
+
platform: :mac,
|
|
134
|
+
javascript_enabled: true,
|
|
135
|
+
takes_screenshot: true,
|
|
136
|
+
css_selectors_enabled: true
|
|
154
137
|
}.merge(opts))
|
|
155
138
|
end
|
|
156
139
|
|
|
@@ -162,15 +145,15 @@ module Selenium
|
|
|
162
145
|
data = data.dup
|
|
163
146
|
|
|
164
147
|
caps = new
|
|
165
|
-
caps.browser_name = data.delete(
|
|
166
|
-
caps.version = data.delete(
|
|
167
|
-
caps.platform = data.delete(
|
|
168
|
-
caps.javascript_enabled = data.delete(
|
|
169
|
-
caps.css_selectors_enabled = data.delete(
|
|
170
|
-
caps.takes_screenshot = data.delete(
|
|
171
|
-
caps.native_events = data.delete(
|
|
172
|
-
caps.rotatable = data.delete(
|
|
173
|
-
caps.proxy = Proxy.json_create(data['proxy']) if data.
|
|
148
|
+
caps.browser_name = data.delete('browserName')
|
|
149
|
+
caps.version = data.delete('version')
|
|
150
|
+
caps.platform = data.delete('platform').downcase.tr(' ', '_').to_sym if data.key?('platform')
|
|
151
|
+
caps.javascript_enabled = data.delete('javascriptEnabled')
|
|
152
|
+
caps.css_selectors_enabled = data.delete('cssSelectorsEnabled')
|
|
153
|
+
caps.takes_screenshot = data.delete('takesScreenshot')
|
|
154
|
+
caps.native_events = data.delete('nativeEvents')
|
|
155
|
+
caps.rotatable = data.delete('rotatable')
|
|
156
|
+
caps.proxy = Proxy.json_create(data['proxy']) if data.key?('proxy') && !data['proxy'].empty?
|
|
174
157
|
|
|
175
158
|
# any remaining pairs will be added as is, with no conversion
|
|
176
159
|
caps.merge!(data)
|
|
@@ -179,6 +162,7 @@ module Selenium
|
|
|
179
162
|
end
|
|
180
163
|
end
|
|
181
164
|
|
|
165
|
+
#
|
|
182
166
|
# @option :browser_name [String] required browser name
|
|
183
167
|
# @option :version [String] required browser version number
|
|
184
168
|
# @option :platform [Symbol] one of :any, :win, :mac, or :x
|
|
@@ -213,12 +197,12 @@ module Selenium
|
|
|
213
197
|
end
|
|
214
198
|
|
|
215
199
|
def merge!(other)
|
|
216
|
-
if other.respond_to?(:capabilities, true) && other.capabilities.
|
|
200
|
+
if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
|
|
217
201
|
@capabilities.merge! other.capabilities
|
|
218
|
-
elsif other.
|
|
202
|
+
elsif other.is_a? Hash
|
|
219
203
|
@capabilities.merge! other
|
|
220
204
|
else
|
|
221
|
-
raise ArgumentError,
|
|
205
|
+
raise ArgumentError, 'argument should be a Hash or implement #capabilities'
|
|
222
206
|
end
|
|
223
207
|
end
|
|
224
208
|
|
|
@@ -233,10 +217,11 @@ module Selenium
|
|
|
233
217
|
end
|
|
234
218
|
end
|
|
235
219
|
|
|
220
|
+
#
|
|
236
221
|
# @api private
|
|
237
222
|
#
|
|
238
223
|
|
|
239
|
-
def as_json(
|
|
224
|
+
def as_json(*)
|
|
240
225
|
hash = {}
|
|
241
226
|
|
|
242
227
|
@capabilities.each do |key, value|
|
|
@@ -259,28 +244,25 @@ module Selenium
|
|
|
259
244
|
hash
|
|
260
245
|
end
|
|
261
246
|
|
|
262
|
-
def to_json(*
|
|
247
|
+
def to_json(*)
|
|
263
248
|
JSON.generate as_json
|
|
264
249
|
end
|
|
265
250
|
|
|
266
251
|
def ==(other)
|
|
267
|
-
return false unless other.
|
|
252
|
+
return false unless other.is_a? self.class
|
|
268
253
|
as_json == other.as_json
|
|
269
254
|
end
|
|
270
255
|
alias_method :eql?, :==
|
|
271
256
|
|
|
272
257
|
protected
|
|
273
258
|
|
|
274
|
-
|
|
275
|
-
@capabilities
|
|
276
|
-
end
|
|
259
|
+
attr_reader :capabilities
|
|
277
260
|
|
|
278
261
|
private
|
|
279
262
|
|
|
280
263
|
def camel_case(str)
|
|
281
|
-
str.gsub(/_([a-z])/) {
|
|
264
|
+
str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
|
|
282
265
|
end
|
|
283
|
-
|
|
284
266
|
end # Capabilities
|
|
285
267
|
end # Remote
|
|
286
268
|
end # WebDriver
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Selenium
|
|
19
|
+
module WebDriver
|
|
20
|
+
module Remote
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# Driver implementation for remote server.
|
|
24
|
+
# @api private
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
class Driver < WebDriver::Driver
|
|
28
|
+
include DriverExtensions::UploadsFiles
|
|
29
|
+
include DriverExtensions::TakesScreenshot
|
|
30
|
+
include DriverExtensions::HasSessionId
|
|
31
|
+
include DriverExtensions::Rotatable
|
|
32
|
+
include DriverExtensions::HasRemoteStatus
|
|
33
|
+
include DriverExtensions::HasWebStorage
|
|
34
|
+
|
|
35
|
+
def initialize(opts = {})
|
|
36
|
+
listener = opts.delete(:listener)
|
|
37
|
+
@bridge = Bridge.handshake(opts)
|
|
38
|
+
if @bridge.dialect == :oss
|
|
39
|
+
extend DriverExtensions::HasTouchScreen
|
|
40
|
+
extend DriverExtensions::HasLocation
|
|
41
|
+
extend DriverExtensions::HasNetworkConnection
|
|
42
|
+
end
|
|
43
|
+
super(@bridge, listener: listener)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end # Driver
|
|
47
|
+
end # Remote
|
|
48
|
+
end # WebDriver
|
|
49
|
+
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
|
|
@@ -23,8 +21,8 @@ module Selenium
|
|
|
23
21
|
module Http
|
|
24
22
|
class Common
|
|
25
23
|
MAX_REDIRECTS = 20 # same as chromium/gecko
|
|
26
|
-
CONTENT_TYPE =
|
|
27
|
-
DEFAULT_HEADERS = {
|
|
24
|
+
CONTENT_TYPE = 'application/json'.freeze
|
|
25
|
+
DEFAULT_HEADERS = {'Accept' => CONTENT_TYPE}.freeze
|
|
28
26
|
|
|
29
27
|
attr_accessor :timeout
|
|
30
28
|
attr_writer :server_url
|
|
@@ -33,27 +31,29 @@ module Selenium
|
|
|
33
31
|
@timeout = nil
|
|
34
32
|
end
|
|
35
33
|
|
|
34
|
+
def quit_errors
|
|
35
|
+
[IOError]
|
|
36
|
+
end
|
|
37
|
+
|
|
36
38
|
def close
|
|
37
39
|
# hook for subclasses - will be called on Driver#quit
|
|
38
40
|
end
|
|
39
41
|
|
|
40
42
|
def call(verb, url, command_hash)
|
|
41
|
-
url = server_url.merge(url) unless url.
|
|
43
|
+
url = server_url.merge(url) unless url.is_a?(URI)
|
|
42
44
|
headers = DEFAULT_HEADERS.dup
|
|
43
|
-
headers['Cache-Control'] =
|
|
45
|
+
headers['Cache-Control'] = 'no-cache' if verb == :get
|
|
44
46
|
|
|
45
47
|
if command_hash
|
|
46
48
|
payload = JSON.generate(command_hash)
|
|
47
|
-
headers[
|
|
48
|
-
headers[
|
|
49
|
+
headers['Content-Type'] = "#{CONTENT_TYPE}; charset=utf-8"
|
|
50
|
+
headers['Content-Length'] = payload.bytesize.to_s if [:post, :put].include?(verb)
|
|
49
51
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
puts " > #{headers.inspect}"
|
|
53
|
-
end
|
|
52
|
+
WebDriver.logger.info(" >>> #{url} | #{payload}")
|
|
53
|
+
WebDriver.logger.debug(" > #{headers.inspect}")
|
|
54
54
|
elsif verb == :post
|
|
55
|
-
payload =
|
|
56
|
-
headers[
|
|
55
|
+
payload = '{}'
|
|
56
|
+
headers['Content-Length'] = '2'
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
request verb, url, headers, payload
|
|
@@ -62,16 +62,19 @@ module Selenium
|
|
|
62
62
|
private
|
|
63
63
|
|
|
64
64
|
def server_url
|
|
65
|
-
@server_url
|
|
65
|
+
return @server_url if @server_url
|
|
66
|
+
raise Error::WebDriverError, 'server_url not set'
|
|
66
67
|
end
|
|
67
68
|
|
|
68
|
-
def request(
|
|
69
|
-
raise NotImplementedError,
|
|
69
|
+
def request(*)
|
|
70
|
+
raise NotImplementedError, 'subclass responsibility'
|
|
70
71
|
end
|
|
71
72
|
|
|
72
73
|
def create_response(code, body, content_type)
|
|
73
|
-
code
|
|
74
|
-
|
|
74
|
+
code = code.to_i
|
|
75
|
+
body = body.to_s.strip
|
|
76
|
+
content_type = content_type.to_s
|
|
77
|
+
WebDriver.logger.info("<- #{body}")
|
|
75
78
|
|
|
76
79
|
if content_type.include? CONTENT_TYPE
|
|
77
80
|
raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
|
|
@@ -85,7 +88,6 @@ module Selenium
|
|
|
85
88
|
raise Error::WebDriverError, msg
|
|
86
89
|
end
|
|
87
90
|
end
|
|
88
|
-
|
|
89
91
|
end # Common
|
|
90
92
|
end # Http
|
|
91
93
|
end # Remote
|
|
@@ -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,11 +21,7 @@ module Selenium
|
|
|
23
21
|
module WebDriver
|
|
24
22
|
module Remote
|
|
25
23
|
|
|
26
|
-
# added for rescue
|
|
27
|
-
Bridge::QUIT_ERRORS << Curl::Err::RecvError
|
|
28
|
-
|
|
29
24
|
module Http
|
|
30
|
-
|
|
31
25
|
#
|
|
32
26
|
# An alternative to the default Net::HTTP client.
|
|
33
27
|
#
|
|
@@ -43,14 +37,18 @@ module Selenium
|
|
|
43
37
|
|
|
44
38
|
class Curb < Common
|
|
45
39
|
|
|
40
|
+
def quit_errors
|
|
41
|
+
[Curl::Err::RecvError] + super
|
|
42
|
+
end
|
|
43
|
+
|
|
46
44
|
private
|
|
47
45
|
|
|
48
46
|
def request(verb, url, headers, payload)
|
|
49
|
-
client.url
|
|
47
|
+
client.url = url.to_s
|
|
50
48
|
|
|
51
49
|
# workaround for http://github.com/taf2/curb/issues/issue/40
|
|
52
50
|
# curb will handle this for us anyway
|
|
53
|
-
headers.delete
|
|
51
|
+
headers.delete 'Content-Length'
|
|
54
52
|
|
|
55
53
|
client.headers = headers
|
|
56
54
|
|
|
@@ -62,10 +60,10 @@ module Selenium
|
|
|
62
60
|
when :get
|
|
63
61
|
client.http_get
|
|
64
62
|
when :post
|
|
65
|
-
client.post_body = payload ||
|
|
63
|
+
client.post_body = payload || ''
|
|
66
64
|
client.http_post
|
|
67
65
|
when :put
|
|
68
|
-
client.put_data = payload ||
|
|
66
|
+
client.put_data = payload || ''
|
|
69
67
|
client.http_put
|
|
70
68
|
when :delete
|
|
71
69
|
client.http_delete
|
|
@@ -85,12 +83,11 @@ module Selenium
|
|
|
85
83
|
c.max_redirects = MAX_REDIRECTS
|
|
86
84
|
c.follow_location = true
|
|
87
85
|
c.timeout = @timeout if @timeout
|
|
88
|
-
c.verbose =
|
|
86
|
+
c.verbose = WebDriver.logger.info?
|
|
89
87
|
|
|
90
88
|
c
|
|
91
89
|
)
|
|
92
90
|
end
|
|
93
|
-
|
|
94
91
|
end # Curb
|
|
95
92
|
end # Http
|
|
96
93
|
end # Remote
|