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,3 +1,22 @@
|
|
|
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 Remote
|
|
@@ -6,132 +25,128 @@ module Selenium
|
|
|
6
25
|
# server is being asked to create.
|
|
7
26
|
#
|
|
8
27
|
class Capabilities
|
|
9
|
-
|
|
10
28
|
DEFAULTS = {
|
|
11
|
-
:
|
|
12
|
-
:
|
|
13
|
-
:
|
|
14
|
-
:
|
|
15
|
-
:
|
|
16
|
-
:
|
|
17
|
-
:
|
|
18
|
-
:
|
|
19
|
-
:
|
|
20
|
-
:
|
|
21
|
-
}
|
|
29
|
+
browser_name: '',
|
|
30
|
+
version: '',
|
|
31
|
+
platform: :any,
|
|
32
|
+
javascript_enabled: false,
|
|
33
|
+
css_selectors_enabled: false,
|
|
34
|
+
takes_screenshot: false,
|
|
35
|
+
native_events: false,
|
|
36
|
+
rotatable: false,
|
|
37
|
+
firefox_profile: nil,
|
|
38
|
+
proxy: nil
|
|
39
|
+
}.freeze
|
|
22
40
|
|
|
23
41
|
DEFAULTS.each_key do |key|
|
|
24
|
-
|
|
25
|
-
|
|
42
|
+
if key != :javascript_enabled
|
|
43
|
+
define_method key do
|
|
44
|
+
@capabilities.fetch(key)
|
|
45
|
+
end
|
|
26
46
|
end
|
|
27
47
|
|
|
48
|
+
next if key == :proxy
|
|
49
|
+
|
|
28
50
|
define_method "#{key}=" do |value|
|
|
29
51
|
@capabilities[key] = value
|
|
30
52
|
end
|
|
31
53
|
end
|
|
32
54
|
|
|
55
|
+
#
|
|
56
|
+
# Returns javascript_enabled capability.
|
|
57
|
+
# It is true if not set explicitly.
|
|
58
|
+
#
|
|
59
|
+
def javascript_enabled
|
|
60
|
+
javascript_enabled = @capabilities.fetch(:javascript_enabled)
|
|
61
|
+
javascript_enabled.nil? ? true : javascript_enabled
|
|
62
|
+
end
|
|
63
|
+
|
|
33
64
|
alias_method :css_selectors_enabled?, :css_selectors_enabled
|
|
34
|
-
alias_method :javascript_enabled
|
|
35
|
-
alias_method :native_events
|
|
36
|
-
alias_method :takes_screenshot
|
|
37
|
-
alias_method :rotatable
|
|
65
|
+
alias_method :javascript_enabled?, :javascript_enabled
|
|
66
|
+
alias_method :native_events?, :native_events
|
|
67
|
+
alias_method :takes_screenshot?, :takes_screenshot
|
|
68
|
+
alias_method :rotatable?, :rotatable
|
|
38
69
|
|
|
39
70
|
#
|
|
40
71
|
# Convenience methods for the common choices.
|
|
41
72
|
#
|
|
42
73
|
|
|
43
74
|
class << self
|
|
44
|
-
def
|
|
75
|
+
def chrome(opts = {})
|
|
45
76
|
new({
|
|
46
|
-
:
|
|
47
|
-
:
|
|
48
|
-
:
|
|
49
|
-
:rotatable => true,
|
|
50
|
-
:takes_screenshot => true
|
|
77
|
+
browser_name: 'chrome',
|
|
78
|
+
javascript_enabled: true,
|
|
79
|
+
css_selectors_enabled: true
|
|
51
80
|
}.merge(opts))
|
|
52
81
|
end
|
|
53
82
|
|
|
54
|
-
def
|
|
83
|
+
def edge(opts = {})
|
|
55
84
|
new({
|
|
56
|
-
:
|
|
57
|
-
:
|
|
58
|
-
:css_selectors_enabled => true
|
|
85
|
+
browser_name: 'MicrosoftEdge',
|
|
86
|
+
platform: :windows
|
|
59
87
|
}.merge(opts))
|
|
60
88
|
end
|
|
61
89
|
|
|
62
90
|
def firefox(opts = {})
|
|
91
|
+
opts[:browser_version] = opts.delete(:version) if opts.key?(:version)
|
|
92
|
+
opts[:platform_name] = opts.delete(:platform) if opts.key?(:platform)
|
|
93
|
+
opts[:timeouts] = {}
|
|
94
|
+
opts[:timeouts]['implicit'] = opts.delete(:implicit_timeout) if opts.key?(:implicit_timeout)
|
|
95
|
+
opts[:timeouts]['pageLoad'] = opts.delete(:page_load_timeout) if opts.key?(:page_load_timeout)
|
|
96
|
+
opts[:timeouts]['script'] = opts.delete(:script_timeout) if opts.key?(:script_timeout)
|
|
97
|
+
new({browser_name: 'firefox', marionette: true}.merge(opts))
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def firefox_legacy(opts = {})
|
|
63
101
|
new({
|
|
64
|
-
:
|
|
65
|
-
:
|
|
66
|
-
:
|
|
67
|
-
:
|
|
102
|
+
browser_name: 'firefox',
|
|
103
|
+
javascript_enabled: true,
|
|
104
|
+
takes_screenshot: true,
|
|
105
|
+
css_selectors_enabled: true
|
|
68
106
|
}.merge(opts))
|
|
69
107
|
end
|
|
70
108
|
|
|
71
109
|
def htmlunit(opts = {})
|
|
72
110
|
new({
|
|
73
|
-
:
|
|
111
|
+
browser_name: 'htmlunit'
|
|
74
112
|
}.merge(opts))
|
|
75
113
|
end
|
|
76
114
|
|
|
77
115
|
def htmlunitwithjs(opts = {})
|
|
78
116
|
new({
|
|
79
|
-
:
|
|
80
|
-
:
|
|
117
|
+
browser_name: 'htmlunit',
|
|
118
|
+
javascript_enabled: true
|
|
81
119
|
}.merge(opts))
|
|
82
120
|
end
|
|
83
121
|
|
|
84
122
|
def internet_explorer(opts = {})
|
|
85
123
|
new({
|
|
86
|
-
:
|
|
87
|
-
:
|
|
88
|
-
:
|
|
89
|
-
:
|
|
90
|
-
:
|
|
124
|
+
browser_name: 'internet explorer',
|
|
125
|
+
platform: :windows,
|
|
126
|
+
takes_screenshot: true,
|
|
127
|
+
css_selectors_enabled: true,
|
|
128
|
+
native_events: true
|
|
91
129
|
}.merge(opts))
|
|
92
130
|
end
|
|
93
131
|
alias_method :ie, :internet_explorer
|
|
94
132
|
|
|
95
|
-
def iphone(opts = {})
|
|
96
|
-
new({
|
|
97
|
-
:browser_name => "iPhone",
|
|
98
|
-
:platform => :mac,
|
|
99
|
-
:javascript_enabled => true
|
|
100
|
-
}.merge(opts))
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def ipad(opts = {})
|
|
104
|
-
new({
|
|
105
|
-
:browser_name => "iPad",
|
|
106
|
-
:platform => :mac,
|
|
107
|
-
:javascript_enabled => true
|
|
108
|
-
}.merge(opts))
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def opera(opts = {})
|
|
112
|
-
new({
|
|
113
|
-
:browser_name => "opera",
|
|
114
|
-
:javascript_enabled => true,
|
|
115
|
-
:takes_screenshot => true,
|
|
116
|
-
:css_selectors_enabled => true
|
|
117
|
-
}.merge(opts))
|
|
118
|
-
end
|
|
119
|
-
|
|
120
133
|
def phantomjs(opts = {})
|
|
134
|
+
WebDriver.logger.deprecate 'Selenium support for PhantomJS', 'headless Chrome/Firefox or HTMLUnit'
|
|
121
135
|
new({
|
|
122
|
-
:
|
|
123
|
-
:
|
|
124
|
-
:
|
|
125
|
-
:
|
|
136
|
+
browser_name: 'phantomjs',
|
|
137
|
+
javascript_enabled: true,
|
|
138
|
+
takes_screenshot: true,
|
|
139
|
+
css_selectors_enabled: true
|
|
126
140
|
}.merge(opts))
|
|
127
141
|
end
|
|
128
142
|
|
|
129
143
|
def safari(opts = {})
|
|
130
144
|
new({
|
|
131
|
-
:
|
|
132
|
-
:
|
|
133
|
-
:
|
|
134
|
-
:
|
|
145
|
+
browser_name: 'safari',
|
|
146
|
+
platform: :mac,
|
|
147
|
+
javascript_enabled: true,
|
|
148
|
+
takes_screenshot: true,
|
|
149
|
+
css_selectors_enabled: true
|
|
135
150
|
}.merge(opts))
|
|
136
151
|
end
|
|
137
152
|
|
|
@@ -143,15 +158,15 @@ module Selenium
|
|
|
143
158
|
data = data.dup
|
|
144
159
|
|
|
145
160
|
caps = new
|
|
146
|
-
caps.browser_name = data.delete(
|
|
147
|
-
caps.version = data.delete(
|
|
148
|
-
caps.platform = data.delete(
|
|
149
|
-
caps.javascript_enabled = data.delete(
|
|
150
|
-
caps.css_selectors_enabled = data.delete(
|
|
151
|
-
caps.takes_screenshot = data.delete(
|
|
152
|
-
caps.native_events = data.delete(
|
|
153
|
-
caps.rotatable = data.delete(
|
|
154
|
-
caps.proxy = Proxy.json_create(data['proxy']) if data.
|
|
161
|
+
caps.browser_name = data.delete('browserName')
|
|
162
|
+
caps.version = data.delete('version')
|
|
163
|
+
caps.platform = data.delete('platform').downcase.tr(' ', '_').to_sym if data.key?('platform')
|
|
164
|
+
caps.javascript_enabled = data.delete('javascriptEnabled')
|
|
165
|
+
caps.css_selectors_enabled = data.delete('cssSelectorsEnabled')
|
|
166
|
+
caps.takes_screenshot = data.delete('takesScreenshot')
|
|
167
|
+
caps.native_events = data.delete('nativeEvents')
|
|
168
|
+
caps.rotatable = data.delete('rotatable')
|
|
169
|
+
caps.proxy = Proxy.json_create(data['proxy']) if data.key?('proxy') && !data['proxy'].empty?
|
|
155
170
|
|
|
156
171
|
# any remaining pairs will be added as is, with no conversion
|
|
157
172
|
caps.merge!(data)
|
|
@@ -160,6 +175,7 @@ module Selenium
|
|
|
160
175
|
end
|
|
161
176
|
end
|
|
162
177
|
|
|
178
|
+
#
|
|
163
179
|
# @option :browser_name [String] required browser name
|
|
164
180
|
# @option :version [String] required browser version number
|
|
165
181
|
# @option :platform [Symbol] one of :any, :win, :mac, or :x
|
|
@@ -169,10 +185,6 @@ module Selenium
|
|
|
169
185
|
# @option :native_events [Boolean] does this driver use native events?
|
|
170
186
|
# @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
|
|
171
187
|
#
|
|
172
|
-
# Firefox-specific options:
|
|
173
|
-
#
|
|
174
|
-
# @option :firefox_profile [Selenium::WebDriver::Firefox::Profile] the firefox profile to use
|
|
175
|
-
#
|
|
176
188
|
# @api public
|
|
177
189
|
#
|
|
178
190
|
|
|
@@ -194,12 +206,12 @@ module Selenium
|
|
|
194
206
|
end
|
|
195
207
|
|
|
196
208
|
def merge!(other)
|
|
197
|
-
if other.respond_to?(:capabilities, true) && other.capabilities.
|
|
209
|
+
if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
|
|
198
210
|
@capabilities.merge! other.capabilities
|
|
199
|
-
elsif other.
|
|
211
|
+
elsif other.is_a? Hash
|
|
200
212
|
@capabilities.merge! other
|
|
201
213
|
else
|
|
202
|
-
raise ArgumentError,
|
|
214
|
+
raise ArgumentError, 'argument should be a Hash or implement #capabilities'
|
|
203
215
|
end
|
|
204
216
|
end
|
|
205
217
|
|
|
@@ -214,10 +226,11 @@ module Selenium
|
|
|
214
226
|
end
|
|
215
227
|
end
|
|
216
228
|
|
|
229
|
+
#
|
|
217
230
|
# @api private
|
|
218
231
|
#
|
|
219
232
|
|
|
220
|
-
def as_json(
|
|
233
|
+
def as_json(*) # rubocop:disable Metrics/CyclomaticComplexity
|
|
221
234
|
hash = {}
|
|
222
235
|
|
|
223
236
|
@capabilities.each do |key, value|
|
|
@@ -225,10 +238,16 @@ module Selenium
|
|
|
225
238
|
when :platform
|
|
226
239
|
hash['platform'] = value.to_s.upcase
|
|
227
240
|
when :firefox_profile
|
|
228
|
-
|
|
241
|
+
if value
|
|
242
|
+
WebDriver.logger.deprecate(':firefox_profile capabilitiy', 'Selenium::WebDriver::Firefox::Options#profile')
|
|
243
|
+
hash['firefox_profile'] = value.as_json['zip']
|
|
244
|
+
end
|
|
229
245
|
when :proxy
|
|
230
246
|
hash['proxy'] = value.as_json if value
|
|
231
247
|
when String, :firefox_binary
|
|
248
|
+
if key == :firefox_binary && value
|
|
249
|
+
WebDriver.logger.deprecate(':firefox_binary capabilitiy', 'Selenium::WebDriver::Firefox::Options#binary')
|
|
250
|
+
end
|
|
232
251
|
hash[key.to_s] = value
|
|
233
252
|
when Symbol
|
|
234
253
|
hash[camel_case(key.to_s)] = value
|
|
@@ -240,28 +259,26 @@ module Selenium
|
|
|
240
259
|
hash
|
|
241
260
|
end
|
|
242
261
|
|
|
243
|
-
def to_json(*
|
|
244
|
-
|
|
262
|
+
def to_json(*)
|
|
263
|
+
JSON.generate as_json
|
|
245
264
|
end
|
|
246
265
|
|
|
247
266
|
def ==(other)
|
|
248
|
-
return false unless other.
|
|
267
|
+
return false unless other.is_a? self.class
|
|
268
|
+
|
|
249
269
|
as_json == other.as_json
|
|
250
270
|
end
|
|
251
271
|
alias_method :eql?, :==
|
|
252
272
|
|
|
253
273
|
protected
|
|
254
274
|
|
|
255
|
-
|
|
256
|
-
@capabilities
|
|
257
|
-
end
|
|
275
|
+
attr_reader :capabilities
|
|
258
276
|
|
|
259
277
|
private
|
|
260
278
|
|
|
261
279
|
def camel_case(str)
|
|
262
|
-
str.gsub(/_([a-z])/) {
|
|
280
|
+
str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
|
|
263
281
|
end
|
|
264
|
-
|
|
265
282
|
end # Capabilities
|
|
266
283
|
end # Remote
|
|
267
284
|
end # WebDriver
|
|
@@ -0,0 +1,51 @@
|
|
|
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 Remote
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Driver implementation for remote server.
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
|
|
29
|
+
class Driver < WebDriver::Driver
|
|
30
|
+
include DriverExtensions::UploadsFiles
|
|
31
|
+
include DriverExtensions::TakesScreenshot
|
|
32
|
+
include DriverExtensions::HasSessionId
|
|
33
|
+
include DriverExtensions::Rotatable
|
|
34
|
+
include DriverExtensions::HasRemoteStatus
|
|
35
|
+
include DriverExtensions::HasWebStorage
|
|
36
|
+
|
|
37
|
+
def initialize(opts = {})
|
|
38
|
+
listener = opts.delete(:listener)
|
|
39
|
+
@bridge = Bridge.handshake(opts)
|
|
40
|
+
if @bridge.dialect == :oss
|
|
41
|
+
extend DriverExtensions::HasTouchScreen
|
|
42
|
+
extend DriverExtensions::HasLocation
|
|
43
|
+
extend DriverExtensions::HasNetworkConnection
|
|
44
|
+
end
|
|
45
|
+
super(@bridge, listener: listener)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end # Driver
|
|
49
|
+
end # Remote
|
|
50
|
+
end # WebDriver
|
|
51
|
+
end # Selenium
|
|
@@ -1,11 +1,34 @@
|
|
|
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 Remote
|
|
4
23
|
module Http
|
|
5
24
|
class Common
|
|
6
25
|
MAX_REDIRECTS = 20 # same as chromium/gecko
|
|
7
|
-
CONTENT_TYPE =
|
|
8
|
-
DEFAULT_HEADERS = {
|
|
26
|
+
CONTENT_TYPE = 'application/json'
|
|
27
|
+
DEFAULT_HEADERS = {
|
|
28
|
+
'Accept' => CONTENT_TYPE,
|
|
29
|
+
'Content-Type' => "#{CONTENT_TYPE}; charset=UTF-8",
|
|
30
|
+
'User-Agent' => "selenium/#{WebDriver::VERSION} (ruby #{Platform.os})"
|
|
31
|
+
}.freeze
|
|
9
32
|
|
|
10
33
|
attr_accessor :timeout
|
|
11
34
|
attr_writer :server_url
|
|
@@ -14,27 +37,28 @@ module Selenium
|
|
|
14
37
|
@timeout = nil
|
|
15
38
|
end
|
|
16
39
|
|
|
40
|
+
def quit_errors
|
|
41
|
+
[IOError]
|
|
42
|
+
end
|
|
43
|
+
|
|
17
44
|
def close
|
|
18
45
|
# hook for subclasses - will be called on Driver#quit
|
|
19
46
|
end
|
|
20
47
|
|
|
21
48
|
def call(verb, url, command_hash)
|
|
22
|
-
url = server_url.merge(url) unless url.
|
|
49
|
+
url = server_url.merge(url) unless url.is_a?(URI)
|
|
23
50
|
headers = DEFAULT_HEADERS.dup
|
|
24
|
-
headers['Cache-Control'] =
|
|
51
|
+
headers['Cache-Control'] = 'no-cache' if verb == :get
|
|
25
52
|
|
|
26
53
|
if command_hash
|
|
27
|
-
payload =
|
|
28
|
-
headers[
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
puts " >>> #{url} | #{payload}"
|
|
33
|
-
puts " > #{headers.inspect}"
|
|
34
|
-
end
|
|
54
|
+
payload = JSON.generate(command_hash)
|
|
55
|
+
headers['Content-Length'] = payload.bytesize.to_s if %i[post put].include?(verb)
|
|
56
|
+
|
|
57
|
+
WebDriver.logger.info(" >>> #{url} | #{payload}")
|
|
58
|
+
WebDriver.logger.debug(" > #{headers.inspect}")
|
|
35
59
|
elsif verb == :post
|
|
36
|
-
payload =
|
|
37
|
-
headers[
|
|
60
|
+
payload = '{}'
|
|
61
|
+
headers['Content-Length'] = '2'
|
|
38
62
|
end
|
|
39
63
|
|
|
40
64
|
request verb, url, headers, payload
|
|
@@ -43,30 +67,37 @@ module Selenium
|
|
|
43
67
|
private
|
|
44
68
|
|
|
45
69
|
def server_url
|
|
46
|
-
@server_url
|
|
70
|
+
return @server_url if @server_url
|
|
71
|
+
|
|
72
|
+
raise Error::WebDriverError, 'server_url not set'
|
|
47
73
|
end
|
|
48
74
|
|
|
49
|
-
def request(
|
|
50
|
-
raise NotImplementedError,
|
|
75
|
+
def request(*)
|
|
76
|
+
raise NotImplementedError, 'subclass responsibility'
|
|
51
77
|
end
|
|
52
78
|
|
|
53
79
|
def create_response(code, body, content_type)
|
|
54
|
-
code
|
|
55
|
-
|
|
80
|
+
code = code.to_i
|
|
81
|
+
body = body.to_s.strip
|
|
82
|
+
content_type = content_type.to_s
|
|
83
|
+
WebDriver.logger.info("<- #{body}")
|
|
56
84
|
|
|
57
85
|
if content_type.include? CONTENT_TYPE
|
|
58
86
|
raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
|
|
59
|
-
|
|
87
|
+
|
|
88
|
+
Response.new(code, JSON.parse(body))
|
|
60
89
|
elsif code == 204
|
|
61
90
|
Response.new(code)
|
|
62
91
|
else
|
|
63
|
-
msg =
|
|
64
|
-
|
|
92
|
+
msg = if body.empty?
|
|
93
|
+
"unexpected response, code=#{code}, content-type=#{content_type.inspect}"
|
|
94
|
+
else
|
|
95
|
+
"unexpected response, code=#{code}, content-type=#{content_type.inspect}\n#{body}"
|
|
96
|
+
end
|
|
65
97
|
|
|
66
98
|
raise Error::WebDriverError, msg
|
|
67
99
|
end
|
|
68
100
|
end
|
|
69
|
-
|
|
70
101
|
end # Common
|
|
71
102
|
end # Http
|
|
72
103
|
end # Remote
|
|
@@ -1,14 +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
|
require 'curb'
|
|
2
21
|
|
|
3
22
|
module Selenium
|
|
4
23
|
module WebDriver
|
|
5
24
|
module Remote
|
|
6
25
|
|
|
7
|
-
# added for rescue
|
|
8
|
-
Bridge::QUIT_ERRORS << Curl::Err::RecvError
|
|
9
|
-
|
|
10
26
|
module Http
|
|
11
|
-
|
|
12
27
|
#
|
|
13
28
|
# An alternative to the default Net::HTTP client.
|
|
14
29
|
#
|
|
@@ -24,14 +39,18 @@ module Selenium
|
|
|
24
39
|
|
|
25
40
|
class Curb < Common
|
|
26
41
|
|
|
42
|
+
def quit_errors
|
|
43
|
+
[Curl::Err::RecvError] + super
|
|
44
|
+
end
|
|
45
|
+
|
|
27
46
|
private
|
|
28
47
|
|
|
29
48
|
def request(verb, url, headers, payload)
|
|
30
|
-
client.url
|
|
49
|
+
client.url = url.to_s
|
|
31
50
|
|
|
32
51
|
# workaround for http://github.com/taf2/curb/issues/issue/40
|
|
33
52
|
# curb will handle this for us anyway
|
|
34
|
-
headers.delete
|
|
53
|
+
headers.delete 'Content-Length'
|
|
35
54
|
|
|
36
55
|
client.headers = headers
|
|
37
56
|
|
|
@@ -43,10 +62,10 @@ module Selenium
|
|
|
43
62
|
when :get
|
|
44
63
|
client.http_get
|
|
45
64
|
when :post
|
|
46
|
-
client.post_body = payload ||
|
|
65
|
+
client.post_body = payload || ''
|
|
47
66
|
client.http_post
|
|
48
67
|
when :put
|
|
49
|
-
client.put_data = payload ||
|
|
68
|
+
client.put_data = payload || ''
|
|
50
69
|
client.http_put
|
|
51
70
|
when :delete
|
|
52
71
|
client.http_delete
|
|
@@ -60,18 +79,17 @@ module Selenium
|
|
|
60
79
|
end
|
|
61
80
|
|
|
62
81
|
def client
|
|
63
|
-
@client ||=
|
|
82
|
+
@client ||= begin
|
|
64
83
|
c = Curl::Easy.new
|
|
65
84
|
|
|
66
85
|
c.max_redirects = MAX_REDIRECTS
|
|
67
86
|
c.follow_location = true
|
|
68
87
|
c.timeout = @timeout if @timeout
|
|
69
|
-
c.verbose =
|
|
88
|
+
c.verbose = WebDriver.logger.info?
|
|
70
89
|
|
|
71
90
|
c
|
|
72
|
-
|
|
91
|
+
end
|
|
73
92
|
end
|
|
74
|
-
|
|
75
93
|
end # Curb
|
|
76
94
|
end # Http
|
|
77
95
|
end # Remote
|