selenium-webdriver 4.9.0 → 4.11.0

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +40 -0
  3. data/Gemfile +2 -0
  4. data/README.md +2 -2
  5. data/bin/linux/selenium-manager +0 -0
  6. data/bin/macos/selenium-manager +0 -0
  7. data/bin/windows/selenium-manager.exe +0 -0
  8. data/lib/selenium/server.rb +4 -16
  9. data/lib/selenium/webdriver/atoms/findElements.js +3 -4
  10. data/lib/selenium/webdriver/chrome/service.rb +1 -3
  11. data/lib/selenium/webdriver/chromium/options.rb +0 -18
  12. data/lib/selenium/webdriver/chromium.rb +0 -1
  13. data/lib/selenium/webdriver/common/action_builder.rb +0 -8
  14. data/lib/selenium/webdriver/common/child_process.rb +11 -11
  15. data/lib/selenium/webdriver/common/driver_finder.rb +10 -8
  16. data/lib/selenium/webdriver/common/error.rb +28 -3
  17. data/lib/selenium/webdriver/common/logger.rb +87 -30
  18. data/lib/selenium/webdriver/common/options.rb +3 -22
  19. data/lib/selenium/webdriver/common/platform.rb +0 -49
  20. data/lib/selenium/webdriver/common/port_prober.rb +1 -1
  21. data/lib/selenium/webdriver/common/proxy.rb +1 -1
  22. data/lib/selenium/webdriver/common/selenium_manager.rb +50 -27
  23. data/lib/selenium/webdriver/common/service.rb +11 -13
  24. data/lib/selenium/webdriver/common/service_manager.rb +4 -2
  25. data/lib/selenium/webdriver/common/socket_lock.rb +1 -1
  26. data/lib/selenium/webdriver/common/socket_poller.rb +1 -1
  27. data/lib/selenium/webdriver/common/websocket_connection.rb +3 -3
  28. data/lib/selenium/webdriver/devtools.rb +1 -1
  29. data/lib/selenium/webdriver/edge/options.rb +14 -0
  30. data/lib/selenium/webdriver/edge/service.rb +1 -3
  31. data/lib/selenium/webdriver/firefox/options.rb +0 -15
  32. data/lib/selenium/webdriver/firefox/profile.rb +1 -1
  33. data/lib/selenium/webdriver/firefox/service.rb +0 -12
  34. data/lib/selenium/webdriver/ie/options.rb +2 -1
  35. data/lib/selenium/webdriver/ie/service.rb +0 -16
  36. data/lib/selenium/webdriver/remote/bridge.rb +6 -5
  37. data/lib/selenium/webdriver/remote/capabilities.rb +0 -72
  38. data/lib/selenium/webdriver/remote/http/common.rb +3 -3
  39. data/lib/selenium/webdriver/remote/http/curb.rb +1 -1
  40. data/lib/selenium/webdriver/remote/http/default.rb +2 -3
  41. data/lib/selenium/webdriver/remote/server_error.rb +1 -1
  42. data/lib/selenium/webdriver/safari/service.rb +10 -0
  43. data/lib/selenium/webdriver/support/color.rb +8 -8
  44. data/lib/selenium/webdriver/version.rb +1 -1
  45. data/lib/selenium/webdriver.rb +2 -1
  46. data/selenium-webdriver.gemspec +2 -2
  47. metadata +13 -14
  48. data/lib/selenium/webdriver/chromium/service.rb +0 -42
@@ -62,18 +62,6 @@ module Selenium
62
62
  end
63
63
  end
64
64
 
65
- def bitsize
66
- @bitsize ||= if defined?(FFI::Platform::ADDRESS_SIZE)
67
- FFI::Platform::ADDRESS_SIZE
68
- elsif defined?(FFI)
69
- FFI.type_size(:pointer) == 4 ? 32 : 64
70
- elsif jruby?
71
- Integer(ENV_JAVA['sun.arch.data.model'])
72
- else
73
- 1.size == 4 ? 32 : 64
74
- end
75
- end
76
-
77
65
  def jruby?
78
66
  engine == :jruby
79
67
  end
@@ -158,43 +146,6 @@ module Selenium
158
146
  at_exit { yield if Process.pid == pid }
159
147
  end
160
148
 
