selenium-webdriver 4.23.0 → 4.31.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +81 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE +1 -1
  5. data/NOTICE +1 -1
  6. data/README.md +1 -1
  7. data/bin/linux/selenium-manager +0 -0
  8. data/bin/macos/selenium-manager +0 -0
  9. data/bin/windows/selenium-manager.exe +0 -0
  10. data/lib/selenium/server.rb +1 -1
  11. data/lib/selenium/webdriver/atoms/findElements.js +50 -118
  12. data/lib/selenium/webdriver/atoms/getAttribute.js +3 -3
  13. data/lib/selenium/webdriver/atoms/isDisplayed.js +2 -2
  14. data/lib/selenium/webdriver/bidi/browsing_context.rb +73 -46
  15. data/lib/selenium/webdriver/bidi/log_handler.rb +4 -2
  16. data/lib/selenium/webdriver/{common/driver_extensions/has_web_storage.rb → bidi/network/cookies.rb} +12 -12
  17. data/lib/selenium/webdriver/{common/html5/shared_web_storage.rb → bidi/network/credentials.rb} +15 -25
  18. data/lib/selenium/webdriver/bidi/network/headers.rb +38 -0
  19. data/lib/selenium/webdriver/bidi/{browsing_context_info.rb → network/intercepted_auth.rb} +11 -8
  20. data/lib/selenium/webdriver/bidi/{navigate_result.rb → network/intercepted_item.rb} +10 -6
  21. data/lib/selenium/webdriver/{common/html5/session_storage.rb → bidi/network/intercepted_request.rb} +34 -26
  22. data/lib/selenium/webdriver/bidi/network/intercepted_response.rb +81 -0
  23. data/lib/selenium/webdriver/bidi/network/url_pattern.rb +65 -0
  24. data/lib/selenium/webdriver/bidi/network.rb +139 -0
  25. data/lib/selenium/webdriver/bidi/struct.rb +2 -4
  26. data/lib/selenium/webdriver/bidi.rb +5 -0
  27. data/lib/selenium/webdriver/chrome/service.rb +1 -0
  28. data/lib/selenium/webdriver/chromium/driver.rb +0 -1
  29. data/lib/selenium/webdriver/common/child_process.rb +20 -14
  30. data/lib/selenium/webdriver/common/driver.rb +12 -10
  31. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +4 -3
  32. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +7 -0
  33. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +7 -0
  34. data/lib/selenium/webdriver/common/error.rb +3 -1
  35. data/lib/selenium/webdriver/common/fedcm/account.rb +4 -5
  36. data/lib/selenium/webdriver/common/logger.rb +3 -3
  37. data/lib/selenium/webdriver/common/manager.rb +1 -1
  38. data/lib/selenium/webdriver/common/network.rb +102 -0
  39. data/lib/selenium/webdriver/common/service.rb +11 -4
  40. data/lib/selenium/webdriver/common/service_manager.rb +1 -0
  41. data/lib/selenium/webdriver/common/takes_screenshot.rb +1 -0
  42. data/lib/selenium/webdriver/common/target_locator.rb +3 -2
  43. data/lib/selenium/webdriver/common/wait.rb +1 -1
  44. data/lib/selenium/webdriver/common.rb +1 -4
  45. data/lib/selenium/webdriver/devtools.rb +7 -5
  46. data/lib/selenium/webdriver/edge/service.rb +1 -1
  47. data/lib/selenium/webdriver/firefox/driver.rb +0 -19
  48. data/lib/selenium/webdriver/firefox/service.rb +1 -0
  49. data/lib/selenium/webdriver/ie/driver.rb +1 -1
  50. data/lib/selenium/webdriver/ie/service.rb +1 -0
  51. data/lib/selenium/webdriver/remote/bidi_bridge.rb +22 -0
  52. data/lib/selenium/webdriver/remote/bridge.rb +3 -53
  53. data/lib/selenium/webdriver/remote/http/common.rb +2 -0
  54. data/lib/selenium/webdriver/remote/http/curb.rb +11 -5
  55. data/lib/selenium/webdriver/remote/response.rb +18 -0
  56. data/lib/selenium/webdriver/remote.rb +1 -1
  57. data/lib/selenium/webdriver/safari/driver.rb +1 -2
  58. data/lib/selenium/webdriver/safari/service.rb +1 -1
  59. data/lib/selenium/webdriver/support/guards.rb +2 -2
  60. data/lib/selenium/webdriver/version.rb +1 -1
  61. data/selenium-webdriver.gemspec +4 -2
  62. metadata +16 -10
  63. data/lib/selenium/webdriver/common/html5/local_storage.rb +0 -59
