selenium-webdriver 4.1.0 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +70 -1
  3. data/LICENSE +1 -1
  4. data/NOTICE +1 -1
  5. data/lib/selenium/server.rb +14 -9
  6. data/lib/selenium/webdriver/bidi/session.rb +38 -0
  7. data/lib/selenium/webdriver/bidi.rb +55 -0
  8. data/lib/selenium/webdriver/chrome/features.rb +5 -0
  9. data/lib/selenium/webdriver/chrome/options.rb +19 -19
  10. data/lib/selenium/webdriver/chrome.rb +0 -14
  11. data/lib/selenium/webdriver/common/action_builder.rb +108 -21
  12. data/lib/selenium/webdriver/common/driver.rb +13 -55
  13. data/lib/selenium/webdriver/common/driver_extensions/{has_remote_status.rb → has_bidi.rb} +12 -5
  14. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +10 -0
  15. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +1 -2
  16. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +1 -1
  17. data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +1 -1
  18. data/lib/selenium/webdriver/common/element.rb +1 -1
  19. data/lib/selenium/webdriver/common/error.rb +1 -1
  20. data/lib/selenium/webdriver/common/interactions/input_device.rb +10 -4
  21. data/lib/selenium/webdriver/common/interactions/interaction.rb +12 -25
  22. data/lib/selenium/webdriver/common/interactions/interactions.rb +24 -4
  23. data/lib/selenium/webdriver/common/interactions/key_actions.rb +5 -1
  24. data/lib/selenium/webdriver/common/interactions/key_input.rb +11 -27
  25. data/lib/selenium/webdriver/common/interactions/none_input.rb +10 -8
  26. data/lib/selenium/webdriver/common/interactions/pause.rb +49 -0
  27. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +56 -66
  28. data/lib/selenium/webdriver/common/interactions/pointer_cancel.rb +45 -0
  29. data/lib/selenium/webdriver/common/interactions/pointer_event_properties.rb +63 -0
  30. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +15 -84
  31. data/lib/selenium/webdriver/common/interactions/pointer_move.rb +60 -0
  32. data/lib/selenium/webdriver/common/interactions/pointer_press.rb +85 -0
  33. data/lib/selenium/webdriver/common/interactions/scroll.rb +57 -0
  34. data/lib/selenium/webdriver/common/interactions/scroll_origin.rb +48 -0
  35. data/lib/selenium/webdriver/common/interactions/typing_interaction.rb +54 -0
  36. data/lib/selenium/webdriver/common/interactions/wheel_actions.rb +113 -0
  37. data/lib/selenium/webdriver/common/interactions/wheel_input.rb +42 -0
  38. data/lib/selenium/webdriver/common/keys.rb +1 -0
  39. data/lib/selenium/webdriver/common/manager.rb +0 -27
  40. data/lib/selenium/webdriver/common/options.rb +2 -9
  41. data/lib/selenium/webdriver/common/platform.rb +4 -4
  42. data/lib/selenium/webdriver/common/search_context.rb +0 -6
  43. data/lib/selenium/webdriver/common/service_manager.rb +2 -3
  44. data/lib/selenium/webdriver/common/shadow_root.rb +1 -1
  45. data/lib/selenium/webdriver/common/socket_poller.rb +1 -1
  46. data/lib/selenium/webdriver/common/websocket_connection.rb +149 -0
  47. data/lib/selenium/webdriver/common.rb +14 -3
  48. data/lib/selenium/webdriver/devtools/request.rb +1 -1
  49. data/lib/selenium/webdriver/devtools/response.rb +1 -1
  50. data/lib/selenium/webdriver/devtools.rb +5 -112
  51. data/lib/selenium/webdriver/edge/features.rb +1 -0
  52. data/lib/selenium/webdriver/firefox/driver.rb +1 -0
  53. data/lib/selenium/webdriver/firefox/features.rb +2 -5
  54. data/lib/selenium/webdriver/firefox/options.rb +3 -1
  55. data/lib/selenium/webdriver/firefox/profile.rb +1 -5
  56. data/lib/selenium/webdriver/firefox/util.rb +46 -0
  57. data/lib/selenium/webdriver/firefox.rb +1 -14
  58. data/lib/selenium/webdriver/ie.rb +0 -14
  59. data/lib/selenium/webdriver/remote/bridge.rb +21 -19
  60. data/lib/selenium/webdriver/remote/commands.rb +0 -5
  61. data/lib/selenium/webdriver/remote/driver.rb +0 -1
  62. data/lib/selenium/webdriver/remote/http/default.rb +6 -12
  63. data/lib/selenium/webdriver/remote/response.rb +2 -2
  64. data/lib/selenium/webdriver/safari.rb +0 -14
  65. data/lib/selenium/webdriver/support/cdp_client_generator.rb +4 -4
  66. data/lib/selenium/webdriver/support/color.rb +7 -7
  67. data/lib/selenium/webdriver/support/guards/guard_condition.rb +1 -1
  68. data/lib/selenium/webdriver/support/guards.rb +1 -1
  69. data/lib/selenium/webdriver/version.rb +1 -1
  70. data/lib/selenium/webdriver.rb +1 -0
  71. data/selenium-webdriver.gemspec +7 -4
  72. metadata +56 -8
  73. data/lib/selenium/webdriver/remote/http/persistent.rb +0 -65