161
- def find_binary(*binary_names)
162
- paths = ENV['PATH'].split(File::PATH_SEPARATOR)
163
-
164
- if windows?
165
- binary_names.map! { |n| "#{n}.exe" }
166
- binary_names.dup.each { |n| binary_names << n.gsub('exe', 'bat') }
167
- end
168
-
169
- binary_names.each do |binary_name|
170
- paths.each do |path|
171
- full_path = File.join(path, binary_name)
172
- full_path = unix_path(full_path) if windows?
173
- exe = Dir.glob(full_path).find { |f| File.executable?(f) }
174
- return exe if exe
175
- end
176
- end
177
-
178
- nil
179
- end
180
-
181
- def find_in_program_files(*binary_names)
182
- paths = [
183
- ENV.fetch('PROGRAMFILES', '\\Program Files'),
184
- ENV.fetch('ProgramFiles(x86)', '\\Program Files (x86)'),
185
- ENV.fetch('ProgramW6432', '\\Program Files')
186
- ]
187
-
188
- paths.each do |root|
189
- binary_names.each do |name|
190
- exe = File.join(root, name)
191
- return exe if File.executable?(exe)
192
- end
193
- end
194
-
195
- nil
196
- end
197
-
198
149
  def localhost
199
150
  info = Socket.getaddrinfo 'localhost', 80, Socket::AF_INET, Socket::SOCK_STREAM
200
151
 
@@ -34,7 +34,7 @@ module Selenium
34
34
  Platform.interfaces.each do |host|
35
35
  TCPServer.new(host, port).close
36
36
  rescue *IGNORED_ERRORS => e
37
- WebDriver.logger.debug("port prober could not bind to #{host}:#{port} (#{e.message})")
37
+ WebDriver.logger.debug("port prober could not bind to #{host}:#{port} (#{e.message})", id: :driver_service)
38
38
  # ignored - some machines appear unable to bind to some of their interfaces
39
39
  end
40
40
 
@@ -152,7 +152,7 @@ module Selenium
152
152
  'socksUsername' => socks_username,
153
153
  'socksPassword' => socks_password,
154
154
  'socksVersion' => socks_version
155
- }.delete_if { |_k, v| v.nil? }
155
+ }.compact
156
156
 
157
157
  json_result if json_result.length > 1
158
158
  end
@@ -27,20 +27,36 @@ module Selenium
27
27
  # @api private
28
28
  #
29
29
  class SeleniumManager
30
- BIN_PATH = '../../../../../bin'
31
-
32
30
  class << self
31
+ attr_writer :bin_path
32
+
33
+ def bin_path
34
+ @bin_path ||= '../../../../../bin'
35
+ end
36
+
33
37
  # @param [Options] options browser options.
34
38
  # @return [String] the path to the correct driver.
35
39
  def driver_path(options)
36
- message = 'applicable driver not found; attempting to install with Selenium Manager'
37
- WebDriver.logger.warn(message)
40
+ command = generate_command(binary, options)
41
+
42
+ output = run(*command)
43
+
44
+ browser_path = output['browser_path']
45
+ driver_path = output['driver_path']
46
+ Platform.assert_executable driver_path
38
47
 
39
- unless options.is_a?(Options)
40
- raise ArgumentError, "SeleniumManager requires a WebDriver::Options instance, not #{options.inspect}"
48
+ if options.respond_to? :binary
49
+ options.binary = browser_path
50
+ options.browser_version = nil
41
51
  end
42
52
 
43
- command = [binary, '--browser', options.browser_name, '--output', 'json']
53
+ driver_path
54
+ end
55
+
56
+ private
57
+
58
+ def generate_command(binary, options)
59
+ command = [binary, '--browser', options.browser_name]
44
60
  if options.browser_version
45
61
  command << '--browser-version'
46
62
  command << options.browser_version
@@ -49,21 +65,17 @@ module Selenium
49
65
  command << '--browser-path'
50
66
  command << options.binary.gsub('\\', '\\\\\\')
51
67
  end
52
- command << '--debug' if WebDriver.logger.debug?
53
-
54
- location = run(*command)
55
- WebDriver.logger.debug("Driver found at #{location}")
56
- Platform.assert_executable location
57
-
58
- location
68
+ if options.proxy
69
+ command << '--proxy'
70
+ (command << options.proxy.ssl) || options.proxy.http
71
+ end
72
+ command
59
73
  end
