selenium-webdriver 3.141.0 → 3.142.3
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 +4 -4
- data/CHANGES +125 -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/{options.rb → manager.rb} +27 -1
- data/lib/selenium/webdriver/common/mouse.rb +3 -0
- data/lib/selenium/webdriver/common/navigation.rb +2 -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 +6 -8
- data/lib/selenium/webdriver/common/service.rb +87 -29
- data/lib/selenium/webdriver/common/socket_lock.rb +10 -3
- data/lib/selenium/webdriver/common/socket_poller.rb +26 -18
- 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_options.rb → w3c_manager.rb} +3 -1
- data/lib/selenium/webdriver/common/wait.rb +13 -5
- 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 +2 -0
- 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 +20 -7
- 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 +11 -3
- 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 -23
|
@@ -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
|
|
@@ -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
|
|
@@ -48,22 +50,26 @@ module Selenium
|
|
|
48
50
|
self.read_timeout = value
|
|
49
51
|
end
|
|
50
52
|
|
|
53
|
+
def close
|
|
54
|
+
@http&.finish
|
|
55
|
+
end
|
|
56
|
+
|
|
51
57
|
private
|
|
52
58
|
|
|
53
59
|
def http
|
|
54
|
-
@http ||=
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
@http ||= begin
|
|
61
|
+
http = new_http_client
|
|
62
|
+
if server_url.scheme == 'https'
|
|
63
|
+
http.use_ssl = true
|
|
64
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
65
|
+
end
|
|
60
66
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
# Defaulting open_timeout to nil to be consistent with Ruby 2.2 and earlier.
|
|
68
|
+
http.open_timeout = open_timeout
|
|
69
|
+
http.read_timeout = read_timeout if read_timeout
|
|
64
70
|
|
|
65
|
-
|
|
66
|
-
|
|
71
|
+
http.start
|
|
72
|
+
end
|
|
67
73
|
end
|
|
68
74
|
|
|
69
75
|
MAX_RETRIES = 3
|
|
@@ -83,22 +89,26 @@ module Selenium
|
|
|
83
89
|
#
|
|
84
90
|
# http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
|
|
85
91
|
raise if retries >= MAX_RETRIES
|
|
92
|
+
|
|
86
93
|
retries += 1
|
|
87
94
|
sleep 2
|
|
88
95
|
retry
|
|
89
96
|
rescue Errno::EADDRNOTAVAIL => ex
|
|
90
97
|
# a retry is sometimes needed when the port becomes temporarily unavailable
|
|
91
98
|
raise if retries >= MAX_RETRIES
|
|
99
|
+
|
|
92
100
|
retries += 1
|
|
93
101
|
sleep 2
|
|
94
102
|
retry
|
|
95
103
|
rescue Errno::ECONNREFUSED => ex
|
|
96
104
|
raise ex.class, "using proxy: #{proxy.http}" if use_proxy?
|
|
105
|
+
|
|
97
106
|
raise
|
|
98
107
|
end
|
|
99
108
|
|
|
100
109
|
if response.is_a? Net::HTTPRedirection
|
|
101
110
|
raise Error::WebDriverError, 'too many redirects' if redirects >= MAX_REDIRECTS
|
|
111
|
+
|
|
102
112
|
request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
|
|
103
113
|
else
|
|
104
114
|
create_response response.code, response.body, response.content_type
|
|
@@ -108,9 +118,7 @@ module Selenium
|
|
|
108
118
|
def new_request_for(verb, url, headers, payload)
|
|
109
119
|
req = Net::HTTP.const_get(verb.to_s.capitalize).new(url.path, headers)
|
|
110
120
|
|
|
111
|
-
if server_url.userinfo
|
|
112
|
-
req.basic_auth server_url.user, server_url.password
|
|
113
|
-
end
|
|
121
|
+
req.basic_auth server_url.user, server_url.password if server_url.userinfo
|
|
114
122
|
|
|
115
123
|
req.body = payload if payload
|
|
116
124
|
|
|
@@ -124,9 +132,7 @@ module Selenium
|
|
|
124
132
|
def new_http_client
|
|
125
133
|
if use_proxy?
|
|
126
134
|
url = @proxy.http
|
|
127
|
-
unless proxy.respond_to?(:http) && url
|
|
128
|
-
raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}"
|
|
129
|
-
end
|
|
135
|
+
raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}" unless proxy.respond_to?(:http) && url
|
|
130
136
|
|
|
131
137
|
proxy = URI.parse(url)
|
|
132
138
|
|
|
@@ -138,15 +144,15 @@ module Selenium
|
|
|
138
144
|
end
|
|
139
145
|
|
|
140
146
|
def proxy
|
|
141
|
-
@proxy ||=
|
|
142
|
-
|
|
143
|
-
|
|
147
|
+
@proxy ||= begin
|
|
148
|
+
proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
|
149
|
+
no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
|
|
144
150
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
151
|
+
if proxy
|
|
152
|
+
proxy = "http://#{proxy}" unless proxy.start_with?('http://')
|
|
153
|
+
Proxy.new(http: proxy, no_proxy: no_proxy)
|
|
154
|
+
end
|
|
148
155
|
end
|
|
149
|
-
)
|
|
150
156
|
end
|
|
151
157
|
|
|
152
158
|
def use_proxy?
|
|
@@ -161,7 +167,7 @@ module Selenium
|
|
|
161
167
|
rescue ArgumentError
|
|
162
168
|
false
|
|
163
169
|
end
|
|
164
|
-
|
|
170
|
+
)
|
|
165
171
|
end
|
|
166
172
|
|
|
167
173
|
!ignored
|