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.
- checksums.yaml +4 -4
- data/CHANGES +15 -0
- data/Gemfile +14 -0
- data/README.md +20 -0
- data/bin/linux-arm64/selenium-manager +0 -0
- data/bin/linux-x86_64/selenium-manager +0 -0
- data/bin/macos/selenium-manager +0 -0
- data/bin/selenium-manager-THIRD-PARTY-NOTICES.txt +543 -226
- data/bin/selenium-manager.cdx.json +804 -722
- data/bin/windows/selenium-manager.exe +0 -0
- data/lib/selenium/webdriver/atoms/findElements.js +960 -250
- data/lib/selenium/webdriver/atoms/getAttribute.js +153 -127
- data/lib/selenium/webdriver/atoms/isDisplayed.js +433 -364
- data/lib/selenium/webdriver/atoms.rb +4 -1
- data/lib/selenium/webdriver/bidi/protocol/bluetooth.rb +6 -6
- data/lib/selenium/webdriver/bidi/protocol/browser.rb +21 -9
- data/lib/selenium/webdriver/bidi/protocol/browsing_context.rb +109 -39
- data/lib/selenium/webdriver/bidi/protocol/emulation.rb +89 -44
- data/lib/selenium/webdriver/bidi/protocol/input.rb +95 -31
- data/lib/selenium/webdriver/bidi/protocol/log.rb +4 -4
- data/lib/selenium/webdriver/bidi/protocol/moz_debugging.rb +12 -10
- data/lib/selenium/webdriver/bidi/protocol/moz_profiler.rb +4 -4
- data/lib/selenium/webdriver/bidi/protocol/network.rb +82 -39
- data/lib/selenium/webdriver/bidi/protocol/script.rb +38 -24
- data/lib/selenium/webdriver/bidi/protocol/session.rb +61 -8
- data/lib/selenium/webdriver/bidi/protocol/storage.rb +3 -3
- data/lib/selenium/webdriver/bidi/protocol/user_agent_client_hints.rb +3 -3
- data/lib/selenium/webdriver/bidi/protocol/web_extension.rb +17 -9
- data/lib/selenium/webdriver/bidi/serialization/record.rb +66 -24
- data/lib/selenium/webdriver/bidi/serialization.rb +2 -2
- data/lib/selenium/webdriver/bidi/support/bidi_generate.rb +228 -150
- data/lib/selenium/webdriver/common/client_config.rb +4 -1
- data/lib/selenium/webdriver/common/driver_finder.rb +5 -2
- data/lib/selenium/webdriver/common/websocket_connection.rb +51 -13
- data/lib/selenium/webdriver/remote/http/default.rb +17 -1
- data/lib/selenium/webdriver/version.rb +1 -1
- data/selenium-webdriver.gemspec +0 -12
- 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
|
-
|
|
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
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
data/selenium-webdriver.gemspec
CHANGED
|
@@ -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.
|
|
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:
|
|
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:
|
|
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
|