60
74
 
61
- private
62
-
63
75
  # @return [String] the path to the correct selenium manager
64
76
  def binary
65
77
  @binary ||= begin
66
- path = File.expand_path(BIN_PATH, __FILE__)
78
+ path = File.expand_path(bin_path, __FILE__)
67
79
  path << if Platform.windows?
68
80
  '/windows/selenium-manager.exe'
69
81
  elsif Platform.mac?
@@ -72,32 +84,43 @@ module Selenium
72
84
  '/linux/selenium-manager'
73
85
  end
74
86
  location = File.expand_path(path, __FILE__)
75
- unless location.is_a?(String) && File.exist?(location) && File.executable?(location)
76
- raise Error::WebDriverError, 'Unable to obtain Selenium Manager'
87
+
88
+ begin
89
+ Platform.assert_file(location)
90
+ Platform.assert_executable(location)
91
+ rescue TypeError
92
+ raise Error::WebDriverError,
93
+ "Unable to locate or obtain Selenium Manager binary; #{location} is not a valid file object"
94
+ rescue Error::WebDriverError => e
95
+ raise Error::WebDriverError, "Selenium Manager binary located, but #{e.message}"
77
96
  end
78
97
 
79
- WebDriver.logger.debug("Selenium Manager found at #{location}")
98
+ WebDriver.logger.debug("Selenium Manager binary found at #{location}", id: :selenium_manager)
80
99
  location
81
100
  end
82
101
  end
83
102
 
84
103
  def run(*command)
85
- WebDriver.logger.debug("Executing Process #{command}")
104
+ command += %w[--output json]
105
+ command << '--debug' if WebDriver.logger.debug?
106
+
107
+ WebDriver.logger.debug("Executing Process #{command}", id: :selenium_manager)
86
108
 
87
109
  begin
88
110
  stdout, stderr, status = Open3.capture3(*command)
89
111
  json_output = stdout.empty? ? nil : JSON.parse(stdout)
90
- result = json_output&.dig('result', 'message')
112
+ result = json_output['result']
91
113
  rescue StandardError => e
92
- raise Error::WebDriverError, "Unsuccessful command executed: #{command}", e.message
114
+ raise Error::WebDriverError, "Unsuccessful command executed: #{command}; #{e.message}"
93
115
  end
94
116
 
95
- if status.exitstatus.positive?
96
- raise Error::WebDriverError, "Unsuccessful command executed: #{command}\n#{result}#{stderr}"
117
+ (json_output&.fetch('logs') || []).each do |log|
118
+ level = log['level'].casecmp('info').zero? ? 'debug' : log['level'].downcase
119
+ WebDriver.logger.send(level, log['message'], id: :selenium_manager)
97
120
  end
98
121
 
99
- json_output['logs'].each do |log|
100
- WebDriver.logger.send(log['level'].downcase, log['message'])
122
+ if status.exitstatus.positive?
123
+ raise Error::WebDriverError, "Unsuccessful command executed: #{command}\n#{result}#{stderr}"
101
124
  end
102
125
 
103
126
  result
@@ -57,7 +57,7 @@ module Selenium
57
57
  end
58
58
  end
59
59
 
60
- attr_accessor :host, :executable_path, :port, :args
60
+ attr_accessor :host, :executable_path, :port, :log, :args
61
61
  alias extra_args args
62
62
 
63
63
  #
@@ -66,15 +66,22 @@ module Selenium
66
66
  # @api private
67
67
  #
68
68
 
69
- def initialize(path: nil, port: nil, args: nil)
69
+ def initialize(path: nil, port: nil, log: nil, args: nil)
70
70
  port ||= self.class::DEFAULT_PORT
71
71
  args ||= []
72
72
 
73
73
  @executable_path = path
74
74
  @host = Platform.localhost
75
75
  @port = Integer(port)
76
-
77
- @args = args.is_a?(Hash) ? extract_service_args(args) : args
76
+ @log = case log
77
+ when :stdout
78
+ $stdout
79
+ when :stderr
80
+ $stderr
81
+ else
82
+ log
83
+ end
84
+ @args = args
78
85
 
79
86
  raise Error::WebDriverError, "invalid port: #{@port}" if @port < 1
80
87
  end
