selenium-webdriver 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +39 -0
- data/lib/selenium/server.rb +62 -48
- data/lib/selenium/webdriver/atoms/findElements.js +2 -2
- data/lib/selenium/webdriver/chrome/options.rb +1 -1
- data/lib/selenium/webdriver/common/options.rb +1 -3
- data/lib/selenium/webdriver/common/profile_helper.rb +1 -7
- data/lib/selenium/webdriver/common/zipper.rb +3 -9
- data/lib/selenium/webdriver/devtools.rb +12 -1
- data/lib/selenium/webdriver/firefox/options.rb +2 -2
- data/lib/selenium/webdriver/ie/options.rb +2 -2
- data/lib/selenium/webdriver/remote/bridge.rb +4 -1
- data/lib/selenium/webdriver/remote.rb +6 -5
- data/lib/selenium/webdriver/support/select.rb +1 -1
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 40e4bef1fdee7ae817c56466ec231be400d677d56a8c8f46b797c6b3eba28de9
|
4
|
+
data.tar.gz: a9c1af31f12db6096f06c2a89e487e40ea2bb53b8f6e46e5f77a3046f149bb34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5325d0fe9f5fdb721ed4a6daa1384d7876dc7a072dd52f46c73d76b1614434c123fff2b4a9d7de01538968eddfbad57f2e1a87f4dce0e560a850dcf21988840
|
7
|
+
data.tar.gz: 3b345ac66d051c32267d1c4ef9b2dd70aea36e2c4e5bb35ce30197d748effca8fed460824d1961ad5a39340358fc9be3f200708a38557e5e878b09be1b0d61c0
|
data/CHANGES
CHANGED
@@ -1,3 +1,42 @@
|
|
1
|
+
4.1.0 (2021-11-18)
|
2
|
+
=========================
|
3
|
+
|
4
|
+
DevTools:
|
5
|
+
* Released selenium-devtools 0.95.0 (supports CDP v85, v93, v94, v95)
|
6
|
+
* Released selenium-devtools 0.96.0 (supports CDP v85, v94, v95, v96)
|
7
|
+
* Added support for secure websockets (#10017)
|
8
|
+
|
9
|
+
Ruby:
|
10
|
+
* Execute Script supports ShadowRoots (#10019)
|
11
|
+
* Fixed bug preventing zipping temp files on Windows (#9987)
|
12
|
+
* Sang Pumpkin Carol (thanks Jari!)
|
13
|
+
|
14
|
+
4.0.3 (2021-10-20)
|
15
|
+
=========================
|
16
|
+
|
17
|
+
Firefox:
|
18
|
+
* Fixed bug avoiding camel casing prefs (#9944 thanks @glaszig)
|
19
|
+
|
20
|
+
Ruby:
|
21
|
+
* Fixed bug in Select class for finding by index (#9945)
|
22
|
+
|
23
|
+
Remote:
|
24
|
+
* Fixed bug preventing sending keys with an empty value
|
25
|
+
|
26
|
+
4.0.2 (2021-10-19)
|
27
|
+
=========================
|
28
|
+
|
29
|
+
Server:
|
30
|
+
* Fixed bug in new download code.
|
31
|
+
|
32
|
+
4.0.1 (2021-10-19)
|
33
|
+
=========================
|
34
|
+
|
35
|
+
Server:
|
36
|
+
* Fixed download by pointing to new storage location.
|
37
|
+
- Only supports Selenium 4 versions
|
38
|
+
* Added default value for Server::get and Server::download to use the latest server version
|
39
|
+
|
1
40
|
4.0.0 (2021-10-13)
|
2
41
|
=========================
|
3
42
|
|
data/lib/selenium/server.rb
CHANGED
@@ -57,45 +57,39 @@ module Selenium
|
|
57
57
|
|
58
58
|
CL_RESET = WebDriver::Platform.windows? ? '' : "\r\e[0K"
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
class << self
|
61
|
+
#
|
62
|
+
# Download the given version of the selenium-server jar and return instance
|
63
|
+
#
|
64
|
+
# @param [String, Symbol] required_version X.Y.Z defaults to ':latest'
|
65
|
+
# @param [Hash] opts
|
66
|
+
# @return [Selenium::Server]
|
67
|
+
#
|
63
68
|
|
64
|
-
|
65
|
-
|
66
|
-
|
69
|
+
def get(required_version = :latest, opts = {})
|
70
|
+
new(download(required_version), opts)
|
71
|
+
end
|
67
72
|
|
68
|
-
|
69
|
-
|
73
|
+
#
|
74
|
+
# Download the given version of the selenium-server jar and return location
|
75
|
+
#
|
76
|
+
# @param [String, Symbol] required_version X.Y.Z defaults to ':latest'
|
77
|
+
# @return [String] location of downloaded file
|
78
|
+
#
|
79
|
+
|
80
|
+
def download(required_version = :latest)
|
70
81
|
required_version = latest if required_version == :latest
|
71
|
-
download_file_name = "selenium-server
|
82
|
+
download_file_name = "selenium-server-#{required_version}.jar"
|
72
83
|
|
73
84
|
return download_file_name if File.exist? download_file_name
|
74
85
|
|
75
86
|
begin
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
total = response.content_length
|
80
|
-
progress = 0
|
81
|
-
segment_count = 0
|
82
|
-
|
83
|
-
response.read_body do |segment|
|
84
|
-
progress += segment.length
|
85
|
-
segment_count += 1
|
87
|
+
server = 'https://github.com/seleniumhq/selenium/releases/download'
|
88
|
+
released = Net::HTTP.get_response(URI.parse("#{server}/selenium-#{required_version}/#{download_file_name}"))
|
89
|
+
redirected = URI.parse released.header['location']
|
86
90
|
|
87
|
-
|
88
|
-
|
89
|
-
print "#{CL_RESET}Downloading #{download_file_name}: #{percent.to_i}% (#{progress} / #{total})"
|
90
|
-
segment_count = 0
|
91
|
-
end
|
92
|
-
|
93
|
-
destination.write(segment)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
raise Error, "#{resp.code} for #{download_file_name}" unless resp.is_a? Net::HTTPSuccess
|
98
|
-
end
|
91
|
+
File.open(download_file_name, 'wb') do |destination|
|
92
|
+
download_server(redirected, destination)
|
99
93
|
end
|
100
94
|
rescue StandardError
|
101
95
|
FileUtils.rm download_file_name if File.exist? download_file_name
|
@@ -106,30 +100,57 @@ module Selenium
|
|
106
100
|
end
|
107
101
|
|
108
102
|
#
|
109
|
-
# Ask
|
103
|
+
# Ask GitHub what the latest selenium-server version is.
|
110
104
|
#
|
111
105
|
|
112
106
|
def latest
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
107
|
+
@latest ||= begin
|
108
|
+
net_http_start('api.github.com') do |http|
|
109
|
+
json = http.get('/repos/seleniumhq/selenium/releases').body
|
110
|
+
all_assets = JSON.parse(json).map { |release| release['assets'] }.flatten
|
111
|
+
server_assets = all_assets.map { |asset| asset['name'][/selenium-server-(\d+\.\d+\.\d+)\.jar/, 1] }.compact
|
112
|
+
server_assets.map { |version| Gem::Version.new(version) }.max.version
|
117
113
|
end
|
118
|
-
|
119
|
-
versions.compact.map { |version| Gem::Version.new(version) }.max.version
|
120
114
|
end
|
121
115
|
end
|
122
116
|
|
117
|
+
# @api private
|
118
|
+
|
123
119
|
def net_http_start(address, &block)
|
124
120
|
http_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
125
|
-
|
126
121
|
if http_proxy
|
127
122
|
http_proxy = "http://#{http_proxy}" unless http_proxy.start_with?('http://')
|
128
123
|
uri = URI.parse(http_proxy)
|
129
124
|
|
130
125
|
Net::HTTP.start(address, nil, uri.host, uri.port, &block)
|
131
126
|
else
|
132
|
-
Net::HTTP.start(address, &block)
|
127
|
+
Net::HTTP.start(address, use_ssl: true, &block)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def download_server(uri, destination)
|
132
|
+
net_http_start('github-releases.githubusercontent.com') do |http|
|
133
|
+
request = Net::HTTP::Get.new uri
|
134
|
+
resp = http.request(request) do |response|
|
135
|
+
total = response.content_length
|
136
|
+
progress = 0
|
137
|
+
segment_count = 0
|
138
|
+
|
139
|
+
response.read_body do |segment|
|
140
|
+
progress += segment.length
|
141
|
+
segment_count += 1
|
142
|
+
|
143
|
+
if (segment_count % 15).zero?
|
144
|
+
percent = progress.fdiv(total) * 100
|
145
|
+
print "#{CL_RESET}Downloading #{destination.path}: #{percent.to_i}% (#{progress} / #{total})"
|
146
|
+
segment_count = 0
|
147
|
+
end
|
148
|
+
|
149
|
+
destination.write(segment)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
raise Error, "#{resp.code} for #{destination.path}" unless resp.is_a? Net::HTTPSuccess
|
133
154
|
end
|
134
155
|
end
|
135
156
|
end
|
@@ -200,10 +221,6 @@ module Selenium
|
|
200
221
|
|
201
222
|
private
|
202
223
|
|
203
|
-
def selenium4?
|
204
|
-
@jar.match?(/[^.]4\./) || @jar.include?('deploy')
|
205
|
-
end
|
206
|
-
|
207
224
|
def stop_process
|
208
225
|
return unless @process.alive?
|
209
226
|
|
@@ -222,10 +239,7 @@ module Selenium
|
|
222
239
|
@process ||= begin
|
223
240
|
# extract any additional_args that start with -D as options
|
224
241
|
properties = @additional_args.dup - @additional_args.delete_if { |arg| arg[/^-D/] }
|
225
|
-
args = ['-jar', @jar]
|
226
|
-
args << @role if selenium4?
|
227
|
-
args << (selenium4? ? '--port' : '-port')
|
228
|
-
args << @port.to_s
|
242
|
+
args = ['-jar', @jar, @role, '--port', @port.to_s]
|
229
243
|
server_command = ['java'] + properties + args + @additional_args
|
230
244
|
cp = ChildProcess.build(*server_command)
|
231
245
|
WebDriver.logger.debug("Executing Process #{server_command}")
|
@@ -108,8 +108,8 @@ function gd(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4
|
|
108
108
|
function hd(a){return a.replace(/^[^\S\xa0]+|[^\S\xa0]+$/g,"")}function id(a){var b=[];Yc?jd(a,b):kd(a,b);a=qa(b,hd);return hd(a.join("\n")).replace(/\xa0/g," ")}
|
109
109
|
function ld(a,b,c){if(S(a,"BR"))b.push("");else{var d=S(a,"TD"),e=V(a,"display"),f=!d&&!(0<=oa(md,e)),g=void 0!==a.previousElementSibling?a.previousElementSibling:gb(a.previousSibling);g=g?V(g,"display"):"";var h=V(a,"float")||V(a,"cssFloat")||V(a,"styleFloat");!f||"run-in"==g&&"none"==h||/^[\s\xa0]*$/.test(b[b.length-1]||"")||b.push("");var n=ed(a),u=null,p=null;n&&(u=V(a,"white-space"),p=V(a,"text-transform"));l(a.childNodes,function(G){c(G,b,n,u,p)});a=b[b.length-1]||"";!d&&"table-cell"!=e||!a||
|
110
110
|
za(a)||(b[b.length-1]+=" ");f&&"run-in"!=e&&!/^[\s\xa0]*$/.test(a)&&b.push("")}}function kd(a,b){ld(a,b,function(c,d,e,f,g){3==c.nodeType&&e?nd(c,d,f,g):S(c)&&kd(c,d)})}var md="inline inline-block inline-table none table-cell table-column table-column-group".split(" ");
|
111
|
-
function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.replace(/(\r\n|\r|\n)/g,"\n");if("normal"==c||"nowrap"==c)a=a.replace(/\n/g," ");a="pre"==c||"pre-wrap"==c?a.replace(/[ \f\t\v\u2028\u2029]/g,"\u00a0"):a.replace(/[ \f\t\v\u2028\u2029]+/g," ");"capitalize"==d?a=a.replace(/(^|[^\d\p{L}\p{S}])([\p{Ll}|\p{S}])/gu,function(e,f,g){return f+g.toUpperCase()}):"uppercase"==d?a=a.toUpperCase():"lowercase"==d&&(a=a.toLowerCase());c=b.pop()||"";za(c)&&0==a.lastIndexOf(" ",
|
112
|
-
b.push(c+a)}function dd(a){if(Mc){if("relative"==V(a,"position"))return 1;a=V(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return od(a)}function od(a){var b=1,c=V(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
|
111
|
+
function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.replace(/(\r\n|\r|\n)/g,"\n");if("normal"==c||"nowrap"==c)a=a.replace(/\n/g," ");a="pre"==c||"pre-wrap"==c?a.replace(/[ \f\t\v\u2028\u2029]/g,"\u00a0"):a.replace(/[ \f\t\v\u2028\u2029]+/g," ");"capitalize"==d?a=a.replace(t?/(^|\s|\b)(\S)/g:/(^|[^\d\p{L}\p{S}])([\p{Ll}|\p{S}])/gu,function(e,f,g){return f+g.toUpperCase()}):"uppercase"==d?a=a.toUpperCase():"lowercase"==d&&(a=a.toLowerCase());c=b.pop()||"";za(c)&&0==a.lastIndexOf(" ",
|
112
|
+
0)&&(a=a.substr(1));b.push(c+a)}function dd(a){if(Mc){if("relative"==V(a,"position"))return 1;a=V(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return od(a)}function od(a){var b=1,c=V(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
|
113
113
|
function pd(a,b,c,d,e){if(3==a.nodeType&&c)nd(a,b,d,e);else if(S(a))if(S(a,"CONTENT")||S(a,"SLOT")){for(var f=a;f.parentNode;)f=f.parentNode;f instanceof ShadowRoot?(a=S(a,"CONTENT")?a.getDistributedNodes():a.assignedNodes(),l(a,function(g){pd(g,b,c,d,e)})):jd(a,b)}else if(S(a,"SHADOW")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)l(a.childNodes,function(g){pd(g,b,c,d,e)}),a=a.olderShadowRoot}else jd(a,b)}
|
114
114
|
function jd(a,b){a.shadowRoot&&l(a.shadowRoot.childNodes,function(c){pd(c,b,!0,null,null)});ld(a,b,function(c,d,e,f,g){var h=null;1==c.nodeType?h=c:3==c.nodeType&&(h=c);null!=h&&(null!=h.assignedSlot||h.getDestinationInsertionPoints&&0<h.getDestinationInsertionPoints().length)||pd(c,d,e,f,g)})};var qd={C:function(a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\d.*/.test(b)},o:function(a,b){var c=eb(b),d="string"===typeof a?c.a.getElementById(a):a;return d?Uc(d,"id")==a&&b!=d&&hb(b,d)?d:ua(mb(c,"*"),function(e){return Uc(e,"id")==a&&b!=e&&hb(b,e)}):null},j:function(a,b){if(!a)return[];if(qd.C(b,a))try{return b.querySelectorAll("#"+qd.T(a))}catch(c){return[]}b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"id")==a})},T:function(a){return a.replace(/([\s'"\\#.:;,!?+<>=~*^$|%&@`{}\-\/\[\]\(\)])/g,
|
115
115
|
"\\$1")}};var Y={},rd={};Y.N=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return ua(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.K=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return pa(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.o=function(a,b){return Y.N(a,b,!1)};Y.j=function(a,b){return Y.K(a,b,!1)};rd.o=function(a,b){return Y.N(a,b,!0)};
|
@@ -50,7 +50,7 @@ module Selenium
|
|
50
50
|
#
|
51
51
|
# @example
|
52
52
|
# options = Selenium::WebDriver::Chrome::Options.new(args: ['start-maximized', 'user-data-dir=/tmp/temp_profile'])
|
53
|
-
# driver = Selenium::WebDriver.for(:chrome,
|
53
|
+
# driver = Selenium::WebDriver.for(:chrome, capabilities: options)
|
54
54
|
#
|
55
55
|
# @param [Profile] :profile An instance of a Chrome::Profile Class
|
56
56
|
# @param [Array] :encoded_extensions List of extensions that do not need to be Base64 encoded
|
@@ -73,16 +73,10 @@ module Selenium
|
|
73
73
|
def from_json(json)
|
74
74
|
data = decoded(json)
|
75
75
|
|
76
|
-
|
77
|
-
# can't use Dir.mktmpdir(&blk) because of http://jira.codehaus.org/browse/JRUBY-4082
|
78
|
-
tmp_dir = Dir.mktmpdir
|
79
|
-
begin
|
80
|
-
zip_path = File.join(tmp_dir, "webdriver-profile-duplicate-#{json.hash}.zip")
|
76
|
+
Tempfile.create do |zip_path|
|
81
77
|
File.open(zip_path, 'wb') { |zip_file| zip_file << Base64.decode64(data) }
|
82
78
|
|
83
79
|
new Zipper.unzip(zip_path)
|
84
|
-
ensure
|
85
|
-
FileUtils.rm_rf tmp_dir
|
86
80
|
end
|
87
81
|
end
|
88
82
|
end # ClassMethods
|
@@ -72,16 +72,10 @@ module Selenium
|
|
72
72
|
private
|
73
73
|
|
74
74
|
def with_tmp_zip(&blk)
|
75
|
-
#
|
76
|
-
|
77
|
-
|
78
|
-
zip_path = File.join(tmp_dir, 'webdriver-zip')
|
79
|
-
|
80
|
-
begin
|
75
|
+
# Don't use Tempfile since it lacks rb_file_s_rename permission on Windows.
|
76
|
+
Dir.mktmpdir do |tmp_dir|
|
77
|
+
zip_path = File.join(tmp_dir, 'webdriver-zip')
|
81
78
|
Zip::File.open(zip_path, Zip::File::CREATE, &blk)
|
82
|
-
ensure
|
83
|
-
FileUtils.rm_rf tmp_dir
|
84
|
-
FileUtils.rm_rf zip_path
|
85
79
|
end
|
86
80
|
end
|
87
81
|
|
@@ -161,7 +161,18 @@ module Selenium
|
|
161
161
|
end
|
162
162
|
|
163
163
|
def socket
|
164
|
-
@socket ||=
|
164
|
+
@socket ||= begin
|
165
|
+
if URI(@url).scheme == 'wss'
|
166
|
+
socket = TCPSocket.new(ws.host, ws.port)
|
167
|
+
socket = OpenSSL::SSL::SSLSocket.new(socket, OpenSSL::SSL::SSLContext.new)
|
168
|
+
socket.sync_close = true
|
169
|
+
socket.connect
|
170
|
+
|
171
|
+
socket
|
172
|
+
else
|
173
|
+
TCPSocket.new(ws.host, ws.port)
|
174
|
+
end
|
175
|
+
end
|
165
176
|
end
|
166
177
|
|
167
178
|
def ws
|
@@ -44,7 +44,7 @@ module Selenium
|
|
44
44
|
#
|
45
45
|
# @example
|
46
46
|
# options = Selenium::WebDriver::Firefox::Options.new(args: ['--host=127.0.0.1'])
|
47
|
-
# driver = Selenium::WebDriver.for :firefox,
|
47
|
+
# driver = Selenium::WebDriver.for :firefox, capabilities: options
|
48
48
|
#
|
49
49
|
# @param [Hash] opts the pre-defined options to create the Firefox::Options with
|
50
50
|
# @option opts [String] :binary Path to the Firefox executable to use
|
@@ -175,7 +175,7 @@ module Selenium
|
|
175
175
|
end
|
176
176
|
|
177
177
|
def camelize?(key)
|
178
|
-
key !=
|
178
|
+
key != "prefs"
|
179
179
|
end
|
180
180
|
end # Options
|
181
181
|
end # Firefox
|
@@ -52,12 +52,12 @@ module Selenium
|
|
52
52
|
#
|
53
53
|
# @example
|
54
54
|
# options = Selenium::WebDriver::IE::Options.new(args: ['--host=127.0.0.1'])
|
55
|
-
# driver = Selenium::WebDriver.for(:ie,
|
55
|
+
# driver = Selenium::WebDriver.for(:ie, capabilities: options)
|
56
56
|
#
|
57
57
|
# @example
|
58
58
|
# options = Selenium::WebDriver::IE::Options.new
|
59
59
|
# options.element_scroll_behavior = Selenium::WebDriver::IE::Options::SCROLL_BOTTOM
|
60
|
-
# driver = Selenium::WebDriver.for(:ie,
|
60
|
+
# driver = Selenium::WebDriver.for(:ie, capabilities: options)
|
61
61
|
#
|
62
62
|
# @param [Hash] opts the pre-defined options
|
63
63
|
# @option opts [Array<String>] args
|
@@ -404,7 +404,7 @@ module Selenium
|
|
404
404
|
def send_keys_to_element(element, keys)
|
405
405
|
# TODO: rework file detectors before Selenium 4.0
|
406
406
|
if @file_detector
|
407
|
-
local_files = keys.first
|
407
|
+
local_files = keys.first&.split("\n")&.map { |key| @file_detector.call(Array(key)) }&.compact
|
408
408
|
if local_files.any?
|
409
409
|
keys = local_files.map { |local_file| upload(local_file) }
|
410
410
|
keys = Array(keys.join("\n"))
|
@@ -604,6 +604,9 @@ module Selenium
|
|
604
604
|
element_id = element_id_from(arg)
|
605
605
|
return Element.new(self, element_id) if element_id
|
606
606
|
|
607
|
+
shadow_root_id = shadow_root_id_from(arg)
|
608
|
+
return ShadowRoot.new self, shadow_root_id if shadow_root_id
|
609
|
+
|
607
610
|
arg.each { |k, v| arg[k] = unwrap_script_result(v) }
|
608
611
|
else
|
609
612
|
arg
|
@@ -23,13 +23,14 @@ require 'selenium/webdriver/remote/server_error'
|
|
23
23
|
module Selenium
|
24
24
|
module WebDriver
|
25
25
|
module Remote
|
26
|
-
autoload :Bridge,
|
27
|
-
autoload :Driver,
|
28
|
-
autoload :Response,
|
26
|
+
autoload :Bridge, 'selenium/webdriver/remote/bridge'
|
27
|
+
autoload :Driver, 'selenium/webdriver/remote/driver'
|
28
|
+
autoload :Response, 'selenium/webdriver/remote/response'
|
29
29
|
autoload :Capabilities, 'selenium/webdriver/remote/capabilities'
|
30
|
-
autoload :COMMANDS,
|
30
|
+
autoload :COMMANDS, 'selenium/webdriver/remote/commands'
|
31
|
+
|
31
32
|
module Http
|
32
|
-
autoload :Common,
|
33
|
+
autoload :Common, 'selenium/webdriver/remote/http/common'
|
33
34
|
autoload :Default, 'selenium/webdriver/remote/http/default'
|
34
35
|
end
|
35
36
|
end
|
data/lib/selenium/webdriver.rb
CHANGED
@@ -75,7 +75,7 @@ module Selenium
|
|
75
75
|
#
|
76
76
|
# WebDriver.for :firefox, profile: 'some-profile'
|
77
77
|
# WebDriver.for :firefox, profile: Profile.new
|
78
|
-
# WebDriver.for :remote, url: "http://localhost:4444/wd/hub",
|
78
|
+
# WebDriver.for :remote, url: "http://localhost:4444/wd/hub", capabilities: caps
|
79
79
|
#
|
80
80
|
# One special argument is not passed on to the bridges, :listener.
|
81
81
|
# You can pass a listener for this option to get notified of WebDriver events.
|
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.
|
4
|
+
version: 4.1.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-
|
13
|
+
date: 2021-11-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: childprocess
|