selenium-webdriver 3.141.0 → 3.141.592
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +78 -0
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/lib/selenium-webdriver.rb +2 -0
- data/lib/selenium/server.rb +9 -7
- data/lib/selenium/webdriver.rb +3 -1
- data/lib/selenium/webdriver/atoms.rb +20 -1
- data/lib/selenium/webdriver/atoms/getAttribute.js +6 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +60 -59
- data/lib/selenium/webdriver/chrome.rb +10 -4
- data/lib/selenium/webdriver/chrome/bridge.rb +5 -3
- data/lib/selenium/webdriver/chrome/driver.rb +10 -13
- data/lib/selenium/webdriver/chrome/options.rb +4 -4
- data/lib/selenium/webdriver/chrome/profile.rb +4 -3
- data/lib/selenium/webdriver/chrome/service.rb +13 -13
- data/lib/selenium/webdriver/common.rb +4 -2
- data/lib/selenium/webdriver/common/action_builder.rb +2 -0
- data/lib/selenium/webdriver/common/alert.rb +2 -0
- data/lib/selenium/webdriver/common/bridge_helper.rb +8 -5
- data/lib/selenium/webdriver/common/driver.rb +22 -7
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +3 -3
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +3 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +3 -1
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -0
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -3
- data/lib/selenium/webdriver/common/element.rb +3 -1
- data/lib/selenium/webdriver/common/error.rb +74 -18
- data/lib/selenium/webdriver/common/file_reaper.rb +3 -3
- data/lib/selenium/webdriver/common/html5/local_storage.rb +2 -0
- data/lib/selenium/webdriver/common/html5/session_storage.rb +2 -0
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +4 -1
- data/lib/selenium/webdriver/common/interactions/input_device.rb +3 -0
- data/lib/selenium/webdriver/common/interactions/interaction.rb +3 -0
- data/lib/selenium/webdriver/common/interactions/interactions.rb +3 -1
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +2 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +4 -0
- data/lib/selenium/webdriver/common/interactions/none_input.rb +3 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +2 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +7 -0
- data/lib/selenium/webdriver/common/keyboard.rb +4 -1
- data/lib/selenium/webdriver/common/keys.rb +3 -0
- data/lib/selenium/webdriver/common/log_entry.rb +4 -2
- data/lib/selenium/webdriver/common/logger.rb +15 -40
- data/lib/selenium/webdriver/common/logs.rb +2 -0
- data/lib/selenium/webdriver/common/manager.rb +177 -0
- data/lib/selenium/webdriver/common/mouse.rb +3 -0
- data/lib/selenium/webdriver/common/navigation.rb +2 -0
- data/lib/selenium/webdriver/common/options.rb +26 -0
- data/lib/selenium/webdriver/common/platform.rb +26 -30
- data/lib/selenium/webdriver/common/port_prober.rb +6 -19
- data/lib/selenium/webdriver/common/profile_helper.rb +2 -0
- data/lib/selenium/webdriver/common/proxy.rb +13 -5
- data/lib/selenium/webdriver/common/search_context.rb +4 -6
- data/lib/selenium/webdriver/common/service.rb +74 -29
- data/lib/selenium/webdriver/common/socket_lock.rb +10 -3
- data/lib/selenium/webdriver/common/socket_poller.rb +45 -48
- data/lib/selenium/webdriver/common/target_locator.rb +6 -4
- data/lib/selenium/webdriver/common/timeouts.rb +2 -0
- data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -6
- data/lib/selenium/webdriver/common/touch_screen.rb +4 -1
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +3 -0
- data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
- data/lib/selenium/webdriver/common/w3c_options.rb +2 -0
- data/lib/selenium/webdriver/common/wait.rb +11 -3
- data/lib/selenium/webdriver/common/window.rb +2 -0
- data/lib/selenium/webdriver/common/zipper.rb +3 -3
- data/lib/selenium/webdriver/edge.rb +11 -5
- data/lib/selenium/webdriver/edge/bridge.rb +2 -0
- data/lib/selenium/webdriver/edge/driver.rb +5 -12
- data/lib/selenium/webdriver/edge/options.rb +3 -0
- data/lib/selenium/webdriver/edge/service.rb +8 -12
- data/lib/selenium/webdriver/firefox.rb +10 -4
- data/lib/selenium/webdriver/firefox/binary.rb +7 -6
- data/lib/selenium/webdriver/firefox/bridge.rb +47 -0
- data/lib/selenium/webdriver/firefox/driver.rb +3 -2
- data/lib/selenium/webdriver/firefox/extension.rb +4 -4
- data/lib/selenium/webdriver/firefox/launcher.rb +3 -0
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +7 -3
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +4 -2
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +5 -11
- data/lib/selenium/webdriver/firefox/options.rb +3 -1
- data/lib/selenium/webdriver/firefox/profile.rb +7 -8
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +3 -0
- data/lib/selenium/webdriver/firefox/service.rb +8 -19
- data/lib/selenium/webdriver/firefox/util.rb +2 -0
- data/lib/selenium/webdriver/ie.rb +10 -4
- data/lib/selenium/webdriver/ie/driver.rb +4 -10
- data/lib/selenium/webdriver/ie/options.rb +4 -2
- data/lib/selenium/webdriver/ie/service.rb +8 -12
- data/lib/selenium/webdriver/remote.rb +2 -0
- data/lib/selenium/webdriver/remote/bridge.rb +6 -4
- data/lib/selenium/webdriver/remote/capabilities.rb +23 -10
- data/lib/selenium/webdriver/remote/commands.rb +156 -0
- data/lib/selenium/webdriver/remote/driver.rb +2 -0
- data/lib/selenium/webdriver/remote/http/common.rb +11 -4
- data/lib/selenium/webdriver/remote/http/curb.rb +4 -2
- data/lib/selenium/webdriver/remote/http/default.rb +31 -25
- data/lib/selenium/webdriver/remote/http/persistent.rb +3 -1
- data/lib/selenium/webdriver/remote/oss/bridge.rb +5 -2
- data/lib/selenium/webdriver/remote/oss/commands.rb +106 -104
- data/lib/selenium/webdriver/remote/response.rb +10 -4
- data/lib/selenium/webdriver/remote/server_error.rb +2 -0
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +28 -13
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +37 -21
- data/lib/selenium/webdriver/remote/w3c/commands.rb +61 -58
- data/lib/selenium/webdriver/safari.rb +11 -4
- data/lib/selenium/webdriver/safari/bridge.rb +5 -3
- data/lib/selenium/webdriver/safari/driver.rb +8 -10
- data/lib/selenium/webdriver/safari/options.rb +2 -0
- data/lib/selenium/webdriver/safari/service.rb +6 -25
- data/lib/selenium/webdriver/support.rb +2 -0
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +2 -0
- data/lib/selenium/webdriver/support/block_event_listener.rb +3 -1
- data/lib/selenium/webdriver/support/color.rb +11 -9
- data/lib/selenium/webdriver/support/escaper.rb +2 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +3 -1
- data/lib/selenium/webdriver/support/select.rb +19 -18
- data/lib/selenium/webdriver/version.rb +3 -1
- data/selenium-webdriver.gemspec +14 -7
- metadata +89 -21
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -32,15 +34,7 @@ module Selenium
|
|
32
34
|
def initialize(opts = {})
|
33
35
|
opts[:desired_capabilities] = create_capabilities(opts)
|
34
36
|
|
35
|
-
|
36
|
-
driver_path = opts.delete(:driver_path) || IE.driver_path
|
37
|
-
driver_opts = opts.delete(:driver_opts) || {}
|
38
|
-
port = opts.delete(:port) || Service::DEFAULT_PORT
|
39
|
-
|
40
|
-
@service = Service.new(driver_path, port, driver_opts)
|
41
|
-
@service.start
|
42
|
-
opts[:url] = @service.uri
|
43
|
-
end
|
37
|
+
opts[:url] ||= service_url(opts)
|
44
38
|
|
45
39
|
listener = opts.delete(:listener)
|
46
40
|
@bridge = Remote::Bridge.handshake(opts)
|
@@ -54,7 +48,7 @@ module Selenium
|
|
54
48
|
def quit
|
55
49
|
super
|
56
50
|
ensure
|
57
|
-
@service
|
51
|
+
@service&.stop
|
58
52
|
end
|
59
53
|
|
60
54
|
private
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -19,7 +21,7 @@ module Selenium
|
|
19
21
|
module WebDriver
|
20
22
|
module IE
|
21
23
|
class Options
|
22
|
-
KEY = 'se:ieOptions'
|
24
|
+
KEY = 'se:ieOptions'
|
23
25
|
SCROLL_TOP = 0
|
24
26
|
SCROLL_BOTTOM = 1
|
25
27
|
CAPABILITIES = {
|
@@ -86,7 +88,7 @@ module Selenium
|
|
86
88
|
def initialize(**opts)
|
87
89
|
@args = Set.new(opts.delete(:args) || [])
|
88
90
|
@options = opts
|
89
|
-
@options[:native_events]
|
91
|
+
@options[:native_events] = true if @options[:native_events].nil?
|
90
92
|
end
|
91
93
|
|
92
94
|
#
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -23,27 +25,21 @@ module Selenium
|
|
23
25
|
#
|
24
26
|
|
25
27
|
class Service < WebDriver::Service
|
26
|
-
|
27
|
-
@executable = 'IEDriverServer'
|
28
|
-
@missing_text =
|
28
|
+
@default_port = 5555
|
29
|
+
@executable = 'IEDriverServer'
|
30
|
+
@missing_text = <<~ERROR
|
29
31
|
Unable to find IEDriverServer. Please download the server from
|
30
32
|
http://selenium-release.storage.googleapis.com/index.html and place it somewhere on your PATH.
|
31
33
|
More info at https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver.
|
32
34
|
ERROR
|
35
|
+
@shutdown_supported = true
|
33
36
|
|
34
37
|
private
|
35
38
|
|
36
|
-
|
37
|
-
@process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
|
38
|
-
@process.start
|
39
|
-
end
|
40
|
-
|
41
|
-
def cannot_connect_error_text
|
42
|
-
"unable to connect to IE server #{@host}:#{@port}"
|
43
|
-
end
|
44
|
-
|
39
|
+
# Note: This processing is deprecated
|
45
40
|
def extract_service_args(driver_opts)
|
46
41
|
driver_args = super
|
42
|
+
driver_opts = driver_opts.dup
|
47
43
|
driver_args << "--log-level=#{driver_opts.delete(:log_level).to_s.upcase}" if driver_opts.key?(:log_level)
|
48
44
|
driver_args << "--log-file=#{driver_opts.delete(:log_file)}" if driver_opts.key?(:log_file)
|
49
45
|
driver_args << "--implementation=#{driver_opts.delete(:implementation).to_s.upcase}" if driver_opts.key?(:implementation)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -24,7 +26,7 @@ module Selenium
|
|
24
26
|
|
25
27
|
PORT = 4444
|
26
28
|
COMMANDS = {
|
27
|
-
new_session: [:post, 'session'
|
29
|
+
new_session: [:post, 'session']
|
28
30
|
}.freeze
|
29
31
|
|
30
32
|
attr_accessor :context, :http, :file_detector
|
@@ -46,6 +48,7 @@ module Selenium
|
|
46
48
|
unless Capabilities.respond_to?(desired_capabilities)
|
47
49
|
raise Error::WebDriverError, "invalid desired capability: #{desired_capabilities.inspect}"
|
48
50
|
end
|
51
|
+
|
49
52
|
desired_capabilities = Capabilities.__send__(desired_capabilities)
|
50
53
|
end
|
51
54
|
|
@@ -112,9 +115,7 @@ module Selenium
|
|
112
115
|
end
|
113
116
|
end
|
114
117
|
|
115
|
-
unless @session_id
|
116
|
-
raise Error::WebDriverError, 'no sessionId in returned payload'
|
117
|
-
end
|
118
|
+
raise Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
|
118
119
|
|
119
120
|
if oss_status
|
120
121
|
WebDriver.logger.info 'Detected OSS dialect.'
|
@@ -172,6 +173,7 @@ module Selenium
|
|
172
173
|
|
173
174
|
def commands(command)
|
174
175
|
raise NotImplementedError unless command == :new_session
|
176
|
+
|
175
177
|
COMMANDS[command]
|
176
178
|
end
|
177
179
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -44,6 +46,7 @@ module Selenium
|
|
44
46
|
end
|
45
47
|
|
46
48
|
next if key == :proxy
|
49
|
+
|
47
50
|
define_method "#{key}=" do |value|
|
48
51
|
@capabilities[key] = value
|
49
52
|
end
|
@@ -80,14 +83,21 @@ module Selenium
|
|
80
83
|
def edge(opts = {})
|
81
84
|
new({
|
82
85
|
browser_name: 'MicrosoftEdge',
|
83
|
-
platform: :windows
|
84
|
-
javascript_enabled: true,
|
85
|
-
takes_screenshot: true,
|
86
|
-
css_selectors_enabled: true
|
86
|
+
platform: :windows
|
87
87
|
}.merge(opts))
|
88
88
|
end
|
89
89
|
|
90
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 = {})
|
91
101
|
new({
|
92
102
|
browser_name: 'firefox',
|
93
103
|
javascript_enabled: true,
|
@@ -175,10 +185,6 @@ module Selenium
|
|
175
185
|
# @option :native_events [Boolean] does this driver use native events?
|
176
186
|
# @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
|
177
187
|
#
|
178
|
-
# Firefox-specific options:
|
179
|
-
#
|
180
|
-
# @option :firefox_profile [Selenium::WebDriver::Firefox::Profile] the firefox profile to use
|
181
|
-
#
|
182
188
|
# @api public
|
183
189
|
#
|
184
190
|
|
@@ -224,7 +230,7 @@ module Selenium
|
|
224
230
|
# @api private
|
225
231
|
#
|
226
232
|
|
227
|
-
def as_json(*)
|
233
|
+
def as_json(*) # rubocop:disable Metrics/CyclomaticComplexity
|
228
234
|
hash = {}
|
229
235
|
|
230
236
|
@capabilities.each do |key, value|
|
@@ -232,10 +238,16 @@ module Selenium
|
|
232
238
|
when :platform
|
233
239
|
hash['platform'] = value.to_s.upcase
|
234
240
|
when :firefox_profile
|
235
|
-
|
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
|
236
245
|
when :proxy
|
237
246
|
hash['proxy'] = value.as_json if value
|
238
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
|
239
251
|
hash[key.to_s] = value
|
240
252
|
when Symbol
|
241
253
|
hash[camel_case(key.to_s)] = value
|
@@ -253,6 +265,7 @@ module Selenium
|
|
253
265
|
|
254
266
|
def ==(other)
|
255
267
|
return false unless other.is_a? self.class
|
268
|
+
|
256
269
|
as_json == other.as_json
|
257
270
|
end
|
258
271
|
alias_method :eql?, :==
|
@@ -0,0 +1,156 @@
|
|
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
|
+
# https://w3c.github.io/webdriver/#endpoints
|
26
|
+
# @api private
|
27
|
+
#
|
28
|
+
|
29
|
+
class Bridge
|
30
|
+
COMMANDS = {
|
31
|
+
status: [:get, 'status'],
|
32
|
+
|
33
|
+
#
|
34
|
+
# session handling
|
35
|
+
#
|
36
|
+
|
37
|
+
new_session: [:post, 'session'],
|
38
|
+
delete_session: [:delete, 'session/:session_id'],
|
39
|
+
|
40
|
+
#
|
41
|
+
# basic driver
|
42
|
+
#
|
43
|
+
|
44
|
+
get: [:post, 'session/:session_id/url'],
|
45
|
+
get_current_url: [:get, 'session/:session_id/url'],
|
46
|
+
back: [:post, 'session/:session_id/back'],
|
47
|
+
forward: [:post, 'session/:session_id/forward'],
|
48
|
+
refresh: [:post, 'session/:session_id/refresh'],
|
49
|
+
get_title: [:get, 'session/:session_id/title'],
|
50
|
+
|
51
|
+
#
|
52
|
+
# window and Frame handling
|
53
|
+
#
|
54
|
+
|
55
|
+
get_window_handle: [:get, 'session/:session_id/window'],
|
56
|
+
new_window: [:post, 'session/:session_id/window/new'],
|
57
|
+
close_window: [:delete, 'session/:session_id/window'],
|
58
|
+
switch_to_window: [:post, 'session/:session_id/window'],
|
59
|
+
get_window_handles: [:get, 'session/:session_id/window/handles'],
|
60
|
+
fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
|
61
|
+
minimize_window: [:post, 'session/:session_id/window/minimize'],
|
62
|
+
maximize_window: [:post, 'session/:session_id/window/maximize'],
|
63
|
+
set_window_size: [:post, 'session/:session_id/window/size'],
|
64
|
+
get_window_size: [:get, 'session/:session_id/window/size'],
|
65
|
+
set_window_position: [:post, 'session/:session_id/window/position'],
|
66
|
+
get_window_position: [:get, 'session/:session_id/window/position'],
|
67
|
+
set_window_rect: [:post, 'session/:session_id/window/rect'],
|
68
|
+
get_window_rect: [:get, 'session/:session_id/window/rect'],
|
69
|
+
switch_to_frame: [:post, 'session/:session_id/frame'],
|
70
|
+
switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
|
71
|
+
|
72
|
+
#
|
73
|
+
# element
|
74
|
+
#
|
75
|
+
|
76
|
+
find_element: [:post, 'session/:session_id/element'],
|
77
|
+
find_elements: [:post, 'session/:session_id/elements'],
|
78
|
+
find_child_element: [:post, 'session/:session_id/element/:id/element'],
|
79
|
+
find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
|
80
|
+
get_active_element: [:get, 'session/:session_id/element/active'],
|
81
|
+
is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
|
82
|
+
get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
|
83
|
+
get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
|
84
|
+
get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
|
85
|
+
get_element_text: [:get, 'session/:session_id/element/:id/text'],
|
86
|
+
get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
|
87
|
+
get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
|
88
|
+
is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
|
89
|
+
|
90
|
+
#
|
91
|
+
# document handling
|
92
|
+
#
|
93
|
+
|
94
|
+
get_page_source: [:get, 'session/:session_id/source'],
|
95
|
+
execute_script: [:post, 'session/:session_id/execute/sync'],
|
96
|
+
execute_async_script: [:post, 'session/:session_id/execute/async'],
|
97
|
+
|
98
|
+
#
|
99
|
+
# cookies
|
100
|
+
#
|
101
|
+
|
102
|
+
get_all_cookies: [:get, 'session/:session_id/cookie'],
|
103
|
+
get_cookie: [:get, 'session/:session_id/cookie/:name'],
|
104
|
+
add_cookie: [:post, 'session/:session_id/cookie'],
|
105
|
+
delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
|
106
|
+
delete_all_cookies: [:delete, 'session/:session_id/cookie'],
|
107
|
+
|
108
|
+
#
|
109
|
+
# timeouts
|
110
|
+
#
|
111
|
+
|
112
|
+
set_timeout: [:post, 'session/:session_id/timeouts'],
|
113
|
+
|
114
|
+
#
|
115
|
+
# actions
|
116
|
+
#
|
117
|
+
|
118
|
+
actions: [:post, 'session/:session_id/actions'],
|
119
|
+
release_actions: [:delete, 'session/:session_id/actions'],
|
120
|
+
|
121
|
+
#
|
122
|
+
# Element Operations
|
123
|
+
#
|
124
|
+
|
125
|
+
element_click: [:post, 'session/:session_id/element/:id/click'],
|
126
|
+
element_tap: [:post, 'session/:session_id/element/:id/tap'],
|
127
|
+
element_clear: [:post, 'session/:session_id/element/:id/clear'],
|
128
|
+
element_send_keys: [:post, 'session/:session_id/element/:id/value'],
|
129
|
+
|
130
|
+
#
|
131
|
+
# alerts
|
132
|
+
#
|
133
|
+
|
134
|
+
dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
|
135
|
+
accept_alert: [:post, 'session/:session_id/alert/accept'],
|
136
|
+
get_alert_text: [:get, 'session/:session_id/alert/text'],
|
137
|
+
send_alert_text: [:post, 'session/:session_id/alert/text'],
|
138
|
+
|
139
|
+
#
|
140
|
+
# screenshot
|
141
|
+
#
|
142
|
+
|
143
|
+
take_screenshot: [:get, 'session/:session_id/screenshot'],
|
144
|
+
take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],
|
145
|
+
|
146
|
+
#
|
147
|
+
# server extensions
|
148
|
+
#
|
149
|
+
|
150
|
+
upload_file: [:post, 'session/:session_id/se/file']
|
151
|
+
}.freeze
|
152
|
+
|
153
|
+
end # Bridge
|
154
|
+
end # Remote
|
155
|
+
end # WebDriver
|
156
|
+
end # Selenium
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -21,7 +23,7 @@ module Selenium
|
|
21
23
|
module Http
|
22
24
|
class Common
|
23
25
|
MAX_REDIRECTS = 20 # same as chromium/gecko
|
24
|
-
CONTENT_TYPE = 'application/json'
|
26
|
+
CONTENT_TYPE = 'application/json'
|
25
27
|
DEFAULT_HEADERS = {
|
26
28
|
'Accept' => CONTENT_TYPE,
|
27
29
|
'Content-Type' => "#{CONTENT_TYPE}; charset=UTF-8",
|
@@ -50,7 +52,7 @@ module Selenium
|
|
50
52
|
|
51
53
|
if command_hash
|
52
54
|
payload = JSON.generate(command_hash)
|
53
|
-
headers['Content-Length'] = payload.bytesize.to_s if [
|
55
|
+
headers['Content-Length'] = payload.bytesize.to_s if %i[post put].include?(verb)
|
54
56
|
|
55
57
|
WebDriver.logger.info(" >>> #{url} | #{payload}")
|
56
58
|
WebDriver.logger.debug(" > #{headers.inspect}")
|
@@ -66,6 +68,7 @@ module Selenium
|
|
66
68
|
|
67
69
|
def server_url
|
68
70
|
return @server_url if @server_url
|
71
|
+
|
69
72
|
raise Error::WebDriverError, 'server_url not set'
|
70
73
|
end
|
71
74
|
|
@@ -81,12 +84,16 @@ module Selenium
|
|
81
84
|
|
82
85
|
if content_type.include? CONTENT_TYPE
|
83
86
|
raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
|
87
|
+
|
84
88
|
Response.new(code, JSON.parse(body))
|
85
89
|
elsif code == 204
|
86
90
|
Response.new(code)
|
87
91
|
else
|
88
|
-
msg =
|
89
|
-
|
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
|
90
97
|
|
91
98
|
raise Error::WebDriverError, msg
|
92
99
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
2
4
|
# or more contributor license agreements. See the NOTICE file
|
3
5
|
# distributed with this work for additional information
|
@@ -77,7 +79,7 @@ module Selenium
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def client
|
80
|
-
@client ||=
|
82
|
+
@client ||= begin
|
81
83
|
c = Curl::Easy.new
|
82
84
|
|
83
85
|
c.max_redirects = MAX_REDIRECTS
|
@@ -86,7 +88,7 @@ module Selenium
|
|
86
88
|
c.verbose = WebDriver.logger.info?
|
87
89
|
|
88
90
|
c
|
89
|
-
|
91
|
+
end
|
90
92
|
end
|
91
93
|
end # Curb
|
92
94
|
end # Http
|