@@ -86,15 +93,6 @@ module Selenium
86
93
  def shutdown_supported
87
94
  self.class::SHUTDOWN_SUPPORTED
88
95
  end
89
-
90
- protected
91
-
92
- def extract_service_args(driver_opts)
93
- WebDriver.logger.deprecate('initializing Service class with :args using Hash',
94
- ':args parameter with an Array of String values',
95
- id: :driver_opts)
96
- driver_opts.key?(:args) ? driver_opts.delete(:args) : []
97
- end
98
96
  end # Service
99
97
  end # WebDriver
100
98
  end # Selenium
@@ -41,6 +41,7 @@ module Selenium
41
41
  @host = Platform.localhost
42
42
  @port = config.port
43
43
  @extra_args = config.args
44
+ @io = config.log
44
45
  @shutdown_supported = config.shutdown_supported
45
46
 
46
47
  raise Error::WebDriverError, "invalid port: #{@port}" if @port < 1
@@ -77,9 +78,10 @@ module Selenium
77
78
  private
78
79
 
79
80
  def build_process(*command)
80
- WebDriver.logger.debug("Executing Process #{command}")
81
+ WebDriver.logger.debug("Executing Process #{command}", id: :driver_service)
81
82
  @process = ChildProcess.build(*command)
82
- @process.io = WebDriver.logger.io if WebDriver.logger.debug?
83
+ @io ||= WebDriver.logger.io if WebDriver.logger.debug?
84
+ @process.io = @io if @io
83
85
 
84
86
  @process
85
87
  end
@@ -70,7 +70,7 @@ module Selenium
70
70
  @server.close_on_exec = true
71
71
  true
72
72
  rescue SocketError, Errno::EADDRINUSE, Errno::EBADF => e
73
- WebDriver.logger.debug("#{self}: #{e.message}")
73
+ WebDriver.logger.debug("#{self}: #{e.message}", id: :driver_service)
74
74
  false
75
75
  end
76
76
 
@@ -93,7 +93,7 @@ module Selenium
93
93
  true
94
94
  rescue *NOT_CONNECTED_ERRORS
95
95
  sock&.close
96
- WebDriver.logger.debug("polling for socket on #{[@host, @port].inspect}")
96
+ WebDriver.logger.debug("polling for socket on #{[@host, @port].inspect}", id: :driver_service)
97
97
  false
98
98
  end
99
99
  end
@@ -55,7 +55,7 @@ module Selenium
55
55
  def send_cmd(**payload)
56
56
  id = next_id
57
57
  data = payload.merge(id: id)
58
- WebDriver.logger.debug "WebSocket -> #{data}"[...MAX_LOG_MESSAGE_SIZE]
58
+ WebDriver.logger.debug "WebSocket -> #{data}"[...MAX_LOG_MESSAGE_SIZE], id: :bidi
59
59
  data = JSON.generate(data)
60
60
  out_frame = WebSocket::Frame::Outgoing::Client.new(version: ws.version, data: data, type: 'text')
61
61
  socket.write(out_frame.to_s)
@@ -112,7 +112,7 @@ module Selenium
112
112
 
113
113
  message = JSON.parse(message)
114
114
  messages[message['id']] = message
115
- WebDriver.logger.debug "WebSocket <- #{message}"[...MAX_LOG_MESSAGE_SIZE]
115
+ WebDriver.logger.debug "WebSocket <- #{message}"[...MAX_LOG_MESSAGE_SIZE], id: :bidi
116
116
 
117
117
  message
118
118
  end
@@ -129,7 +129,7 @@ module Selenium
129
129
  Thread.current.report_on_exception = true
130
130
 
131
131
  yield params
132
- rescue *CONNECTION_ERRORS
132
+ rescue Error::WebDriverError, *CONNECTION_ERRORS
133
133
  Thread.stop
134
134
  end
135
135
  end
@@ -60,7 +60,7 @@ module Selenium
60
60
  "#{namespace}::#{Object.const_get(methods_to_classes)[method]}"
61
61
  else
62
62
  # selenium-devtools 0.112 and older
63
- "#{namespace}::#{method.capitalize}}"
63
+ "#{namespace}::#{method.capitalize}"
64
64
  end
65
65
 
66
66
  return unless Object.const_defined?(desired_class)
@@ -26,6 +26,20 @@ module Selenium
26
26
  KEY = 'ms:edgeOptions'