@@ -23,20 +23,6 @@ module Selenium
23
23
  autoload :Driver, 'selenium/webdriver/ie/driver'
24
24
  autoload :Options, 'selenium/webdriver/ie/options'
25
25
  autoload :Service, 'selenium/webdriver/ie/service'
26
-
27
- def self.driver_path=(path)
28
- WebDriver.logger.deprecate 'Selenium::WebDriver::IE#driver_path=',
29
- 'Selenium::WebDriver::IE::Service#driver_path=',
30
- id: :driver_path
31
- Selenium::WebDriver::IE::Service.driver_path = path
32
- end
33
-
34
- def self.driver_path
35
- WebDriver.logger.deprecate 'Selenium::WebDriver::IE#driver_path',
36
- 'Selenium::WebDriver::IE::Service#driver_path',
37
- id: :driver_path
38
- Selenium::WebDriver::IE::Service.driver_path
39
- end
40
26
  end # IE
41
27
  end # WebDriver
42
28
  end # Selenium
@@ -30,8 +30,8 @@ module Selenium
30
30
 
31
31
  #
32
32
  # Initializes the bridge with the given server URL
33
- # @param [String, URI] :url url for the remote server
34
- # @param [Object] :http_client an HTTP client instance that implements the same protocol as Http::Default
33
+ # @param [String, URI] url url for the remote server
34
+ # @param [Object] http_client an HTTP client instance that implements the same protocol as Http::Default
35
35
  # @api private
36
36
  #
37
37
 
@@ -118,7 +118,7 @@ module Selenium
118
118
  end
119
119
 
120
120
  def alert=(keys)
