selenium-webdriver 4.51.0 → 4.52.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +15 -0
  3. data/Gemfile +14 -0
  4. data/README.md +20 -0
  5. data/bin/linux-arm64/selenium-manager +0 -0
  6. data/bin/linux-x86_64/selenium-manager +0 -0
  7. data/bin/macos/selenium-manager +0 -0
  8. data/bin/selenium-manager-THIRD-PARTY-NOTICES.txt +543 -226
  9. data/bin/selenium-manager.cdx.json +804 -722
  10. data/bin/windows/selenium-manager.exe +0 -0
  11. data/lib/selenium/webdriver/atoms/findElements.js +960 -250
  12. data/lib/selenium/webdriver/atoms/getAttribute.js +153 -127
  13. data/lib/selenium/webdriver/atoms/isDisplayed.js +433 -364
  14. data/lib/selenium/webdriver/atoms.rb +4 -1
  15. data/lib/selenium/webdriver/bidi/protocol/bluetooth.rb +6 -6
  16. data/lib/selenium/webdriver/bidi/protocol/browser.rb +21 -9
  17. data/lib/selenium/webdriver/bidi/protocol/browsing_context.rb +109 -39
  18. data/lib/selenium/webdriver/bidi/protocol/emulation.rb +89 -44
  19. data/lib/selenium/webdriver/bidi/protocol/input.rb +95 -31
  20. data/lib/selenium/webdriver/bidi/protocol/log.rb +4 -4
  21. data/lib/selenium/webdriver/bidi/protocol/moz_debugging.rb +12 -10
  22. data/lib/selenium/webdriver/bidi/protocol/moz_profiler.rb +4 -4
  23. data/lib/selenium/webdriver/bidi/protocol/network.rb +82 -39
  24. data/lib/selenium/webdriver/bidi/protocol/script.rb +38 -24
  25. data/lib/selenium/webdriver/bidi/protocol/session.rb +61 -8
  26. data/lib/selenium/webdriver/bidi/protocol/storage.rb +3 -3
  27. data/lib/selenium/webdriver/bidi/protocol/user_agent_client_hints.rb +3 -3
  28. data/lib/selenium/webdriver/bidi/protocol/web_extension.rb +17 -9
  29. data/lib/selenium/webdriver/bidi/serialization/record.rb +66 -24
  30. data/lib/selenium/webdriver/bidi/serialization.rb +2 -2
  31. data/lib/selenium/webdriver/bidi/support/bidi_generate.rb +228 -150
  32. data/lib/selenium/webdriver/common/client_config.rb +4 -1
  33. data/lib/selenium/webdriver/common/driver_finder.rb +5 -2
  34. data/lib/selenium/webdriver/common/websocket_connection.rb +51 -13
  35. data/lib/selenium/webdriver/remote/http/default.rb +17 -1
  36. data/lib/selenium/webdriver/version.rb +1 -1
  37. data/selenium-webdriver.gemspec +0 -12
  38. metadata +6 -163
@@ -109,16 +109,21 @@ module Selenium
109
109
  data = JSON.generate(data)
110
110
  out_frame = WebSocket::Frame::Outgoing::Client.new(version: ws.version, data: data, type: 'text')
111
111
 
112
- begin
113
- socket.write(out_frame.to_s)
114
- rescue *CONNECTION_ERRORS => e
115
- raise e, "WebSocket is closed (#{e.class}: #{e.message})"
116
- end
112
+ @messages_mtx.synchronize { pending_responses[id] = ConditionVariable.new }
117
113
 
118
- wait.until do
119
- raise IOError, 'WebSocket connection closed while waiting for a response' if @closing
114
+ begin
115
+ begin
116
+ socket.write(out_frame.to_s)
117
+ rescue *CONNECTION_ERRORS => e
118
+ raise e, "WebSocket is closed (#{e.class}: #{e.message})"
119
+ end
120
120
 
121
- @messages_mtx.synchronize { messages.delete(id) }
121
+ await_response(id)
122
+ ensure
123
+ @messages_mtx.synchronize do
124
+ pending_responses.delete(id)
125
+ messages.delete(id)
126
+ end
122
127
  end
123
128
  end
124
129
 
@@ -128,6 +133,30 @@ module Selenium
128
133
  @messages ||= {}
129
134
  end
130
135
 
136
+ def pending_responses
137
+ @pending_responses ||= {}
138
+ end
139
+
140
+ def await_response(id)
141
+ deadline = Process.clock_gettime(Process::CLOCK_MONOTONIC) + RESPONSE_WAIT_TIMEOUT
142
+ @messages_mtx.synchronize do
143
+ until messages.key?(id)
144
+ raise IOError, 'WebSocket connection closed while waiting for a response' if @closing
145
+
146
+ remaining = deadline - Process.clock_gettime(Process::CLOCK_MONOTONIC)
147
+ raise Error::TimeoutError, "timed out after #{RESPONSE_WAIT_TIMEOUT} seconds" if remaining <= 0
148
+
149
+ pending_responses[id].wait(@messages_mtx, remaining)
150
+ end
151
+ messages.delete(id)
152
+ end
153
+ end
154
+
155
+ # Once the socket is closed no reply can arrive, so wake waiters instead of letting them run out the timeout
156
+ def release_pending_responses
157
+ @messages_mtx.synchronize { pending_responses.each_value(&:broadcast) }
158
+ end
159
+
131
160
  def process_handshake