27
27
  BROWSER = 'MicrosoftEdge'
28
28
 
29
+ #
30
+ # Changes the browser name enable webview2
31
+ # see: https://learn.microsoft.com/en-us/microsoft-edge/webview2/how-to/webdriver
32
+ # Automation of WebView2 apps with Microsoft Edge WebDriver
33
+ #
34
+ # @example Enable webview2
35
+ # options = Selenium::WebDriver::Edge::Options.new
36
+ # options.webview2!
37
+ #
38
+
39
+ def webview2!
40
+ @options[:browser_name] = 'webview2'
41
+ end
42
+
29
43
  private
30
44
 
31
45
  def enable_logging(browser_options)
@@ -17,12 +17,10 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- require 'selenium/webdriver/chromium/service'
21
-
22
20
  module Selenium
23
21
  module WebDriver
24
22
  module Edge
25
- class Service < Chromium::Service
23
+ class Service < WebDriver::Service
26
24
  DEFAULT_PORT = 9515
27
25
  EXECUTABLE = 'msedgedriver'
28
26
  SHUTDOWN_SUPPORTED = true
@@ -99,21 +99,6 @@ module Selenium
99
99
  @options[:prefs][name] = value
100
100
  end
101
101
 
102
- #
103
- # Run Firefox in headless mode.
104
- #
105
- # @example Enable headless mode
106
- # options = Selenium::WebDriver::Firefox::Options.new
107
- # options.headless!
108
- #
109
-
110
- def headless!
111
- WebDriver.logger.deprecate('`Options#headless!`',
112
- "`Options#add_argument('-headless')`",
113
- id: :headless)
114
- add_argument '-headless'
115
- end
116
-
117
102
  #
118
103
  # Sets Firefox profile.
119
104
  #
@@ -160,7 +160,7 @@ module Selenium
160
160
  destination = File.join(directory, 'extensions')
161
161
 
162
162
  @extensions.each do |name, extension|
163
- WebDriver.logger.debug({extenstion: name}.inspect)
163
+ WebDriver.logger.debug({extension: name}.inspect, id: :firefox_profile)
164
164
  extension.write_to(destination)
165
165
  end
166
166
  end
@@ -24,18 +24,6 @@ module Selenium
24
24
  DEFAULT_PORT = 4444
25
25
  EXECUTABLE = 'geckodriver'
26
26
  SHUTDOWN_SUPPORTED = false
27
-
28
- private
29
-
30
- def extract_service_args(driver_opts)
31
- driver_args = super
32
- driver_opts = driver_opts.dup
33
- driver_args << "--binary=#{driver_opts[:binary]}" if driver_opts.key?(:binary)
34
- driver_args << "--log=#{driver_opts[:log]}" if driver_opts.key?(:log)
35
- driver_args << "--marionette-port=#{driver_opts[:marionette_port]}" if driver_opts.key?(:marionette_port)
36
- driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
37
- driver_args
38
- end
39
27
  end # Service
40
28
  end # Firefox
41
29
  end # WebDriver
@@ -41,7 +41,8 @@ module Selenium
41
41
  use_per_process_proxy: 'ie.usePerProcessProxy',
42
42
  use_legacy_file_upload_dialog_handling: 'ie.useLegacyFileUploadDialogHandling',
43
43
  attach_to_edge_chrome: 'ie.edgechromium',
44
- edge_executable_path: 'ie.edgepath'
44
+ edge_executable_path: 'ie.edgepath',
45
+ ignore_process_match: 'ie.ignoreprocessmatch'
45
46
  }.freeze
46
47
  BROWSER = 'internet explorer'
47
48
 
@@ -24,22 +24,6 @@ module Selenium
24
24
  DEFAULT_PORT = 5555
25
25
  EXECUTABLE = 'IEDriverServer'
26
26
  SHUTDOWN_SUPPORTED = true
27
-
28
- private
29
-
30
- def extract_service_args(driver_opts)
31
- driver_args = super
32
- driver_opts = driver_opts.dup
33
- driver_args << "--log-level=#{driver_opts[:log_level].to_s.upcase}" if driver_opts.key?(:log_level)
34
- driver_args << "--log-file=#{driver_opts[:log_file]}" if driver_opts.key?(:log_file)
35
- if driver_opts.key?(:implementation)
36
- driver_args << "--implementation=#{driver_opts[:implementation].to_s.upcase}"
37
- end
38
- driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
39
- driver_args << "--extract_path=#{driver_opts[:extract_path]}" if driver_opts.key?(:extract_path)
40
- driver_args << '--silent' if driver_opts[:silent] == true
41
- driver_args
42
- end
43
27
  end # Server