@@ -30,10 +30,8 @@ module Selenium
30
30
  DriverExtensions::FullPageScreenshot,
31
31
  DriverExtensions::HasContext,
32
32
  DriverExtensions::HasBiDi,
33
- DriverExtensions::HasDevTools,
34
33
  DriverExtensions::HasLogEvents,
35
34
  DriverExtensions::HasNetworkInterception,
36
- DriverExtensions::HasWebStorage,
37
35
  DriverExtensions::PrintsPage].freeze
38
36
 
39
37
  include LocalDriver
@@ -46,23 +44,6 @@ module Selenium
46
44
  def browser
47
45
  :firefox
48
46
  end
49
-
50
- private
51
-
52
- def devtools_url
53
- if capabilities['moz:debuggerAddress'].nil?
54
- raise(Error::WebDriverError, 'DevTools is not supported by this version of Firefox; use v85 or higher')
55
- end
56
-
57
- uri = URI("http://#{capabilities['moz:debuggerAddress']}")
58
- response = Net::HTTP.get(uri.hostname, '/json/version', uri.port)
59
-
60
- JSON.parse(response)['webSocketDebuggerUrl']
61
- end
62
-
63
- def devtools_version
64
- Firefox::DEVTOOLS_VERSION
65
- end
66
47
  end # Driver
67
48
  end # Firefox
68
49
  end # WebDriver
@@ -24,6 +24,7 @@ module Selenium
24
24
  DEFAULT_PORT = 4444
25
25
  EXECUTABLE = 'geckodriver'
26
26
  SHUTDOWN_SUPPORTED = false
27
+ DRIVER_PATH_ENV_KEY = 'SE_GECKODRIVER'
27
28
  end # Service
28
29
  end # Firefox
29
30
  end # WebDriver
@@ -27,7 +27,7 @@ module Selenium
27
27
  #
28
28
 
29
29
  class Driver < WebDriver::Driver
30
- EXTENSIONS = [DriverExtensions::HasWebStorage].freeze
30
+ EXTENSIONS = [].freeze
31
31
 
32
32
  include LocalDriver
33
33
 
@@ -24,6 +24,7 @@ module Selenium
24
24
  DEFAULT_PORT = 5555
25
25
  EXECUTABLE = 'IEDriverServer'
26
26
  SHUTDOWN_SUPPORTED = true
27
+ DRIVER_PATH_ENV_KEY = 'SE_IEDRIVER'
27
28
  end # Server
28
29
  end # IE
29
30
  end # WebDriver
@@ -29,6 +29,22 @@ module Selenium
29
29
  @bidi = Selenium::WebDriver::BiDi.new(url: socket_url)
30
30
  end
31
31
 
32
+ def get(url)
33
+ browsing_context.navigate(url)
34
+ end
35
+
36
+ def go_back
37
+ browsing_context.traverse_history(-1)
38
+ end
39
+
40
+ def go_forward
41
+ browsing_context.traverse_history(1)
42
+ end
43
+
44
+ def refresh
45
+ browsing_context.reload
46
+ end
47
+
32
48
  def quit
33
49
  super
34
50
  ensure
@@ -38,6 +54,12 @@ module Selenium
38
54
  def close
39
55
  execute(:close_window).tap { |handles| bidi.close if handles.empty? }
40
56
  end
57
+
58
+ private
59
+
60
+ def browsing_context
61
+ @browsing_context ||= WebDriver::BiDi::BrowsingContext.new(self)
62
+ end
41
63
  end # BiDiBridge
42
64
  end # Remote
43
65
  end # WebDriver
@@ -296,58 +296,6 @@ module Selenium
296
296
  execute :take_element_screenshot, id: element
297
297
  end
298
298
 