121
- execute :send_alert_text, {}, {value: keys.split(//), text: keys}
121
+ execute :send_alert_text, {}, {value: keys.chars, text: keys}
122
122
  end
123
123
 
124
124
  def alert_text
@@ -146,9 +146,7 @@ module Selenium
146
146
  end
147
147
 
148
148
  def page_source
149
- execute_script('var source = document.documentElement.outerHTML;' \
150
- 'if (!source) { source = new XMLSerializer().serializeToString(document); }' \
151
- 'return source;')
149
+ execute :get_page_source
152
150
  end
153
151
 
154
152
  #
@@ -369,11 +367,8 @@ module Selenium
369
367
  # actions
370
368
  #
371
369
 
372
- def action(async = false)
373
- ActionBuilder.new self,
374
- Interactions.pointer(:mouse, name: 'mouse'),
375
- Interactions.key('keyboard'),
376
- async
370
+ def action(deprecated_async = nil, async: false, devices: [], duration: 250)
371
+ ActionBuilder.new self, nil, nil, deprecated_async, async: async, devices: devices, duration: duration
377
372
  end
378
373
  alias_method :actions, :action
379
374
 
@@ -412,8 +407,8 @@ module Selenium
412
407
  end
413
408
 
414
409
  # Keep .split(//) for backward compatibility for now
415
- text = keys.join('')
416
- execute :element_send_keys, {id: element}, {value: text.split(//), text: text}
410
+ text = keys.join
411
+ execute :element_send_keys, {id: element}, {value: text.chars, text: text}
417
412
  end
418
413
 
419
414
  def upload(local_file)
@@ -430,10 +425,19 @@ module Selenium
430
425
  end
431
426
 
432
427
  def submit_element(element)
433
- form = find_element_by('xpath', "./ancestor-or-self::form", [:element, element])
434
- execute_script("var e = arguments[0].ownerDocument.createEvent('Event');" \
435
- "e.initEvent('submit', true, true);" \
436
- 'if (arguments[0].dispatchEvent(e)) { arguments[0].submit() }', form.as_json)
428
+ script = "var form = arguments[0];\n" \
429
+ "while (form.nodeName != \"FORM\" && form.parentNode) {\n" \
430
+ " form = form.parentNode;\n" \
431
+ "}\n" \
432
+ "if (!form) { throw Error('Unable to find containing form element'); }\n" \
433
+ "if (!form.ownerDocument) { throw Error('Unable to find owning document'); }\n" \
434
+ "var e = form.ownerDocument.createEvent('Event');\n" \
435
+ "e.initEvent('submit', true, true);\n" \
436
+ "if (form.dispatchEvent(e)) { HTMLFormElement.prototype.submit.call(form) }\n"
437
+
438
+ execute_script(script, Element::ELEMENT_KEY => element)
439
+ rescue Error::JavascriptError
440
+ raise Error::UnsupportedOperationError, "To submit an element, it must be nested inside a form element"
437
441
  end
438
442
 
439
443
  #
@@ -639,8 +643,6 @@ module Selenium
639
643
  when 'name'
640
644
  how = 'css selector'
641
645
  what = "*[name='#{escape_css(what.to_s)}']"
642
- when 'tag name'
643
- how = 'css selector'
644
646
  end
645
647
 
646
648
  if what.is_a?(Hash)
@@ -60,10 +60,6 @@ module Selenium
60
60
  fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
61
61
  minimize_window: [:post, 'session/:session_id/window/minimize'],
62
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
63
  set_window_rect: [:post, 'session/:session_id/window/rect'],
68
64
  get_window_rect: [:get, 'session/:session_id/window/rect'],
69
65
  switch_to_frame: [:post, 'session/:session_id/frame'],
@@ -130,7 +126,6 @@ module Selenium
130
126
  #
131
127
 
132
128
  element_click: [:post, 'session/:session_id/element/:id/click'],
133
- element_tap: [:post, 'session/:session_id/element/:id/tap'],
134
129
  element_clear: [:post, 'session/:session_id/element/:id/clear'],
135
130
  element_send_keys: [:post, 'session/:session_id/element/:id/value'],
136
131
 
@@ -29,7 +29,6 @@ module Selenium
29
29
  class Driver < WebDriver::Driver
30
30
  include DriverExtensions::UploadsFiles
31
31
  include DriverExtensions::HasSessionId
32
- include DriverExtensions::HasRemoteStatus
33
32
 
34
33
  def initialize(bridge: nil, listener: nil, **opts)
35
34
  desired_capabilities = opts[:desired_capabilities]
@@ -75,9 +75,10 @@ module Selenium
75
75
  begin
76
76
  request = new_request_for(verb, url, headers, payload)
77
77
  response = response_for(request)
78
- rescue Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EADDRINUSE
79
- # a retry is sometimes needed on Windows XP where we may quickly
80
- # run out of ephemeral ports
78
+ rescue Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EADDRINUSE, Errno::EADDRNOTAVAIL
79
+ # a retry is sometimes needed:
80
+ # on Windows XP where we may quickly run out of ephemeral ports
81
+ # when the port becomes temporarily unavailable
81
82
  #
82
83
  # A more robust solution is bumping the MaxUserPort setting
83
84
  # as described here:
@@ -85,13 +86,6 @@ module Selenium
85
86
  # http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
86
87
  raise if retries >= MAX_RETRIES
87
88
 
88
- retries += 1
89
- sleep 2
90
- retry
91
- rescue Errno::EADDRNOTAVAIL => e
92
- # a retry is sometimes needed when the port becomes temporarily unavailable
93
- raise if retries >= MAX_RETRIES
94
-
95
89
  retries += 1
96
90
  sleep 2
97
91
  retry
@@ -142,8 +136,8 @@ module Selenium
142
136
 
143
137
  def proxy
144
138
  @proxy ||= begin
145
- proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
146
- no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
139
+ proxy = ENV.fetch('http_proxy', nil) || ENV.fetch('HTTP_PROXY', nil)
140
+ no_proxy = ENV.fetch('no_proxy', nil) || ENV.fetch('NO_PROXY', nil)
147
141
 
148
142
  if proxy
149
143
  proxy = "http://#{proxy}" unless proxy.start_with?('http://')
@@ -74,7 +74,7 @@ module Selenium
74
74
  end
75
75
 
76
76
  def backtrace_from_remote(server_trace)
77
- server_trace.map { |frame|
77
+ server_trace.filter_map do |frame|
78
78
  next unless frame.is_a?(Hash)
79
79
 
80
80
  file = frame['fileName']
@@ -87,7 +87,7 @@ module Selenium
87
87
  meth = 'unknown' if meth.nil? || meth.empty?
88
88
 
89
89
  "[remote server] #{file}:#{line}:in `#{meth}'"
90
- }.compact
90
+ end
91
91
  end
92
92
 
93
93
  def process_error
@@ -53,20 +53,6 @@ module Selenium
53
53
 
54
54
  raise Error::WebDriverError, 'Unable to find Safari'
55
55
  end
56
-
57
- def driver_path=(path)
58
- WebDriver.logger.deprecate 'Selenium::WebDriver::Safari#driver_path=',
59
- 'Selenium::WebDriver::Safari::Service#driver_path=',
60
- id: :driver_path
61
- Selenium::WebDriver::Safari::Service.driver_path = path
62
- end
63
-
64
- def driver_path
65
- WebDriver.logger.deprecate 'Selenium::WebDriver::Safari#driver_path',
66
- 'Selenium::WebDriver::Safari::Service#driver_path',
67
- id: :driver_path
68
- Selenium::WebDriver::Safari::Service.driver_path
69
- end
70
56
  end
71
57
  end # Safari
72
58
  end # WebDriver
@@ -44,8 +44,8 @@ module Selenium
44
44
 
45
45
  FileUtils.mkdir_p(@output_dir)
46
46
 
47
- browser_protocol[:domains].each(&method(:process_domain))
48
- js_protocol[:domains].each(&method(:process_domain))
47
+ browser_protocol[:domains].each { |domain| process_domain(domain) }
48
+ js_protocol[:domains].each { |domain| process_domain(domain) }
49
49
  require_file
50
50
  end
51
51
 
@@ -79,7 +79,7 @@ module Selenium
79
79
  end
80
80
 
81
81
  def remove_empty_lines(string)
82
- string.split("\n").reject { |l| l =~ /^\s+$/ }.join("\n")
82
+ string.split("\n").grep_v(/^\s+$/).join("\n")
83
83
  end
84
84
 
85
85
  def require_file
@@ -88,7 +88,7 @@ module Selenium
88
88
  # rubocop:enable Lint/InterpolationCheck
89
89
 
90
90
  require_all = "Dir.glob(\"#{dynamic_location}/#{@version}/*\", &method(:require))"
91
- File.open(@loader_path, 'w') { |file| file.write(require_all) }
91
+ File.write(@loader_path, require_all)
92
92
  end
93
93
  end
94
94
  end
@@ -83,12 +83,12 @@ module Selenium
83
83
  g = r
84
84
  b = r
85
85
  else
86
- luminocity2 = l < 0.5 ? l * (1 + s) : l + s - l * s
87
- luminocity1 = 2 * l - luminocity2
86
+ luminocity2 = l < 0.5 ? l * (1 + s) : l + s - (l * s)
87
+ luminocity1 = (2 * l) - luminocity2
88
88
 
89
- r = hue_to_rgb(luminocity1, luminocity2, h + 1.0 / 3.0)
89
+ r = hue_to_rgb(luminocity1, luminocity2, h + (1.0 / 3.0))
90
90
  g = hue_to_rgb(luminocity1, luminocity2, h)
91
- b = hue_to_rgb(luminocity1, luminocity2, h - 1.0 / 3.0)
91
+ b = hue_to_rgb(luminocity1, luminocity2, h - (1.0 / 3.0))
92
92
  end
93
93
 
94
94
  new (r * 255).round, (g * 255).round, (b * 255).round, a
@@ -99,11 +99,11 @@ module Selenium
99
99
  hue -= 1 if hue > 1.0
100
100
 
101
101
  if hue < 1.0 / 6.0
102
- (lum1 + (lum2 - lum1) * 6.0 * hue)
102
+ (lum1 + ((lum2 - lum1) * 6.0 * hue))
103
103
  elsif hue < 1.0 / 2.0
104
104
  lum2
105
105
  elsif hue < 2.0 / 3.0
106
- lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
106
+ lum1 + ((lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0)
107
107
  else
108
108
  lum1
109
109
  end
@@ -125,7 +125,7 @@ module Selenium
125
125
  alias_method :eql?, :==
126
126
 
127
127
  def hash
128
- [red, green, blue, alpha].hash ^ self.class.hash
128
+ [red, green, blue, alpha, self.class].hash
129
129
  end
130
130
 
131
131
  def rgb
@@ -32,7 +32,7 @@ module Selenium
32
32
 
33
33
  def initialize(name, condition = nil, &blk)
34
34
  @name = name
35
- @execution = if block_given?
35
+ @execution = if blk
36
36
  proc(&blk)
37
37
  else
38
38
  proc { |guarded| guarded.include?(condition) }
@@ -48,7 +48,7 @@ module Selenium
48
48
  def disposition
49
49
  if !skipping_guard.nil?
50
50
  [:skip, skipping_guard.message]
51
- elsif !pending_guard.nil? && ENV['SKIP_PENDING']
51
+ elsif !pending_guard.nil? && ENV.fetch('SKIP_PENDING', nil)
52
52
  [:skip, pending_guard.message]
53
53
  elsif !pending_guard.nil?
54
54
  [:pending, pending_guard.message]
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.1.0'
22
+ VERSION = '4.3.0'
23
23
  end # WebDriver
24
24
  end # Selenium
@@ -36,6 +36,7 @@ module Selenium
36
36
  Rectangle = Struct.new(:x, :y, :width, :height)
37
37
  Location = Struct.new(:latitude, :longitude, :altitude)
38
38
 
39
+ autoload :BiDi, 'selenium/webdriver/bidi'
39
40
  autoload :Chrome, 'selenium/webdriver/chrome'
40
41
  autoload :DevTools, 'selenium/webdriver/devtools'
41
42
  autoload :Edge, 'selenium/webdriver/edge'
@@ -24,11 +24,12 @@ Gem::Specification.new do |s|
24
24
  s.homepage = 'https://selenium.dev'
25
25
  s.metadata = {
26
26
  'changelog_uri' => 'https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES',
27
- 'source_code_uri' => 'https://github.com/SeleniumHQ/selenium/tree/trunk/rb'
27
+ 'source_code_uri' => 'https://github.com/SeleniumHQ/selenium/tree/trunk/rb',
28
+ 'rubygems_mfa_required' => 'true'
28
29
  }
29
30
 
30
31
  s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
31
- s.required_ruby_version = Gem::Requirement.new('>= 2.6')
32
+ s.required_ruby_version = Gem::Requirement.new('>= 2.7')
32
33
 
33
34
  s.files = [
34
35
  'CHANGES',
@@ -46,7 +47,8 @@ Gem::Specification.new do |s|
46
47
 
47
48
  s.add_runtime_dependency 'childprocess', ['>= 0.5', '< 5.0']
48
49
  s.add_runtime_dependency 'rexml', ['~> 3.2', '>= 3.2.5']
49
- s.add_runtime_dependency 'rubyzip', ['>= 1.2.2']
50
+ s.add_runtime_dependency 'rubyzip', ['>= 1.2.2', '< 3.0']
51
+ s.add_runtime_dependency 'websocket', ['~> 1.0']
50
52
 
51
53
  # childprocess requires ffi on windows but doesn't declare it in its dependencies
52
54
  s.add_development_dependency 'ffi'
@@ -54,8 +56,9 @@ Gem::Specification.new do |s|
54
56
  s.add_development_dependency 'rack', ['~> 2.0']
55
57
  s.add_development_dependency 'rake'
56
58
  s.add_development_dependency 'rspec', ['~> 3.0']
57
- s.add_development_dependency 'rubocop', ['~> 1.8.0']
59
+ s.add_development_dependency 'rubocop', ['~> 1.22']
58
60
  s.add_development_dependency 'rubocop-performance'
61
+ s.add_development_dependency 'rubocop-rake'
59
62
  s.add_development_dependency 'rubocop-rspec'
60
63
  s.add_development_dependency 'webmock', ['~> 3.5']
61
64
  s.add_development_dependency 'webrick', ['~> 1.7']
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rodionov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-11-22 00:00:00.000000000 Z
13
+ date: 2022-06-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: childprocess
@@ -59,6 +59,9 @@ dependencies:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.2.2
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '3.0'
62
65
  type: :runtime
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -66,6 +69,23 @@ dependencies:
66
69
  - - ">="
67
70
  - !ruby/object:Gem::Version
68
71
  version: 1.2.2
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: websocket
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.0'
69
89
  - !ruby/object:Gem::Dependency
70
90
  name: ffi
71
91
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +162,14 @@ dependencies:
142
162
  requirements:
143
163
  - - "~>"
144
164
  - !ruby/object:Gem::Version
145
- version: 1.8.0
165
+ version: '1.22'
146
166
  type: :development
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
149
169
  requirements:
150
170
  - - "~>"
151
171
  - !ruby/object:Gem::Version
152
- version: 1.8.0
172
+ version: '1.22'
153
173
  - !ruby/object:Gem::Dependency
154
174
  name: rubocop-performance
155
175
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +184,20 @@ dependencies:
164
184
  - - ">="
165
185
  - !ruby/object:Gem::Version
166
186
  version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rubocop-rake
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
167
201
  - !ruby/object:Gem::Dependency
168
202
  name: rubocop-rspec
169
203
  requirement: !ruby/object:Gem::Requirement
@@ -245,6 +279,8 @@ files:
245
279
  - lib/selenium/webdriver/atoms/getAttribute.js
246
280
  - lib/selenium/webdriver/atoms/isDisplayed.js
247
281
  - lib/selenium/webdriver/atoms/mutationListener.js
282
+ - lib/selenium/webdriver/bidi.rb
283
+ - lib/selenium/webdriver/bidi/session.rb
248
284
  - lib/selenium/webdriver/chrome.rb
249
285
  - lib/selenium/webdriver/chrome/driver.rb
250
286
  - lib/selenium/webdriver/chrome/features.rb
@@ -260,6 +296,7 @@ files:
260
296
  - lib/selenium/webdriver/common/driver_extensions/has_addons.rb
261
297
  - lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb
262
298
  - lib/selenium/webdriver/common/driver_extensions/has_authentication.rb
299
+ - lib/selenium/webdriver/common/driver_extensions/has_bidi.rb
263
300
  - lib/selenium/webdriver/common/driver_extensions/has_casting.rb
264
301
  - lib/selenium/webdriver/common/driver_extensions/has_cdp.rb
265
302
  - lib/selenium/webdriver/common/driver_extensions/has_context.rb
@@ -274,7 +311,6 @@ files:
274
311
  - lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb
275
312
  - lib/selenium/webdriver/common/driver_extensions/has_permissions.rb
276
313
  - lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb
277
- - lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb
278
314
  - lib/selenium/webdriver/common/driver_extensions/has_session_id.rb
279
315
  - lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb
280
316
  - lib/selenium/webdriver/common/driver_extensions/prints_page.rb
@@ -291,8 +327,18 @@ files:
291
327
  - lib/selenium/webdriver/common/interactions/key_actions.rb
292
328
  - lib/selenium/webdriver/common/interactions/key_input.rb
293
329
  - lib/selenium/webdriver/common/interactions/none_input.rb
330
+ - lib/selenium/webdriver/common/interactions/pause.rb
294
331
  - lib/selenium/webdriver/common/interactions/pointer_actions.rb
332
+ - lib/selenium/webdriver/common/interactions/pointer_cancel.rb
333
+ - lib/selenium/webdriver/common/interactions/pointer_event_properties.rb
295
334
  - lib/selenium/webdriver/common/interactions/pointer_input.rb
335
+ - lib/selenium/webdriver/common/interactions/pointer_move.rb
336
+ - lib/selenium/webdriver/common/interactions/pointer_press.rb
337
+ - lib/selenium/webdriver/common/interactions/scroll.rb
338
+ - lib/selenium/webdriver/common/interactions/scroll_origin.rb
339
+ - lib/selenium/webdriver/common/interactions/typing_interaction.rb
340
+ - lib/selenium/webdriver/common/interactions/wheel_actions.rb
341
+ - lib/selenium/webdriver/common/interactions/wheel_input.rb
296
342
  - lib/selenium/webdriver/common/keys.rb
297
343
  - lib/selenium/webdriver/common/log_entry.rb
298
344
  - lib/selenium/webdriver/common/logger.rb
@@ -314,6 +360,7 @@ files:
314
360
  - lib/selenium/webdriver/common/target_locator.rb
315
361
  - lib/selenium/webdriver/common/timeouts.rb
316
362
  - lib/selenium/webdriver/common/wait.rb
363
+ - lib/selenium/webdriver/common/websocket_connection.rb
317
364
  - lib/selenium/webdriver/common/window.rb
318
365
  - lib/selenium/webdriver/common/zipper.rb
319
366
  - lib/selenium/webdriver/devtools.rb
@@ -337,6 +384,7 @@ files:
337
384
  - lib/selenium/webdriver/firefox/profile.rb
338
385
  - lib/selenium/webdriver/firefox/profiles_ini.rb
339
386
  - lib/selenium/webdriver/firefox/service.rb
387
+ - lib/selenium/webdriver/firefox/util.rb
340
388
  - lib/selenium/webdriver/ie.rb
341
389
  - lib/selenium/webdriver/ie/driver.rb
342
390
  - lib/selenium/webdriver/ie/options.rb
@@ -349,7 +397,6 @@ files:
349
397
  - lib/selenium/webdriver/remote/http/common.rb
350
398
  - lib/selenium/webdriver/remote/http/curb.rb
351
399
  - lib/selenium/webdriver/remote/http/default.rb
352
- - lib/selenium/webdriver/remote/http/persistent.rb
353
400
  - lib/selenium/webdriver/remote/response.rb
354
401
  - lib/selenium/webdriver/remote/server_error.rb
355
402
  - lib/selenium/webdriver/safari.rb
@@ -378,6 +425,7 @@ licenses:
378
425
  metadata:
379
426
  changelog_uri: https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES
380
427
  source_code_uri: https://github.com/SeleniumHQ/selenium/tree/trunk/rb
428
+ rubygems_mfa_required: 'true'
381
429
  post_install_message:
382
430
  rdoc_options: []
383
431
  require_paths:
@@ -386,14 +434,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
386
434
  requirements:
387
435
  - - ">="
388
436
  - !ruby/object:Gem::Version
389
- version: '2.6'
437
+ version: '2.7'
390
438
  required_rubygems_version: !ruby/object:Gem::Requirement
391
439
  requirements:
392
440
  - - ">"
393
441
  - !ruby/object:Gem::Version
394
442
  version: 1.3.1
395
443
  requirements: []
396
- rubygems_version: 3.0.3
444
+ rubygems_version: 3.0.3.1
397
445
  signing_key:
398
446
  specification_version: 4
399
447
  summary: Selenium is a browser automation tool for automated testing of webapps and
@@ -1,65 +0,0 @@
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
- require 'net/http/persistent'
21
-
22
- module Selenium
23
- module WebDriver
24
- module Remote
25
- module Http
26
- # @api private
27
- class Persistent < Default
28
- def initialize(open_timeout: nil, read_timeout: nil)
29
- WebDriver.logger.deprecate("Selenium::WebDriver::Remote::Http::Persistent",
30
- id: :http_persistent) { "The default HTTP client now uses persistence." }
31
- super
32
- end
33
-
34
- def close
35
- @http&.shutdown
36
- end
37
-
38
- private
39
-
40
- def start(*)
41
- # no need to explicitly start connection
42
- end
43
-
44
- def new_http_client
45
- proxy = nil
46
-
47
- if @proxy
48
- unless @proxy.respond_to?(:http)
49
- url = @proxy.http
50
- raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}" unless url
51
- end
52
- proxy = URI.parse(url)
53
- end
54
-
55
- Net::HTTP::Persistent.new name: 'webdriver', proxy: proxy
56
- end
57
-
58
- def response_for(request)
59
- http.request server_url, request
60
- end
61
- end # Persistent
62
- end # Http
63
- end # Remote
64
- end # WebDriver
65
- end # Selenium