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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +236 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/lib/selenium-webdriver.rb +2 -0
  6. data/lib/selenium/server.rb +13 -9
  7. data/lib/selenium/webdriver.rb +3 -1
  8. data/lib/selenium/webdriver/atoms.rb +20 -1
  9. data/lib/selenium/webdriver/atoms/getAttribute.js +6 -7
  10. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  11. data/lib/selenium/webdriver/chrome.rb +10 -4
  12. data/lib/selenium/webdriver/chrome/bridge.rb +27 -2
  13. data/lib/selenium/webdriver/chrome/driver.rb +33 -21
  14. data/lib/selenium/webdriver/chrome/options.rb +13 -6
  15. data/lib/selenium/webdriver/chrome/profile.rb +6 -5
  16. data/lib/selenium/webdriver/chrome/service.rb +13 -13
  17. data/lib/selenium/webdriver/common.rb +6 -2
  18. data/lib/selenium/webdriver/common/action_builder.rb +3 -1
  19. data/lib/selenium/webdriver/common/alert.rb +2 -0
  20. data/lib/selenium/webdriver/common/bridge_helper.rb +8 -5
  21. data/lib/selenium/webdriver/common/driver.rb +22 -7
  22. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +2 -0
  24. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +2 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +3 -3
  26. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +2 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +3 -1
  28. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +2 -0
  29. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -0
  30. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -0
  31. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +2 -0
  32. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -0
  33. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +3 -1
  34. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -0
  35. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -3
  36. data/lib/selenium/webdriver/common/element.rb +4 -2
  37. data/lib/selenium/webdriver/common/error.rb +75 -18
  38. data/lib/selenium/webdriver/common/file_reaper.rb +3 -3
  39. data/lib/selenium/webdriver/common/html5/local_storage.rb +2 -0
  40. data/lib/selenium/webdriver/common/html5/session_storage.rb +2 -0
  41. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +4 -1
  42. data/lib/selenium/webdriver/common/interactions/input_device.rb +4 -1
  43. data/lib/selenium/webdriver/common/interactions/interaction.rb +3 -0
  44. data/lib/selenium/webdriver/common/interactions/interactions.rb +3 -1
  45. data/lib/selenium/webdriver/common/interactions/key_actions.rb +2 -0
  46. data/lib/selenium/webdriver/common/interactions/key_input.rb +4 -0
  47. data/lib/selenium/webdriver/common/interactions/none_input.rb +3 -0
  48. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +14 -4
  49. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +7 -0
  50. data/lib/selenium/webdriver/common/keyboard.rb +4 -1
  51. data/lib/selenium/webdriver/common/keys.rb +3 -0
  52. data/lib/selenium/webdriver/common/log_entry.rb +4 -2
  53. data/lib/selenium/webdriver/common/logger.rb +15 -40
  54. data/lib/selenium/webdriver/common/logs.rb +2 -0
  55. data/lib/selenium/webdriver/common/manager.rb +177 -0
  56. data/lib/selenium/webdriver/common/mouse.rb +3 -0
  57. data/lib/selenium/webdriver/common/navigation.rb +2 -0
  58. data/lib/selenium/webdriver/common/options.rb +28 -126
  59. data/lib/selenium/webdriver/common/platform.rb +31 -30
  60. data/lib/selenium/webdriver/common/port_prober.rb +6 -17
  61. data/lib/selenium/webdriver/common/profile_helper.rb +2 -0
  62. data/lib/selenium/webdriver/common/proxy.rb +13 -5
  63. data/lib/selenium/webdriver/common/search_context.rb +6 -8
  64. data/lib/selenium/webdriver/common/service.rb +87 -29
  65. data/lib/selenium/webdriver/common/socket_lock.rb +10 -3
  66. data/lib/selenium/webdriver/common/socket_poller.rb +26 -17
  67. data/lib/selenium/webdriver/common/target_locator.rb +6 -4
  68. data/lib/selenium/webdriver/common/timeouts.rb +2 -0
  69. data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -6
  70. data/lib/selenium/webdriver/common/touch_screen.rb +4 -1
  71. data/lib/selenium/webdriver/common/w3c_action_builder.rb +3 -0
  72. data/lib/selenium/webdriver/common/{w3c_options.rb → w3c_manager.rb} +3 -1
  73. data/lib/selenium/webdriver/common/wait.rb +13 -5
  74. data/lib/selenium/webdriver/common/window.rb +2 -0
  75. data/lib/selenium/webdriver/common/zipper.rb +3 -3
  76. data/lib/selenium/webdriver/edge.rb +12 -5
  77. data/lib/selenium/webdriver/edge/bridge.rb +2 -0
  78. data/lib/selenium/webdriver/edge/driver.rb +6 -13
  79. data/lib/selenium/webdriver/edge/options.rb +80 -0
  80. data/lib/selenium/webdriver/edge/service.rb +12 -15
  81. data/lib/selenium/webdriver/firefox.rb +10 -4
  82. data/lib/selenium/webdriver/firefox/binary.rb +9 -8
  83. data/lib/selenium/webdriver/firefox/driver.rb +2 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +4 -4
  85. data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -1
  86. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  87. data/lib/selenium/webdriver/firefox/launcher.rb +3 -0
  88. data/lib/selenium/webdriver/firefox/legacy/driver.rb +7 -3
  89. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +4 -2
  90. data/lib/selenium/webdriver/firefox/marionette/driver.rb +6 -12
  91. data/lib/selenium/webdriver/firefox/options.rb +22 -9
  92. data/lib/selenium/webdriver/firefox/profile.rb +7 -8
  93. data/lib/selenium/webdriver/firefox/profiles_ini.rb +3 -0
  94. data/lib/selenium/webdriver/firefox/service.rb +11 -22
  95. data/lib/selenium/webdriver/firefox/util.rb +2 -0
  96. data/lib/selenium/webdriver/ie.rb +10 -4
  97. data/lib/selenium/webdriver/ie/driver.rb +5 -11
  98. data/lib/selenium/webdriver/ie/options.rb +6 -4
  99. data/lib/selenium/webdriver/ie/service.rb +8 -12
  100. data/lib/selenium/webdriver/remote.rb +2 -0
  101. data/lib/selenium/webdriver/remote/bridge.rb +15 -10
  102. data/lib/selenium/webdriver/remote/capabilities.rb +28 -12
  103. data/lib/selenium/webdriver/remote/driver.rb +2 -0
  104. data/lib/selenium/webdriver/remote/http/common.rb +11 -4
  105. data/lib/selenium/webdriver/remote/http/curb.rb +4 -2
  106. data/lib/selenium/webdriver/remote/http/default.rb +31 -25
  107. data/lib/selenium/webdriver/remote/http/persistent.rb +3 -1
  108. data/lib/selenium/webdriver/remote/oss/bridge.rb +14 -6
  109. data/lib/selenium/webdriver/remote/oss/commands.rb +106 -104
  110. data/lib/selenium/webdriver/remote/response.rb +11 -3
  111. data/lib/selenium/webdriver/remote/server_error.rb +2 -0
  112. data/lib/selenium/webdriver/remote/w3c/bridge.rb +48 -16
  113. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +38 -21
  114. data/lib/selenium/webdriver/remote/w3c/commands.rb +66 -57
  115. data/lib/selenium/webdriver/safari.rb +12 -4
  116. data/lib/selenium/webdriver/safari/bridge.rb +5 -3
  117. data/lib/selenium/webdriver/safari/driver.rb +19 -12
  118. data/lib/selenium/webdriver/safari/options.rb +60 -0
  119. data/lib/selenium/webdriver/safari/service.rb +6 -25
  120. data/lib/selenium/webdriver/support.rb +2 -0
  121. data/lib/selenium/webdriver/support/abstract_event_listener.rb +2 -0
  122. data/lib/selenium/webdriver/support/block_event_listener.rb +3 -1
  123. data/lib/selenium/webdriver/support/color.rb +11 -9
  124. data/lib/selenium/webdriver/support/escaper.rb +2 -0
  125. data/lib/selenium/webdriver/support/event_firing_bridge.rb +3 -1
  126. data/lib/selenium/webdriver/support/select.rb +19 -18
  127. data/lib/selenium/webdriver/version.rb +3 -1
  128. data/selenium-webdriver.gemspec +15 -8
  129. 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