299
- #
300
- # HTML 5
301
- #
302
-
303
- def local_storage_item(key, value = nil)
304
- if value
305
- execute_script("localStorage.setItem('#{key}', '#{value}')")
306
- else
307
- execute_script("return localStorage.getItem('#{key}')")
308
- end
309
- end
310
-
311
- def remove_local_storage_item(key)
312
- execute_script("localStorage.removeItem('#{key}')")
313
- end
314
-
315
- def local_storage_keys
316
- execute_script('return Object.keys(localStorage)')
317
- end
318
-
319
- def clear_local_storage
320
- execute_script('localStorage.clear()')
321
- end
322
-
323
- def local_storage_size
324
- execute_script('return localStorage.length')
325
- end
326
-
327
- def session_storage_item(key, value = nil)
328
- if value
329
- execute_script("sessionStorage.setItem('#{key}', '#{value}')")
330
- else
331
- execute_script("return sessionStorage.getItem('#{key}')")
332
- end
333
- end
334
-
335
- def remove_session_storage_item(key)
336
- execute_script("sessionStorage.removeItem('#{key}')")
337
- end
338
-
339
- def session_storage_keys
340
- execute_script('return Object.keys(sessionStorage)')
341
- end
342
-
343
- def clear_session_storage
344
- execute_script('sessionStorage.clear()')
345
- end
346
-
347
- def session_storage_size
348
- execute_script('return sessionStorage.length')
349
- end
350
-
351
299
  #
352
300
  # javascript execution
353
301
  #
@@ -375,6 +323,8 @@ module Selenium
375
323
  end
376
324
 
377
325
  def delete_cookie(name)
326
+ raise ArgumentError, 'Cookie name cannot be null or empty' if name.nil? || name.to_s.strip.empty?
327
+
378
328
  execute :delete_cookie, name: name
379
329
  end
380
330
 
@@ -676,7 +626,7 @@ module Selenium
676
626
  end
677
627
 
678
628
  def escaper
679
- @escaper ||= defined?(URI::Parser) ? URI::DEFAULT_PARSER : URI
629
+ @escaper ||= defined?(URI::RFC2396_PARSER) ? URI::RFC2396_PARSER : URI::DEFAULT_PARSER
680
630
  end
681
631
 
682
632
  def commands(command)
@@ -48,6 +48,7 @@ module Selenium
48
48
  # hook for subclasses - will be called on Driver#quit
49
49
  end
50
50
 
51
+ # steep:ignore:start
51
52
  def call(verb, url, command_hash)
52
53
  url = server_url.merge(url) unless url.is_a?(URI)
53
54
  headers = common_headers.dup
@@ -66,6 +67,7 @@ module Selenium
66
67
 
67
68
  request verb, url, headers, payload
68
69
  end
70
+ # steep:ignore:end
69
71
 
70
72
  private
71
73
 
@@ -37,6 +37,13 @@ module Selenium
37
37
  #
38
38
 
39
39
  class Curb < Common
40
+ attr_accessor :timeout
41
+
42
+ def initialize(timeout: nil)
43
+ @timeout = timeout
44
+ super()
45
+ end
46
+
40
47
  def quit_errors
41
48
  [Curl::Err::RecvError] + super
42
49
  end
@@ -53,7 +60,7 @@ module Selenium
53
60
  client.headers = headers
54
61
 
55
62
  # http://github.com/taf2/curb/issues/issue/33
56
- client.head = false
63
+ client.head = false
57
64
  client.delete = false
58
65
 
59
66
  case verb
@@ -80,11 +87,10 @@ module Selenium
80
87
  @client ||= begin
81
88
  c = Curl::Easy.new
82
89
 
83
- c.max_redirects = MAX_REDIRECTS
90
+ c.max_redirects = MAX_REDIRECTS
84
91
  c.follow_location = true
85
- c.timeout = @timeout if @timeout
86
- c.verbose = WebDriver.logger.debug?
87
-
92
+ c.timeout = timeout if timeout
93
+ c.verbose = WebDriver.logger.debug?
88
94
  c
89
95
  end
90
96
  end
@@ -58,12 +58,30 @@ module Selenium
58
58
 
59
59
  def add_cause(ex, error, backtrace)
60
60
  cause = Error::WebDriverError.new
61
+ backtrace = backtrace_from_remote(backtrace) if backtrace.is_a?(Array)
61
62
  cause.set_backtrace(backtrace)
62
63
  raise ex, cause: cause
63
64
  rescue Error.for_error(error)
64
65
  ex
65
66
  end
66
67
 
68
+ def backtrace_from_remote(server_trace)
69
+ server_trace.filter_map do |frame|
70
+ next unless frame.is_a?(Hash)
71
+
72
+ file = frame['fileName']
73
+ line = frame['lineNumber']
74
+ method = frame['methodName']
75
+
76
+ class_name = frame['className']
77
+ file = "#{class_name}(#{file})" if class_name
78
+
79
+ method = 'unknown' if method.nil? || method.empty?
80
+
81
+ "[remote server] #{file}:#{line}:in `#{method}'"
82
+ end
83
+ end
84
+
67
85
  def process_error
