selenium-webdriver 2.53.4 → 3.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,290 @@
|
|
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
|
+
module W3C
|
22
|
+
|
23
|
+
#
|
24
|
+
# Specification of the desired and/or actual capabilities of the browser that the
|
25
|
+
# server is being asked to create.
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
#
|
29
|
+
|
30
|
+
class Capabilities
|
31
|
+
|
32
|
+
EXTENSION_CAPABILITY_PATTERN = /\A[\w-]+:.*\z/
|
33
|
+
|
34
|
+
KNOWN = [
|
35
|
+
:browser_name,
|
36
|
+
:browser_version,
|
37
|
+
:platform_name,
|
38
|
+
:accept_insecure_certs,
|
39
|
+
:page_load_strategy,
|
40
|
+
:proxy,
|
41
|
+
:set_window_rect,
|
42
|
+
:timeouts,
|
43
|
+
:unhandled_prompt_behavior,
|
44
|
+
|
45
|
+
# remote-specific
|
46
|
+
:remote_session_id,
|
47
|
+
|
48
|
+
# TODO (alex): deprecate in favor of Firefox::Options?
|
49
|
+
:accessibility_checks,
|
50
|
+
:device,
|
51
|
+
|
52
|
+
# TODO (alex): deprecate compatibility with OSS-capabilities
|
53
|
+
:implicit_timeout,
|
54
|
+
:page_load_timeout,
|
55
|
+
:script_timeout,
|
56
|
+
].freeze
|
57
|
+
|
58
|
+
KNOWN.each do |key|
|
59
|
+
define_method key do
|
60
|
+
@capabilities.fetch(key)
|
61
|
+
end
|
62
|
+
|
63
|
+
define_method "#{key}=" do |value|
|
64
|
+
@capabilities[key] = value
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Backward compatibility
|
70
|
+
#
|
71
|
+
|
72
|
+
alias_method :version, :browser_version
|
73
|
+
alias_method :version=, :browser_version=
|
74
|
+
alias_method :platform, :platform_name
|
75
|
+
alias_method :platform=, :platform_name=
|
76
|
+
|
77
|
+
#
|
78
|
+
# Convenience methods for the common choices.
|
79
|
+
#
|
80
|
+
|
81
|
+
class << self
|
82
|
+
def edge(opts = {})
|
83
|
+
new({
|
84
|
+
browser_name: 'MicrosoftEdge',
|
85
|
+
platform: :windows
|
86
|
+
}.merge(opts))
|
87
|
+
end
|
88
|
+
|
89
|
+
def firefox(opts = {})
|
90
|
+
opts[:browser_version] = opts.delete(:version) if opts.key?(:version)
|
91
|
+
opts[:platform_name] = opts.delete(:platform) if opts.key?(:platform)
|
92
|
+
opts[:timeouts] = {}
|
93
|
+
opts[:timeouts]['implicit'] = opts.delete(:implicit_timeout) if opts.key?(:implicit_timeout)
|
94
|
+
opts[:timeouts]['pageLoad'] = opts.delete(:page_load_timeout) if opts.key?(:page_load_timeout)
|
95
|
+
opts[:timeouts]['script'] = opts.delete(:script_timeout) if opts.key?(:script_timeout)
|
96
|
+
new({browser_name: 'firefox', marionette: true}.merge(opts))
|
97
|
+
end
|
98
|
+
|
99
|
+
alias_method :ff, :firefox
|
100
|
+
|
101
|
+
#
|
102
|
+
# @api private
|
103
|
+
#
|
104
|
+
|
105
|
+
def json_create(data)
|
106
|
+
data = data.dup
|
107
|
+
|
108
|
+
caps = new
|
109
|
+
caps.browser_name = data.delete('browserName')
|
110
|
+
caps.browser_version = data.delete('browserVersion')
|
111
|
+
caps.platform_name = data.delete('platformName')
|
112
|
+
caps.accept_insecure_certs = data.delete('acceptInsecureCerts') if data.key?('acceptInsecureCerts')
|
113
|
+
caps.page_load_strategy = data.delete('pageLoadStrategy')
|
114
|
+
timeouts = data.delete('timeouts')
|
115
|
+
caps.implicit_timeout = timeouts['implicit'] if timeouts
|
116
|
+
caps.page_load_timeout = timeouts['pageLoad'] if timeouts
|
117
|
+
caps.script_timeout = timeouts['script'] if timeouts
|
118
|
+
|
119
|
+
proxy = data.delete('proxy')
|
120
|
+
caps.proxy = Proxy.json_create(proxy) unless proxy.nil? || proxy.empty?
|
121
|
+
|
122
|
+
# Remote Server Specific
|
123
|
+
caps[:remote_session_id] = data.delete('webdriver.remote.sessionid')
|
124
|
+
|
125
|
+
# Marionette Specific
|
126
|
+
caps[:accessibility_checks] = data.delete('moz:accessibilityChecks')
|
127
|
+
caps[:profile] = data.delete('moz:profile')
|
128
|
+
caps[:rotatable] = data.delete('rotatable')
|
129
|
+
caps[:device] = data.delete('device')
|
130
|
+
|
131
|
+
# any remaining pairs will be added as is, with no conversion
|
132
|
+
caps.merge!(data)
|
133
|
+
|
134
|
+
caps
|
135
|
+
end
|
136
|
+
|
137
|
+
#
|
138
|
+
# Creates W3C compliant capabilities from OSS ones.
|
139
|
+
# @param oss_capabilities [Hash, Remote::Capabilities]
|
140
|
+
#
|
141
|
+
|
142
|
+
def from_oss(oss_capabilities)
|
143
|
+
w3c_capabilities = new
|
144
|
+
|
145
|
+
# TODO (alex): make capabilities enumerable?
|
146
|
+
oss_capabilities = oss_capabilities.__send__(:capabilities) unless oss_capabilities.is_a?(Hash)
|
147
|
+
oss_capabilities.each do |name, value|
|
148
|
+
next if value.nil?
|
149
|
+
next if value.is_a?(String) && value.empty?
|
150
|
+
|
151
|
+
capability_name = name.to_s
|
152
|
+
|
153
|
+
snake_cased_capability_names = KNOWN.map(&:to_s)
|
154
|
+
camel_cased_capability_names = snake_cased_capability_names.map(&w3c_capabilities.method(:camel_case))
|
155
|
+
|
156
|
+
next unless snake_cased_capability_names.include?(capability_name) ||
|
157
|
+
camel_cased_capability_names.include?(capability_name) ||
|
158
|
+
capability_name.match(EXTENSION_CAPABILITY_PATTERN)
|
159
|
+
|
160
|
+
w3c_capabilities[name] = value
|
161
|
+
end
|
162
|
+
|
163
|
+
# User can pass :firefox_options or :firefox_profile.
|
164
|
+
#
|
165
|
+
# TODO (alex): Refactor this whole method into converter class.
|
166
|
+
firefox_options = oss_capabilities['firefoxOptions'] || oss_capabilities['firefox_options'] || oss_capabilities[:firefox_options]
|
167
|
+
firefox_profile = oss_capabilities['firefox_profile'] || oss_capabilities[:firefox_profile]
|
168
|
+
firefox_binary = oss_capabilities['firefox_binary'] || oss_capabilities[:firefox_binary]
|
169
|
+
|
170
|
+
if firefox_profile && firefox_options
|
171
|
+
second_profile = firefox_options['profile'] || firefox_options[:profile]
|
172
|
+
if second_profile && firefox_profile != second_profile
|
173
|
+
raise Error::WebDriverError, 'You cannot pass 2 different Firefox profiles'
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
if firefox_options || firefox_profile || firefox_binary
|
178
|
+
options = WebDriver::Firefox::Options.new(firefox_options || {})
|
179
|
+
options.binary = firefox_binary if firefox_binary
|
180
|
+
options.profile = firefox_profile if firefox_profile
|
181
|
+
w3c_capabilities.merge!(options.as_json)
|
182
|
+
end
|
183
|
+
|
184
|
+
w3c_capabilities
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
#
|
189
|
+
# @param [Hash] opts
|
190
|
+
# @option :browser_name [String] required browser name
|
191
|
+
# @option :browser_version [String] required browser version number
|
192
|
+
# @option :platform_name [Symbol] one of :any, :win, :mac, or :x
|
193
|
+
# @option :accept_insecure_certs [Boolean] does the driver accept insecure SSL certifications?
|
194
|
+
# @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
|
195
|
+
#
|
196
|
+
# @api public
|
197
|
+
#
|
198
|
+
|
199
|
+
def initialize(opts = {})
|
200
|
+
@capabilities = opts
|
201
|
+
self.proxy = opts.delete(:proxy)
|
202
|
+
end
|
203
|
+
|
204
|
+
#
|
205
|
+
# Allows setting arbitrary capabilities.
|
206
|
+
#
|
207
|
+
|
208
|
+
def []=(key, value)
|
209
|
+
@capabilities[key] = value
|
210
|
+
end
|
211
|
+
|
212
|
+
def [](key)
|
213
|
+
@capabilities[key]
|
214
|
+
end
|
215
|
+
|
216
|
+
def merge!(other)
|
217
|
+
if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
|
218
|
+
@capabilities.merge! other.capabilities
|
219
|
+
elsif other.is_a? Hash
|
220
|
+
@capabilities.merge! other
|
221
|
+
else
|
222
|
+
raise ArgumentError, 'argument should be a Hash or implement #capabilities'
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def proxy=(proxy)
|
227
|
+
case proxy
|
228
|
+
when Hash
|
229
|
+
@capabilities[:proxy] = Proxy.new(proxy)
|
230
|
+
when Proxy, nil
|
231
|
+
@capabilities[:proxy] = proxy
|
232
|
+
else
|
233
|
+
raise TypeError, "expected Hash or #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
#
|
238
|
+
# @api private
|
239
|
+
#
|
240
|
+
|
241
|
+
def as_json(*)
|
242
|
+
hash = {}
|
243
|
+
|
244
|
+
@capabilities.each do |key, value|
|
245
|
+
case key
|
246
|
+
when :platform
|
247
|
+
hash['platform'] = value.to_s.upcase
|
248
|
+
when :proxy
|
249
|
+
if value
|
250
|
+
hash['proxy'] = value.as_json
|
251
|
+
hash['proxy']['proxyType'] &&= hash['proxy']['proxyType'].downcase
|
252
|
+
end
|
253
|
+
when String, :firefox_binary
|
254
|
+
hash[key.to_s] = value
|
255
|
+
when Symbol
|
256
|
+
hash[camel_case(key.to_s)] = value
|
257
|
+
else
|
258
|
+
raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class} / #{value.inspect}"
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
hash
|
263
|
+
end
|
264
|
+
|
265
|
+
def to_json(*)
|
266
|
+
JSON.generate as_json
|
267
|
+
end
|
268
|
+
|
269
|
+
def ==(other)
|
270
|
+
return false unless other.is_a? self.class
|
271
|
+
as_json == other.as_json
|
272
|
+
end
|
273
|
+
|
274
|
+
alias_method :eql?, :==
|
275
|
+
|
276
|
+
protected
|
277
|
+
|
278
|
+
attr_reader :capabilities
|
279
|
+
|
280
|
+
private
|
281
|
+
|
282
|
+
def camel_case(str)
|
283
|
+
str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
|
284
|
+
end
|
285
|
+
|
286
|
+
end # Capabilities
|
287
|
+
end # W3c
|
288
|
+
end # Remote
|
289
|
+
end # WebDriver
|
290
|
+
end # Selenium
|
@@ -0,0 +1,148 @@
|
|
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
|
+
module W3C
|
22
|
+
|
23
|
+
#
|
24
|
+
# http://www.w3.org/TR/2015/WD-webdriver-20150918/#list-of-endpoints
|
25
|
+
# @api private
|
26
|
+
#
|
27
|
+
|
28
|
+
class Bridge
|
29
|
+
COMMANDS = {
|
30
|
+
|
31
|
+
#
|
32
|
+
# session handling
|
33
|
+
#
|
34
|
+
|
35
|
+
new_session: [:post, 'session'.freeze],
|
36
|
+
delete_session: [:delete, 'session/:session_id'.freeze],
|
37
|
+
|
38
|
+
#
|
39
|
+
# basic driver
|
40
|
+
#
|
41
|
+
|
42
|
+
get: [:post, 'session/:session_id/url'.freeze],
|
43
|
+
get_current_url: [:get, 'session/:session_id/url'.freeze],
|
44
|
+
back: [:post, 'session/:session_id/back'.freeze],
|
45
|
+
forward: [:post, 'session/:session_id/forward'.freeze],
|
46
|
+
refresh: [:post, 'session/:session_id/refresh'.freeze],
|
47
|
+
get_title: [:get, 'session/:session_id/title'.freeze],
|
48
|
+
|
49
|
+
#
|
50
|
+
# window and Frame handling
|
51
|
+
#
|
52
|
+
|
53
|
+
get_window_handle: [:get, 'session/:session_id/window'.freeze],
|
54
|
+
close_window: [:delete, 'session/:session_id/window'.freeze],
|
55
|
+
switch_to_window: [:post, 'session/:session_id/window'.freeze],
|
56
|
+
get_window_handles: [:get, 'session/:session_id/window/handles'.freeze],
|
57
|
+
fullscreen_window: [:post, 'session/:session_id/window/fullscreen'.freeze],
|
58
|
+
minimize_window: [:post, 'session/:session_id/window/minimize'.freeze],
|
59
|
+
maximize_window: [:post, 'session/:session_id/window/maximize'.freeze],
|
60
|
+
set_window_size: [:post, 'session/:session_id/window/size'.freeze],
|
61
|
+
get_window_size: [:get, 'session/:session_id/window/size'.freeze],
|
62
|
+
set_window_position: [:post, 'session/:session_id/window/position'.freeze],
|
63
|
+
get_window_position: [:get, 'session/:session_id/window/position'.freeze],
|
64
|
+
set_window_rect: [:post, 'session/:session_id/window/rect'.freeze],
|
65
|
+
get_window_rect: [:get, 'session/:session_id/window/rect'.freeze],
|
66
|
+
switch_to_frame: [:post, 'session/:session_id/frame'.freeze],
|
67
|
+
switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'.freeze],
|
68
|
+
|
69
|
+
#
|
70
|
+
# element
|
71
|
+
#
|
72
|
+
|
73
|
+
find_element: [:post, 'session/:session_id/element'.freeze],
|
74
|
+
find_elements: [:post, 'session/:session_id/elements'.freeze],
|
75
|
+
find_child_element: [:post, 'session/:session_id/element/:id/element'.freeze],
|
76
|
+
find_child_elements: [:post, 'session/:session_id/element/:id/elements'.freeze],
|
77
|
+
get_active_element: [:get, 'session/:session_id/element/active'.freeze],
|
78
|
+
is_element_selected: [:get, 'session/:session_id/element/:id/selected'.freeze],
|
79
|
+
get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'.freeze],
|
80
|
+
get_element_property: [:get, 'session/:session_id/element/:id/property/:name'.freeze],
|
81
|
+
get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'.freeze],
|
82
|
+
get_element_text: [:get, 'session/:session_id/element/:id/text'.freeze],
|
83
|
+
get_element_tag_name: [:get, 'session/:session_id/element/:id/name'.freeze],
|
84
|
+
get_element_rect: [:get, 'session/:session_id/element/:id/rect'.freeze],
|
85
|
+
is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'.freeze],
|
86
|
+
|
87
|
+
#
|
88
|
+
# document handling
|
89
|
+
#
|
90
|
+
|
91
|
+
get_page_source: [:get, '/session/:session_id/source'.freeze],
|
92
|
+
execute_script: [:post, 'session/:session_id/execute/sync'.freeze],
|
93
|
+
execute_async_script: [:post, 'session/:session_id/execute/async'.freeze],
|
94
|
+
|
95
|
+
#
|
96
|
+
# cookies
|
97
|
+
#
|
98
|
+
|
99
|
+
get_all_cookies: [:get, 'session/:session_id/cookie'.freeze],
|
100
|
+
get_cookie: [:get, 'session/:session_id/cookie/:name'.freeze],
|
101
|
+
add_cookie: [:post, 'session/:session_id/cookie'.freeze],
|
102
|
+
delete_cookie: [:delete, 'session/:session_id/cookie/:name'.freeze],
|
103
|
+
delete_all_cookies: [:delete, 'session/:session_id/cookie'.freeze],
|
104
|
+
|
105
|
+
#
|
106
|
+
# timeouts
|
107
|
+
#
|
108
|
+
|
109
|
+
set_timeout: [:post, 'session/:session_id/timeouts'.freeze],
|
110
|
+
|
111
|
+
#
|
112
|
+
# actions
|
113
|
+
#
|
114
|
+
|
115
|
+
actions: [:post, 'session/:session_id/actions'.freeze],
|
116
|
+
release_actions: [:delete, 'session/:session_id/actions'.freeze],
|
117
|
+
|
118
|
+
#
|
119
|
+
# Element Operations
|
120
|
+
#
|
121
|
+
|
122
|
+
element_click: [:post, 'session/:session_id/element/:id/click'.freeze],
|
123
|
+
element_tap: [:post, 'session/:session_id/element/:id/tap'.freeze],
|
124
|
+
element_clear: [:post, 'session/:session_id/element/:id/clear'.freeze],
|
125
|
+
element_send_keys: [:post, 'session/:session_id/element/:id/value'.freeze],
|
126
|
+
|
127
|
+
#
|
128
|
+
# alerts
|
129
|
+
#
|
130
|
+
|
131
|
+
dismiss_alert: [:post, 'session/:session_id/alert/dismiss'.freeze],
|
132
|
+
accept_alert: [:post, 'session/:session_id/alert/accept'.freeze],
|
133
|
+
get_alert_text: [:get, 'session/:session_id/alert/text'.freeze],
|
134
|
+
send_alert_text: [:post, 'session/:session_id/alert/text'.freeze],
|
135
|
+
|
136
|
+
#
|
137
|
+
# screenshot
|
138
|
+
#
|
139
|
+
|
140
|
+
take_screenshot: [:get, 'session/:session_id/screenshot'.freeze],
|
141
|
+
take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'.freeze]
|
142
|
+
}.freeze
|
143
|
+
|
144
|
+
end # Bridge
|
145
|
+
end # W3C
|
146
|
+
end # Remote
|
147
|
+
end # WebDriver
|
148
|
+
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
|
@@ -17,49 +15,42 @@
|
|
17
15
|
# specific language governing permissions and limitations
|
18
16
|
# under the License.
|
19
17
|
|
20
|
-
require '
|
21
|
-
require '
|
18
|
+
require 'selenium/webdriver/safari/driver'
|
19
|
+
require 'selenium/webdriver/safari/service'
|
22
20
|
|
23
21
|
module Selenium
|
24
22
|
module WebDriver
|
25
23
|
module Safari
|
26
|
-
|
27
24
|
class << self
|
25
|
+
def technology_preview
|
26
|
+
"/Applications/Safari\ Technology\ Preview.app/Contents/MacOS/safaridriver"
|
27
|
+
end
|
28
|
+
|
29
|
+
def technology_preview!
|
30
|
+
self.driver_path = technology_preview
|
31
|
+
end
|
32
|
+
|
28
33
|
def path=(path)
|
29
34
|
Platform.assert_executable(path)
|
30
35
|
@path = path
|
31
36
|
end
|
32
37
|
|
33
38
|
def path
|
34
|
-
@path ||=
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
"/Applications/Safari.app/Contents/MacOS/Safari"
|
40
|
-
else
|
41
|
-
Platform.find_binary("Safari")
|
42
|
-
end
|
43
|
-
|
44
|
-
unless File.file?(path) && File.executable?(path)
|
45
|
-
raise Error::WebDriverError, "unable to find the Safari executable, please set Selenium::WebDriver::Safari.path= or add it to your PATH."
|
46
|
-
end
|
39
|
+
@path ||= '/Applications/Safari.app/Contents/MacOS/Safari'
|
40
|
+
return @path if File.file?(@path) && File.executable?(@path)
|
41
|
+
raise Error::WebDriverError, 'Safari is only supported on Mac' unless Platform.os.mac?
|
42
|
+
raise Error::WebDriverError, 'Unable to find Safari'
|
43
|
+
end
|
47
44
|
|
48
|
-
|
49
|
-
|
45
|
+
def driver_path=(path)
|
46
|
+
Platform.assert_executable path
|
47
|
+
@driver_path = path
|
50
48
|
end
|
51
49
|
|
52
|
-
def
|
53
|
-
@
|
50
|
+
def driver_path
|
51
|
+
@driver_path ||= nil
|
54
52
|
end
|
55
53
|
end
|
56
|
-
|
57
54
|
end # Safari
|
58
55
|
end # WebDriver
|
59
56
|
end # Selenium
|
60
|
-
|
61
|
-
require 'selenium/webdriver/safari/browser'
|
62
|
-
require 'selenium/webdriver/safari/server'
|
63
|
-
require 'selenium/webdriver/safari/options'
|
64
|
-
require 'selenium/webdriver/safari/bridge'
|
65
|
-
|