selenium-webdriver 3.12.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 +4 -4
- data/CHANGES +236 -0
- data/Gemfile +2 -0
- data/LICENSE +1 -1
- data/lib/selenium-webdriver.rb +2 -0
- data/lib/selenium/server.rb +13 -9
- 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 +102 -0
- data/lib/selenium/webdriver/chrome.rb +10 -4
- data/lib/selenium/webdriver/chrome/bridge.rb +27 -2
- data/lib/selenium/webdriver/chrome/driver.rb +33 -21
- data/lib/selenium/webdriver/chrome/options.rb +13 -6
- data/lib/selenium/webdriver/chrome/profile.rb +6 -5
- data/lib/selenium/webdriver/chrome/service.rb +13 -13
- data/lib/selenium/webdriver/common.rb +6 -2
- data/lib/selenium/webdriver/common/action_builder.rb +3 -1
- 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 +45 -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 +4 -2
- data/lib/selenium/webdriver/common/error.rb +75 -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 +4 -1
- 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 +14 -4
- 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 +28 -126
- data/lib/selenium/webdriver/common/platform.rb +31 -30
- data/lib/selenium/webdriver/common/port_prober.rb +6 -17
- 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 -17
- 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 +12 -5
- data/lib/selenium/webdriver/edge/bridge.rb +2 -0
- data/lib/selenium/webdriver/edge/driver.rb +6 -13
- data/lib/selenium/webdriver/edge/options.rb +80 -0
- data/lib/selenium/webdriver/edge/service.rb +12 -15
- data/lib/selenium/webdriver/firefox.rb +10 -4
- data/lib/selenium/webdriver/firefox/binary.rb +9 -8
- data/lib/selenium/webdriver/firefox/driver.rb +2 -0
- data/lib/selenium/webdriver/firefox/extension.rb +4 -4
- data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -1
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- 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 +6 -12
- data/lib/selenium/webdriver/firefox/options.rb +22 -9
- 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 +11 -22
- data/lib/selenium/webdriver/firefox/util.rb +2 -0
- data/lib/selenium/webdriver/ie.rb +10 -4
- data/lib/selenium/webdriver/ie/driver.rb +5 -11
- data/lib/selenium/webdriver/ie/options.rb +6 -4
- data/lib/selenium/webdriver/ie/service.rb +8 -12
- data/lib/selenium/webdriver/remote.rb +2 -0
- data/lib/selenium/webdriver/remote/bridge.rb +15 -10
- data/lib/selenium/webdriver/remote/capabilities.rb +28 -12
- 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 +14 -6
- 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 +48 -16
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +38 -21
- data/lib/selenium/webdriver/remote/w3c/commands.rb +66 -57
- data/lib/selenium/webdriver/safari.rb +12 -4
- data/lib/selenium/webdriver/safari/bridge.rb +5 -3
- data/lib/selenium/webdriver/safari/driver.rb +19 -12
- data/lib/selenium/webdriver/safari/options.rb +60 -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 +15 -8
- metadata +95 -26
|
@@ -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
|
|
@@ -79,6 +81,7 @@ module Selenium
|
|
|
79
81
|
|
|
80
82
|
def assert_element(element)
|
|
81
83
|
return if element.is_a? Element
|
|
84
|
+
|
|
82
85
|
raise TypeError, "expected #{Element}, got #{element.inspect}:#{element.class}"
|
|
83
86
|
end
|
|
84
87
|
end # Mouse
|
|
@@ -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
|
|
@@ -17,135 +19,35 @@
|
|
|
17
19
|
|
|
18
20
|
module Selenium
|
|
19
21
|
module WebDriver
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# @option opts [Time,DateTime,Numeric,nil] :expires (nil) Expiry date, either as a Time, DateTime, or seconds since epoch.
|
|
38
|
-
#
|
|
39
|
-
# @raise [ArgumentError] if :name or :value is not specified
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
def add_cookie(opts = {})
|
|
43
|
-
raise ArgumentError, 'name is required' unless opts[:name]
|
|
44
|
-
raise ArgumentError, 'value is required' unless opts[:value]
|
|
45
|
-
|
|
46
|
-
opts[:path] ||= '/'
|
|
47
|
-
opts[:secure] ||= false
|
|
48
|
-
|
|
49
|
-
obj = opts.delete(:expires)
|
|
50
|
-
opts[:expiry] = seconds_from(obj).to_i if obj
|
|
51
|
-
|
|
52
|
-
@bridge.add_cookie opts
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
#
|
|
56
|
-
# Get the cookie with the given name
|
|
57
|
-
#
|
|
58
|
-
# @param [String] name the name of the cookie
|
|
59
|
-
# @return [Hash, nil] the cookie, or nil if it wasn't found.
|
|
60
|
-
#
|
|
61
|
-
|
|
62
|
-
def cookie_named(name)
|
|
63
|
-
all_cookies.find { |c| c[:name] == name }
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
#
|
|
67
|
-
# Delete the cookie with the given name
|
|
68
|
-
#
|
|
69
|
-
# @param [String] name the name of the cookie to delete
|
|
70
|
-
#
|
|
71
|
-
|
|
72
|
-
def delete_cookie(name)
|
|
73
|
-
@bridge.delete_cookie name
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
#
|
|
77
|
-
# Delete all cookies
|
|
78
|
-
#
|
|
79
|
-
|
|
80
|
-
def delete_all_cookies
|
|
81
|
-
@bridge.delete_all_cookies
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
# Get all cookies
|
|
86
|
-
#
|
|
87
|
-
# @return [Array<Hash>] list of cookies
|
|
88
|
-
#
|
|
89
|
-
|
|
90
|
-
def all_cookies
|
|
91
|
-
@bridge.cookies.map { |cookie| convert_cookie(cookie) }
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def timeouts
|
|
95
|
-
@timeouts ||= Timeouts.new(@bridge)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
#
|
|
99
|
-
# @api beta This API may be changed or removed in a future release.
|
|
100
|
-
#
|
|
101
|
-
|
|
102
|
-
def logs
|
|
103
|
-
@logs ||= Logs.new(@bridge)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
#
|
|
107
|
-
# @api beta This API may be changed or removed in a future release.
|
|
108
|
-
#
|
|
109
|
-
|
|
110
|
-
def window
|
|
111
|
-
@window ||= Window.new(@bridge)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
private
|
|
115
|
-
|
|
116
|
-
SECONDS_PER_DAY = 86_400.0
|
|
22
|
+
module Common
|
|
23
|
+
class Options
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def generate_as_json(value)
|
|
27
|
+
if value.respond_to?(:as_json)
|
|
28
|
+
value.as_json
|
|
29
|
+
elsif value.is_a?(Hash)
|
|
30
|
+
value.each_with_object({}) { |(key, val), hash| hash[convert_json_key(key)] = generate_as_json(val) }
|
|
31
|
+
elsif value.is_a?(Array)
|
|
32
|
+
value.map(&method(:generate_as_json))
|
|
33
|
+
elsif value.is_a?(Symbol)
|
|
34
|
+
value.to_s
|
|
35
|
+
else
|
|
36
|
+
value
|
|
37
|
+
end
|
|
38
|
+
end
|
|
117
39
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
40
|
+
def convert_json_key(key)
|
|
41
|
+
key = camel_case(key) if key.is_a?(Symbol)
|
|
42
|
+
return key if key.is_a?(String)
|
|
121
43
|
|
|
122
|
-
|
|
123
|
-
case obj
|
|
124
|
-
when Time
|
|
125
|
-
obj.to_f
|
|
126
|
-
when DateTime
|
|
127
|
-
(obj - DateTime.civil(1970)) * SECONDS_PER_DAY
|
|
128
|
-
when Numeric
|
|
129
|
-
obj
|
|
130
|
-
else
|
|
131
|
-
raise ArgumentError, "invalid value for expiration date: #{obj.inspect}"
|
|
44
|
+
raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class}"
|
|
132
45
|
end
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def strip_port(str)
|
|
136
|
-
str.split(':', 2).first
|
|
137
|
-
end
|
|
138
46
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
domain: cookie['domain'] && strip_port(cookie['domain']),
|
|
145
|
-
expires: cookie['expiry'] && datetime_at(cookie['expiry']),
|
|
146
|
-
secure: cookie['secure']
|
|
147
|
-
}
|
|
148
|
-
end
|
|
149
|
-
end # Options
|
|
47
|
+
def camel_case(str)
|
|
48
|
+
str.to_s.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
|
|
49
|
+
end
|
|
50
|
+
end # Options
|
|
51
|
+
end # Common
|
|
150
52
|
end # WebDriver
|
|
151
53
|
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
|
|
@@ -25,12 +27,11 @@ module Selenium
|
|
|
25
27
|
module_function
|
|
26
28
|
|
|
27
29
|
def home
|
|
28
|
-
|
|
29
|
-
@home ||= jruby? ? ENV_JAVA['user.home'] : ENV['HOME']
|
|
30
|
+
@home ||= Dir.home
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
def engine
|
|
33
|
-
@engine ||=
|
|
34
|
+
@engine ||= RUBY_ENGINE.to_sym
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
def os
|
|
@@ -50,8 +51,13 @@ module Selenium
|
|
|
50
51
|
end
|
|
51
52
|
|
|
52
53
|
def ci
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
if ENV['TRAVIS']
|
|
55
|
+
:travis
|
|
56
|
+
elsif ENV['JENKINS']
|
|
57
|
+
:jenkins
|
|
58
|
+
elsif ENV['APPVEYOR']
|
|
59
|
+
:appveyor
|
|
60
|
+
end
|
|
55
61
|
end
|
|
56
62
|
|
|
57
63
|
def bitsize
|
|
@@ -70,10 +76,6 @@ module Selenium
|
|
|
70
76
|
engine == :jruby
|
|
71
77
|
end
|
|
72
78
|
|
|
73
|
-
def ironruby?
|
|
74
|
-
engine == :ironruby
|
|
75
|
-
end
|
|
76
|
-
|
|
77
79
|
def ruby_version
|
|
78
80
|
RUBY_VERSION
|
|
79
81
|
end
|
|
@@ -90,36 +92,47 @@ module Selenium
|
|
|
90
92
|
os == :linux
|
|
91
93
|
end
|
|
92
94
|
|
|
95
|
+
def wsl?
|
|
96
|
+
return false unless linux?
|
|
97
|
+
|
|
98
|
+
File.read('/proc/version').include?('Microsoft')
|
|
99
|
+
end
|
|
100
|
+
|
|
93
101
|
def cygwin?
|
|
94
102
|
RUBY_PLATFORM =~ /cygwin/
|
|
95
103
|
!Regexp.last_match.nil?
|
|
96
104
|
end
|
|
97
105
|
|
|
98
106
|
def null_device
|
|
99
|
-
|
|
100
|
-
File::NULL
|
|
101
|
-
else
|
|
102
|
-
Platform.windows? ? 'NUL' : '/dev/null'
|
|
103
|
-
end
|
|
107
|
+
File::NULL
|
|
104
108
|
end
|
|
105
109
|
|
|
106
110
|
def wrap_in_quotes_if_necessary(str)
|
|
107
111
|
windows? && !cygwin? ? %("#{str}") : str
|
|
108
112
|
end
|
|
109
113
|
|
|
110
|
-
def cygwin_path(path, opts
|
|
114
|
+
def cygwin_path(path, **opts)
|
|
111
115
|
flags = []
|
|
112
116
|
opts.each { |k, v| flags << "--#{k}" if v }
|
|
113
117
|
|
|
114
118
|
`cygpath #{flags.join ' '} "#{path}"`.strip
|
|
115
119
|
end
|
|
116
120
|
|
|
121
|
+
def unix_path(path)
|
|
122
|
+
path.tr(File::ALT_SEPARATOR, File::SEPARATOR)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def windows_path(path)
|
|
126
|
+
path.tr(File::SEPARATOR, File::ALT_SEPARATOR)
|
|
127
|
+
end
|
|
128
|
+
|
|
117
129
|
def make_writable(file)
|
|
118
130
|
File.chmod 0o766, file
|
|
119
131
|
end
|
|
120
132
|
|
|
121
133
|
def assert_file(path)
|
|
122
134
|
return if File.file? path
|
|
135
|
+
|
|
123
136
|
raise Error::WebDriverError, "not a file: #{path.inspect}"
|
|
124
137
|
end
|
|
125
138
|
|
|
@@ -127,6 +140,7 @@ module Selenium
|
|
|
127
140
|
assert_file(path)
|
|
128
141
|
|
|
129
142
|
return if File.executable? path
|
|
143
|
+
|
|
130
144
|
raise Error::WebDriverError, "not executable: #{path.inspect}"
|
|
131
145
|
end
|
|
132
146
|
|
|
@@ -147,7 +161,7 @@ module Selenium
|
|
|
147
161
|
binary_names.each do |binary_name|
|
|
148
162
|
paths.each do |path|
|
|
149
163
|
full_path = File.join(path, binary_name)
|
|
150
|
-
full_path
|
|
164
|
+
full_path = unix_path(full_path) if windows?
|
|
151
165
|
exe = Dir.glob(full_path).find { |f| File.executable?(f) }
|
|
152
166
|
return exe if exe
|
|
153
167
|
end
|
|
@@ -177,6 +191,7 @@ module Selenium
|
|
|
177
191
|
info = Socket.getaddrinfo 'localhost', 80, Socket::AF_INET, Socket::SOCK_STREAM
|
|
178
192
|
|
|
179
193
|
return info[0][3] unless info.empty?
|
|
194
|
+
|
|
180
195
|
raise Error::WebDriverError, "unable to translate 'localhost' for TCP + IPv4"
|
|
181
196
|
end
|
|
182
197
|
|
|
@@ -205,17 +220,3 @@ module Selenium
|
|
|
205
220
|
end # Platform
|
|
206
221
|
end # WebDriver
|
|
207
222
|
end # Selenium
|
|
208
|
-
|
|
209
|
-
if $PROGRAM_NAME == __FILE__
|
|
210
|
-
p engine: Selenium::WebDriver::Platform.engine,
|
|
211
|
-
os: Selenium::WebDriver::Platform.os,
|
|
212
|
-
ruby_version: Selenium::WebDriver::Platform.ruby_version,
|
|
213
|
-
jruby?: Selenium::WebDriver::Platform.jruby?,
|
|
214
|
-
windows?: Selenium::WebDriver::Platform.windows?,
|
|
215
|
-
home: Selenium::WebDriver::Platform.home,
|
|
216
|
-
bitsize: Selenium::WebDriver::Platform.bitsize,
|
|
217
|
-
localhost: Selenium::WebDriver::Platform.localhost,
|
|
218
|
-
ip: Selenium::WebDriver::Platform.ip,
|
|
219
|
-
interfaces: Selenium::WebDriver::Platform.interfaces,
|
|
220
|
-
null_device: Selenium::WebDriver::Platform.null_device
|
|
221
|
-
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
|
|
@@ -23,23 +25,10 @@ module Selenium
|
|
|
23
25
|
port
|
|
24
26
|
end
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
# (b) should pick a random port outside the ephemeral port range
|
|
31
|
-
#
|
|
32
|
-
server = TCPServer.new(Platform.localhost, 0)
|
|
33
|
-
port = server.addr[1]
|
|
34
|
-
server.close
|
|
35
|
-
|
|
36
|
-
port
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
IGNORED_ERRORS = [Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT]
|
|
40
|
-
IGNORED_ERRORS << Errno::EBADF if Platform.cygwin?
|
|
41
|
-
IGNORED_ERRORS << Errno::EACCES if Platform.windows?
|
|
42
|
-
IGNORED_ERRORS.freeze
|
|
28
|
+
IGNORED_ERRORS = [Errno::EADDRNOTAVAIL, Errno::EAFNOSUPPORT].tap { |arr|
|
|
29
|
+
arr << Errno::EBADF if Platform.cygwin?
|
|
30
|
+
arr << Errno::EACCES if Platform.windows?
|
|
31
|
+
}.freeze
|
|
43
32
|
|
|
44
33
|
def self.free?(port)
|
|
45
34
|
Platform.interfaces.each do |host|
|
|
@@ -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
|
|
@@ -35,7 +37,8 @@ module Selenium
|
|
|
35
37
|
auto_detect: 'autodetect',
|
|
36
38
|
socks: 'socksProxy',
|
|
37
39
|
socks_username: 'socksUsername',
|
|
38
|
-
socks_password: 'socksPassword'
|
|
40
|
+
socks_password: 'socksPassword',
|
|
41
|
+
socks_version: 'socksVersion'}.freeze
|
|
39
42
|
|
|
40
43
|
ALLOWED.each_key { |t| attr_reader t }
|
|
41
44
|
|
|
@@ -64,6 +67,7 @@ module Selenium
|
|
|
64
67
|
end
|
|
65
68
|
|
|
66
69
|
return if not_allowed.empty?
|
|
70
|
+
|
|
67
71
|
raise ArgumentError, "unknown option#{'s' if not_allowed.size != 1}: #{not_allowed.inspect}"
|
|
68
72
|
end
|
|
69
73
|
|
|
@@ -117,10 +121,13 @@ module Selenium
|
|
|
117
121
|
@socks_password = value
|
|
118
122
|
end
|
|
119
123
|
|
|
124
|
+
def socks_version=(value)
|
|
125
|
+
self.type = :manual
|
|
126
|
+
@socks_version = value
|
|
127
|
+
end
|
|
128
|
+
|
|
120
129
|
def type=(type)
|
|
121
|
-
unless TYPES.key? type
|
|
122
|
-
raise ArgumentError, "invalid proxy type: #{type.inspect}, expected one of #{TYPES.keys.inspect}"
|
|
123
|
-
end
|
|
130
|
+
raise ArgumentError, "invalid proxy type: #{type.inspect}, expected one of #{TYPES.keys.inspect}" unless TYPES.key? type
|
|
124
131
|
|
|
125
132
|
if defined?(@type) && type != @type
|
|
126
133
|
raise ArgumentError, "incompatible proxy type #{type.inspect} (already set to #{@type.inspect})"
|
|
@@ -140,7 +147,8 @@ module Selenium
|
|
|
140
147
|
'autodetect' => auto_detect,
|
|
141
148
|
'socksProxy' => socks,
|
|
142
149
|
'socksUsername' => socks_username,
|
|
143
|
-
'socksPassword' => socks_password
|
|
150
|
+
'socksPassword' => socks_password,
|
|
151
|
+
'socksVersion' => socks_version
|
|
144
152
|
}.delete_if { |_k, v| v.nil? }
|
|
145
153
|
|
|
146
154
|
json_result if json_result.length > 1
|
|
@@ -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
|
|
@@ -58,7 +60,7 @@ module Selenium
|
|
|
58
60
|
raise ArgumentError, "cannot find element by #{how.inspect}" unless by
|
|
59
61
|
|
|
60
62
|
bridge.find_element_by by, what.to_s, ref
|
|
61
|
-
rescue Selenium::WebDriver::Error::
|
|
63
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
|
62
64
|
# Implicit Wait times out in Edge
|
|
63
65
|
raise Selenium::WebDriver::Error::NoSuchElementError
|
|
64
66
|
end
|
|
@@ -76,7 +78,7 @@ module Selenium
|
|
|
76
78
|
raise ArgumentError, "cannot find elements by #{how.inspect}" unless by
|
|
77
79
|
|
|
78
80
|
bridge.find_elements_by by, what.to_s, ref
|
|
79
|
-
rescue Selenium::WebDriver::Error::
|
|
81
|
+
rescue Selenium::WebDriver::Error::TimeoutError
|
|
80
82
|
# Implicit Wait times out in Edge
|
|
81
83
|
[]
|
|
82
84
|
end
|
|
@@ -90,15 +92,11 @@ module Selenium
|
|
|
90
92
|
when 1
|
|
91
93
|
arg = args.first
|
|
92
94
|
|
|
93
|
-
unless arg.respond_to?(:shift)
|
|
94
|
-
raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift"
|
|
95
|
-
end
|
|
95
|
+
raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift" unless arg.respond_to?(:shift)
|
|
96
96
|
|
|
97
97
|
# this will be a single-entry hash, so use #shift over #first or #[]
|
|
98
98
|
arr = arg.dup.shift
|
|
99
|
-
unless arr.size == 2
|
|
100
|
-
raise ArgumentError, "expected #{arr.inspect} to have 2 elements"
|
|
101
|
-
end
|
|
99
|
+
raise ArgumentError, "expected #{arr.inspect} to have 2 elements" unless arr.size == 2
|
|
102
100
|
|
|
103
101
|
arr
|
|
104
102
|
else
|