132
161
  socket.print(ws.to_s)
133
162
  ws << socket.readpartial(1024) until ws.finished?
@@ -147,6 +176,9 @@ module Selenium
147
176
  end
148
177
  rescue *CONNECTION_ERRORS, WebSocket::Error => e
149
178
  WebDriver.logger.debug "WebSocket listener closed: #{e.class}: #{e.message}", id: :ws
179
+ ensure
180
+ # Nothing reads replies once the listener stops, however it stopped
181
+ close_socket
150
182
  end
151
183
  end
152
184
 
@@ -155,6 +187,8 @@ module Selenium
155
187
  socket.close
156
188
  rescue *CONNECTION_ERRORS => e
157
189
  WebDriver.logger.debug "WebSocket socket closed: #{e.class}: #{e.message}", id: :ws
190
+ ensure
191
+ release_pending_responses
158
192
  end
159
193
 
160
194
  def process_incoming_frames
@@ -198,7 +232,15 @@ module Selenium
198
232
  return {} if message.empty?
199
233
 
200
234
  msg = JSON.parse(message)
201
- @messages_mtx.synchronize { messages[msg['id']] = msg if msg.key?('id') }
235
+ if msg.key?('id')
236
+ @messages_mtx.synchronize do
237
+ # Replies to commands that already timed out are dropped so they don't accumulate
238
+ if (waiter = pending_responses[msg['id']])
239
+ messages[msg['id']] = msg
240
+ waiter.signal
241
+ end
242
+ end
243
+ end
202
244
 
203
245
  WebDriver.logger.debug('WebSocket <-', id: :ws) { msg.to_s[...MAX_LOG_MESSAGE_SIZE] }
204
246
  msg
@@ -221,10 +263,6 @@ module Selenium
221
263
  end
222
264
  end
223
265
 
224
- def wait
225
- @wait ||= Wait.new(timeout: RESPONSE_WAIT_TIMEOUT, interval: RESPONSE_WAIT_INTERVAL)
226
- end
227
-
228
266
  def socket
229
267
  @socket ||= if URI(@url).scheme == 'wss'
230
268
  socket = TCPSocket.new(ws.host, ws.port)
@@ -72,7 +72,11 @@ module Selenium
72
72
  http = new_http_client
73
73
  if server_url.scheme == 'https'
74
74
  http.use_ssl = true
75
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
75
+ http.verify_mode = if client_config.ignore_certificates
76
+ OpenSSL::SSL::VERIFY_NONE
77
+ else
78
+ OpenSSL::SSL::VERIFY_PEER
79
+ end
76
80
  end
77
81
 
78
82
  http.open_timeout = open_timeout if open_timeout
@@ -85,6 +89,18 @@ module Selenium
85
89
 
86
90
  def start(http)
87
91
  http.start
92
+ rescue OpenSSL::SSL::SSLError => e
93
+ failure = e.message.match(/certificate verify failed(?: \((.+?)\))?/)
94
+ raise unless failure
95
+
96
+ raise e.class, unverified_certificate_message(failure[1] || failure[0]), e.backtrace
97
+ end
98
+
99
+ def unverified_certificate_message(reason)
100
+ location = server_url.dup.tap { |url| url.user = nil }
101
+ "Cannot verify the certificate for #{location} (#{reason}). " \
102
+ 'Trust its issuer if it is self-signed or from a private CA, ' \
103
+ 'or skip verification with ignore_certificates: true on a ClientConfig passed to the driver constructor'
88
104
  end
89
105
 
90
106
  MAX_RETRIES = 3
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.51.0'
22
+ VERSION = '4.52.0'
23
23
  end # WebDriver
24
24
  end # Selenium
@@ -53,16 +53,4 @@ Gem::Specification.new do |s|
53
53
  s.add_dependency 'logger', ['~> 1.4']
54
54
  s.add_dependency 'rubyzip', ['>= 1.2.2', '< 4.0']
55
55
  s.add_dependency 'websocket', ['~> 1.0']
56
-
57
- s.add_development_dependency 'git', ['~> 1.19']
58
- s.add_development_dependency 'rack', ['~> 2.0']
59
- s.add_development_dependency 'rake', ['~> 13.0']
60
- s.add_development_dependency 'rspec', ['~> 3.0']
61
- s.add_development_dependency 'rubocop', ['~> 1.75']
62
- s.add_development_dependency 'rubocop-performance', ['~> 1.25']
63
- s.add_development_dependency 'rubocop-rake', ['~> 0.7']
64
- s.add_development_dependency 'rubocop-rspec', ['~> 3.5']
65
- s.add_development_dependency 'webmock', ['~> 3.5']
66
- s.add_development_dependency 'webrick', ['~> 1.7']
67
- s.add_development_dependency 'yard', ['~> 0.9.11', '>= 0.9.36']
68
56
  end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selenium-webdriver
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.51.0
4
+ version: 4.52.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Rodionov
8
8
  - Titus Fortner