68
86
  return unless self['value'].is_a?(Hash)
69
87
 
@@ -31,7 +31,7 @@ module Selenium
31
31
  autoload :Capabilities, 'selenium/webdriver/remote/capabilities'
32
32
 
33
33
  module Http
34
- autoload :Common, 'selenium/webdriver/remote/http/common'
34
+ autoload :Common, 'selenium/webdriver/remote/http/common'
35
35
  autoload :Default, 'selenium/webdriver/remote/http/default'
36
36
  end
37
37
  end
@@ -27,8 +27,7 @@ module Selenium
27
27
 
28
28
  class Driver < WebDriver::Driver
29
29
  EXTENSIONS = [DriverExtensions::HasDebugger,
30
- DriverExtensions::HasApplePermissions,
31
- DriverExtensions::HasWebStorage].freeze
30
+ DriverExtensions::HasApplePermissions].freeze
32
31
 
33
32
  include LocalDriver
34
33
 
@@ -24,7 +24,7 @@ module Selenium
24
24
  DEFAULT_PORT = 7050
25
25
  EXECUTABLE = 'safaridriver'
26
26
  SHUTDOWN_SUPPORTED = false
27
-
27
+ DRIVER_PATH_ENV_KEY = 'SE_SAFARIDRIVER'
28
28
  def initialize(path: nil, port: nil, log: nil, args: nil)
29
29
  raise Error::WebDriverError, 'Safari Service does not support setting log output' if log
30
30
 
@@ -37,8 +37,8 @@ module Selenium
37
37
  @messages = {}
38
38
  end
39
39
 
40
- def add_condition(name, condition = nil, &blk)
41
- @guard_conditions << GuardCondition.new(name, condition, &blk)
40
+ def add_condition(name, condition = nil, &block)
41
+ @guard_conditions << GuardCondition.new(name, condition, &block)
42
42
  end
43
43
 
44
44
  def add_message(name, message)
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.23.0'
22
+ VERSION = '4.31.0'
23
23
  end # WebDriver
24
24
  end # Selenium
@@ -22,13 +22,15 @@ Gem::Specification.new do |s|
22
22
  s.homepage = 'https://selenium.dev'
23
23
  s.metadata = {
24
24
  'changelog_uri' => 'https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES',
25
+ 'documentation_uri' => 'https://www.selenium.dev/documentation/?tab=ruby',
25
26
  'github_repo' => 'ssh://github.com/SeleniumHQ/selenium',
26
27
  'source_code_uri' => 'https://github.com/SeleniumHQ/selenium/tree/trunk/rb',
27
- 'rubygems_mfa_required' => 'true'
28
+ 'rubygems_mfa_required' => 'true',
29
+ 'funding_uri' => 'https://github.com/sponsors/SeleniumHQ'
28
30
  }
29
31
 
30
32
  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('>= 3.0')
33
+ s.required_ruby_version = Gem::Requirement.new('>= 3.1')
32
34
 