44
28
  end # IE
45
29
  end # WebDriver
@@ -407,7 +407,8 @@ module Selenium
407
407
 
408
408
  def upload(local_file)
409
409
  unless File.file?(local_file)
410
- WebDriver.logger.debug("File detector only works with files. #{local_file.inspect} isn`t a file!")
410
+ WebDriver.logger.debug("File detector only works with files. #{local_file.inspect} isn`t a file!",
411
+ id: :file_detector)
411
412
  raise Error::WebDriverError, "You are trying to work with something that isn't a file."
412
413
  end
413
414
 
@@ -443,7 +444,7 @@ module Selenium
443
444
  end
444
445
 
445
446
  def element_attribute(element, name)
446
- WebDriver.logger.info "Using script for :getAttribute of #{name}"
447
+ WebDriver.logger.debug "Using script for :getAttribute of #{name}", id: :script
447
448
  execute_atom :getAttribute, element, name
448
449
  end
449
450
 
@@ -503,7 +504,7 @@ module Selenium
503
504
  end
504
505
 
505
506
  def element_displayed?(element)
506
- WebDriver.logger.info 'Using script for :isDisplayed'
507
+ WebDriver.logger.debug 'Using script for :isDisplayed', id: :script
507
508
  execute_atom :isDisplayed, element
508
509
  end
509
510
 
@@ -615,7 +616,7 @@ module Selenium
615
616
  raise ArgumentError, "#{opts.inspect} invalid for #{command.inspect}"
616
617
  end
617
618
 
618
- WebDriver.logger.info("-> #{verb.to_s.upcase} #{path}")
619
+ WebDriver.logger.debug("-> #{verb.to_s.upcase} #{path}", id: :command)
619
620
  http.call(verb, path, command_hash)['value']
620
621
  end
621
622
 
@@ -682,7 +683,7 @@ module Selenium
682
683
  [how, what]
683
684
  end
684
685
 
