selenium-webdriver 3.12.0 → 3.142.7

Sign up to get free protection for your applications and to get access to all the features.
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