33
35
  s.files = [
34
36
  'CHANGES',
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.23.0
4
+ version: 4.31.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: 2024-07-18 00:00:00.000000000 Z
13
+ date: 2025-04-05 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: base64
@@ -290,7 +290,6 @@ files:
290
290
  - lib/selenium/webdriver/atoms/mutationListener.js
291
291
  - lib/selenium/webdriver/bidi.rb
292
292
  - lib/selenium/webdriver/bidi/browsing_context.rb
293
- - lib/selenium/webdriver/bidi/browsing_context_info.rb
294
293
  - lib/selenium/webdriver/bidi/log/base_log_entry.rb
295
294
  - lib/selenium/webdriver/bidi/log/console_log_entry.rb
296
295
  - lib/selenium/webdriver/bidi/log/filter_by.rb
@@ -298,7 +297,15 @@ files:
298
297
  - lib/selenium/webdriver/bidi/log/javascript_log_entry.rb
299
298
  - lib/selenium/webdriver/bidi/log_handler.rb
300
299
  - lib/selenium/webdriver/bidi/log_inspector.rb
301
- - lib/selenium/webdriver/bidi/navigate_result.rb
300
+ - lib/selenium/webdriver/bidi/network.rb
301
+ - lib/selenium/webdriver/bidi/network/cookies.rb
302
+ - lib/selenium/webdriver/bidi/network/credentials.rb
303
+ - lib/selenium/webdriver/bidi/network/headers.rb
304
+ - lib/selenium/webdriver/bidi/network/intercepted_auth.rb
305
+ - lib/selenium/webdriver/bidi/network/intercepted_item.rb
306
+ - lib/selenium/webdriver/bidi/network/intercepted_request.rb
307
+ - lib/selenium/webdriver/bidi/network/intercepted_response.rb
308
+ - lib/selenium/webdriver/bidi/network/url_pattern.rb
302
309
  - lib/selenium/webdriver/bidi/session.rb
303
310
  - lib/selenium/webdriver/bidi/struct.rb
304
311
  - lib/selenium/webdriver/chrome.rb
@@ -338,7 +345,6 @@ files:
338
345
  - lib/selenium/webdriver/common/driver_extensions/has_permissions.rb
339
346
  - lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb
340
347
  - lib/selenium/webdriver/common/driver_extensions/has_session_id.rb
341
- - lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb
342
348
  - lib/selenium/webdriver/common/driver_extensions/prints_page.rb
343
349
  - lib/selenium/webdriver/common/driver_extensions/uploads_files.rb
344
350
  - lib/selenium/webdriver/common/driver_finder.rb
@@ -348,9 +354,6 @@ files:
348
354
  - lib/selenium/webdriver/common/fedcm/account.rb
349
355
  - lib/selenium/webdriver/common/fedcm/dialog.rb
350
356
  - lib/selenium/webdriver/common/file_reaper.rb
351
- - lib/selenium/webdriver/common/html5/local_storage.rb
352
- - lib/selenium/webdriver/common/html5/session_storage.rb
353
- - lib/selenium/webdriver/common/html5/shared_web_storage.rb
354
357
  - lib/selenium/webdriver/common/interactions/input_device.rb
355
358
  - lib/selenium/webdriver/common/interactions/interaction.rb
356
359
  - lib/selenium/webdriver/common/interactions/interactions.rb
@@ -376,6 +379,7 @@ files:
376
379
  - lib/selenium/webdriver/common/logs.rb
377
380
  - lib/selenium/webdriver/common/manager.rb
378
381
  - lib/selenium/webdriver/common/navigation.rb
382
+ - lib/selenium/webdriver/common/network.rb
379
383
  - lib/selenium/webdriver/common/options.rb
380
384
  - lib/selenium/webdriver/common/platform.rb
381
385
  - lib/selenium/webdriver/common/port_prober.rb
@@ -463,9 +467,11 @@ licenses:
463
467
  - Apache-2.0
464
468
  metadata:
465
469
  changelog_uri: https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES
470
+ documentation_uri: https://www.selenium.dev/documentation/?tab=ruby
466
471
  github_repo: ssh://github.com/SeleniumHQ/selenium
467
472
  source_code_uri: https://github.com/SeleniumHQ/selenium/tree/trunk/rb
468
473
  rubygems_mfa_required: 'true'
474
+ funding_uri: https://github.com/sponsors/SeleniumHQ
469
475
  post_install_message:
470
476
  rdoc_options: []
471
477
  require_paths:
@@ -474,14 +480,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
474
480
  requirements:
475
481
  - - ">="
476
482
  - !ruby/object:Gem::Version
477
- version: '3.0'
483
+ version: '3.1'
478
484
  required_rubygems_version: !ruby/object:Gem::Requirement
479
485
  requirements:
480
486
  - - ">"
481
487
  - !ruby/object:Gem::Version
482
488
  version: 1.3.1
483
489
  requirements: []
484
- rubygems_version: 3.2.33
490
+ rubygems_version: 3.3.27
485
491
  signing_key:
486
492
  specification_version: 4
487
493
  summary: Selenium is a browser automation tool for automated testing of webapps and
@@ -1,59 +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
- module Selenium
21
- module WebDriver
22
- module HTML5
23
- class LocalStorage
24
- include SharedWebStorage
25
-
26
- #
27
- # @api private
28
- #
29
- def initialize(bridge)
30
- @bridge = bridge
31
- end
32
-
33
- def [](key)
34
- @bridge.local_storage_item key
35
- end
36
-
37
- def []=(key, value)
38
- @bridge.local_storage_item key, value
39
- end
40
-
41
- def delete(key)
42
- @bridge.remove_local_storage_item key
43
- end
44
-
45
- def clear
46
- @bridge.clear_local_storage
47
- end
48
-
49
- def size
50
- @bridge.local_storage_size
51
- end
52
-
53
- def keys
54
- @bridge.local_storage_keys.reverse
55
- end
56
- end # LocalStorage
57
- end # HTML5
58
- end # WebDriver
59
- end # Selenium