685
- ESCAPE_CSS_REGEXP = /(['"\\#.:;,!?+<>=~*^$|%&@`{}\-\[\]()])/.freeze
686
+ ESCAPE_CSS_REGEXP = /(['"\\#.:;,!?+<>=~*^$|%&@`{}\-\[\]()])/
686
687
  UNICODE_CODE_POINT = 30
687
688
 
688
689
  # Escapes invalid characters in CSS selector.
@@ -53,83 +53,11 @@ module Selenium
53
53
  end
54
54
  end
55
55
 
56
- #
57
- # Backward compatibility
58
- #
59
-
60
- def version
61
- WebDriver.logger.deprecate('`Capabilities#version`', '`Capabilities#browser_version`', id: :jwp_caps)
62
- browser_version
63
- end
64
-
65
- def version=(value)
66
- WebDriver.logger.deprecate('`Capabilities#version=`', '`Capabilities#browser_version=`', id: :jwp_caps)
67
- self.browser_version = value
68
- end
69
-
70
- def platform
71
- WebDriver.logger.deprecate('`Capabilities#platform`', '`Capabilities#platform_name`', id: :jwp_caps)
72
- platform_name
73
- end
74
-
75
- def platform=(value)
76
- WebDriver.logger.deprecate('`Capabilities#platform=`', '`Capabilities#platform_name=`', id: :jwp_caps)
77
- self.platform_name = value
78
- end
79
-
80
56
  #
81
57
  # Convenience methods for the common choices.
82
58
  #
83
59
 
84
60
  class << self
85
- def chrome(opts = {})
86
- WebDriver.logger.deprecate('Remote::Capabilities.chrome', 'Options.chrome', id: :caps_browsers)
87
- new({
88
- browser_name: 'chrome'
89
- }.merge(opts))
90
- end
91
-
92
- def edge(opts = {})
93
- WebDriver.logger.deprecate('Remote::Capabilities.edge', 'Options.edge', id: :caps_browsers)
94
- new({
95
- browser_name: 'MicrosoftEdge'
96
- }.merge(opts))
97
- end
98
- alias microsoftedge edge
99
-
100
- def firefox(opts = {})
101
- WebDriver.logger.deprecate('Remote::Capabilities.firefox', 'Options.firefox', id: :caps_browsers)
102
- new({
103
- browser_name: 'firefox'
104
- }.merge(opts))
105
- end
106
- alias ff firefox
107
-
108
- def safari(opts = {})
109
- WebDriver.logger.deprecate('Remote::Capabilities.safari', 'Options.safari', id: :caps_browsers)
110
- new({
111
- browser_name: Selenium::WebDriver::Safari.technology_preview? ? 'Safari Technology Preview' : 'safari'
112
- }.merge(opts))
113
- end
114
-
115
- def htmlunit(opts = {})
116
- WebDriver.logger.deprecate('Remote::Capabilities.htmlunit',
117
- 'as argument in constructor',
118
- id: :caps_browsers)
119
- new({
120
- browser_name: 'htmlunit'
121
- }.merge(opts))
122
- end
123
-
124
- def internet_explorer(opts = {})
125
- WebDriver.logger.deprecate('Remote::Capabilities.ie', 'Options.ie', id: :caps_browsers)
126
- new({
127
- browser_name: 'internet explorer',
128
- platform_name: :windows
129
- }.merge(opts))
130
- end
131
- alias ie internet_explorer
132
-
133
61
  def always_match(capabilities)
134
62
  new(always_match: capabilities)
135
63
  end
@@ -49,8 +49,8 @@ module Selenium
49
49
  payload = JSON.generate(command_hash)
50
50
  headers['Content-Length'] = payload.bytesize.to_s if %i[post put].include?(verb)
51
51
 
52
- WebDriver.logger.info(" >>> #{url} | #{payload}")
53
- WebDriver.logger.debug(" > #{headers.inspect}")
52
+ WebDriver.logger.debug(" >>> #{url} | #{payload}", id: :command)
53
+ WebDriver.logger.debug(" > #{headers.inspect}", id: :header)
54
54
  elsif verb == :post
55
55
  payload = '{}'
56
56
  headers['Content-Length'] = '2'
@@ -75,7 +75,7 @@ module Selenium
75
75
  code = code.to_i
76
76
  body = body.to_s.strip
77
77
  content_type = content_type.to_s
78
- WebDriver.logger.info("<- #{body}")
78
+ WebDriver.logger.debug("<- #{body}", id: :command)
79
79
 
80
80
  if content_type.include? CONTENT_TYPE
81
81
  raise Error::WebDriverError, "empty body: #{content_type.inspect} (#{code})\n#{body}" if body.empty?
@@ -83,7 +83,7 @@ module Selenium
83
83
  c.max_redirects = MAX_REDIRECTS
84
84
  c.follow_location = true
85
85
  c.timeout = @timeout if @timeout
86
- c.verbose = WebDriver.logger.info?
86
+ c.verbose = WebDriver.logger.debug?
87
87
 
88
88
  c
89
89
  end
@@ -16,8 +16,6 @@
16
16
  # KIND, either express or implied. See the License for the
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
-
20
- require 'net/https'
21
19
  require 'ipaddr'
22
20
 
23
21
  module Selenium
@@ -96,11 +94,12 @@ module Selenium
96
94
  end
97
95
 
98
96
  if response.is_a? Net::HTTPRedirection
97
+ WebDriver.logger.debug("Redirect to #{response['Location']}; times: #{redirects}")
99
98
  raise Error::WebDriverError, 'too many redirects' if redirects >= MAX_REDIRECTS
100
99
 
101
100
  request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
102
101
  else
103
- WebDriver.logger.debug(" <<< #{response.instance_variable_get(:@header).inspect}")
102
+ WebDriver.logger.debug(" <<< #{response.instance_variable_get(:@header).inspect}", id: :header)
104
103
  create_response response.code, response.body, response.content_type
105
104
  end
106
105
  end
@@ -25,7 +25,7 @@ module Selenium
25
25
  if response.is_a? String
26
26
  super(response)
27
27
  else
28
- super("status code #{response.code}")
28
+ super("status code #{response.code}; payload #{response.payload}")
29
29
  end
30
30
  end
31
31
  end # ServerError