@@ -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
- class Options
21
- #
22
- # @api private
23
- #
24
-
25
- def initialize(bridge)
26
- @bridge = bridge
27
- end
28
-
29
- #
30
- # Add a cookie to the browser
31
- #
32
- # @param [Hash] opts the options to create a cookie with.
33
- # @option opts [String] :name A name
34
- # @option opts [String] :value A value
35
- # @option opts [String] :path ('/') A path
36
- # @option opts [String] :secure (false) A boolean
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
- def datetime_at(int)
119
- DateTime.civil(1970) + (int / SECONDS_PER_DAY)
120
- end
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
- def seconds_from(obj)
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
- def convert_cookie(cookie)
140
- {
141
- name: cookie['name'],
142
- value: cookie['value'],
143
- path: cookie['path'],
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
- # jruby has an issue with ENV['HOME'] on Windows
29
- @home ||= jruby? ? ENV_JAVA['user.home'] : ENV['HOME']
30
+ @home ||= Dir.home
30
31
  end
31
32
 
32
33
  def engine
33
- @engine ||= defined?(RUBY_ENGINE) ? RUBY_ENGINE.to_sym : :ruby
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
- return :travis if ENV['TRAVIS']
54
- :jenkins if ENV['JENKINS']
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
- @null_device ||= if defined?(File::NULL)
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.tr!('\\', '/') if windows?
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
- def self.random
27
- # TODO: Avoid this
28
- #
29
- # (a) should pick a port that's guaranteed to be free on all interfaces
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
@@ -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'}.freeze
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::TimeOutError
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::TimeOutError
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