9
9
  - Thomas Walpole
10
+ autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 1980-01-02 00:00:00.000000000 Z
13
+ date: 2026-10-29 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: base64
@@ -73,166 +74,6 @@ dependencies:
73
74
  - - "~>"
74
75
  - !ruby/object:Gem::Version
75
76
  version: '1.0'
76
- - !ruby/object:Gem::Dependency
77
- name: git
78
- requirement: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.19'
83
- type: :development
84
- prerelease: false
85
- version_requirements: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.19'
90
- - !ruby/object:Gem::Dependency
91
- name: rack
92
- requirement: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '2.0'
97
- type: :development
98
- prerelease: false
99
- version_requirements: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '2.0'
104
- - !ruby/object:Gem::Dependency
105
- name: rake
106
- requirement: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '13.0'
111
- type: :development
112
- prerelease: false
113
- version_requirements: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '13.0'
118
- - !ruby/object:Gem::Dependency
119
- name: rspec
120
- requirement: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '3.0'
125
- type: :development
126
- prerelease: false
127
- version_requirements: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - "~>"
130
- - !ruby/object:Gem::Version
131
- version: '3.0'
132
- - !ruby/object:Gem::Dependency
133
- name: rubocop
134
- requirement: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - "~>"
137
- - !ruby/object:Gem::Version
138
- version: '1.75'
139
- type: :development
140
- prerelease: false
141
- version_requirements: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - "~>"
144
- - !ruby/object:Gem::Version
145
- version: '1.75'
146
- - !ruby/object:Gem::Dependency
147
- name: rubocop-performance
148
- requirement: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - "~>"
151
- - !ruby/object:Gem::Version
152
- version: '1.25'
153
- type: :development
154
- prerelease: false
155
- version_requirements: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '1.25'
160
- - !ruby/object:Gem::Dependency
161
- name: rubocop-rake
162
- requirement: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '0.7'
167
- type: :development
168
- prerelease: false
169
- version_requirements: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - "~>"
172
- - !ruby/object:Gem::Version
173
- version: '0.7'
174
- - !ruby/object:Gem::Dependency
175
- name: rubocop-rspec
176
- requirement: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - "~>"
179
- - !ruby/object:Gem::Version
180
- version: '3.5'
181
- type: :development
182
- prerelease: false
183
- version_requirements: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - "~>"
186
- - !ruby/object:Gem::Version
187
- version: '3.5'
188
- - !ruby/object:Gem::Dependency
189
- name: webmock
190
- requirement: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - "~>"
193
- - !ruby/object:Gem::Version
194
- version: '3.5'
195
- type: :development
196
- prerelease: false
197
- version_requirements: !ruby/object:Gem::Requirement
198
- requirements:
199
- - - "~>"
200
- - !ruby/object:Gem::Version
201
- version: '3.5'
202
- - !ruby/object:Gem::Dependency
203
- name: webrick
204
- requirement: !ruby/object:Gem::Requirement
205
- requirements:
206
- - - "~>"
207
- - !ruby/object:Gem::Version
208
- version: '1.7'
209
- type: :development
210
- prerelease: false
211
- version_requirements: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - "~>"
214
- - !ruby/object:Gem::Version
215
- version: '1.7'
216
- - !ruby/object:Gem::Dependency
217
- name: yard
218
- requirement: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - "~>"
221
- - !ruby/object:Gem::Version
222
- version: 0.9.11
223
- - - ">="
224
- - !ruby/object:Gem::Version
225
- version: 0.9.36
226
- type: :development
227
- prerelease: false
228
- version_requirements: !ruby/object:Gem::Requirement
229
- requirements:
230
- - - "~>"
231
- - !ruby/object:Gem::Version
232
- version: 0.9.11
233
- - - ">="
234
- - !ruby/object:Gem::Version
235
- version: 0.9.36
236
77
  description: |2
237
78
  Selenium implements the W3C WebDriver protocol to automate popular browsers.
238
79
  It aims to mimic the behaviour of a real user as it interacts with the application's HTML.
@@ -472,6 +313,7 @@ metadata:
472
313
  source_code_uri: https://github.com/SeleniumHQ/selenium/tree/trunk/rb
473
314
  rubygems_mfa_required: 'true'
474
315
  funding_uri: https://github.com/sponsors/SeleniumHQ
316
+ post_install_message:
475
317
  rdoc_options: []
476
318
  require_paths:
477
319
  - lib
@@ -486,7 +328,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
486
328
  - !ruby/object:Gem::Version
487
329
  version: 1.3.1
488
330
  requirements: []
489
- rubygems_version: 4.0.3
331
+ rubygems_version: 3.5.22
332
+ signing_key:
490
333
  specification_version: 4
491
334
  summary: Selenium is a browser automation tool for automated testing of webapps and
492
335
  more