selenium-webdriver 4.11.0 → 4.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +10 -0
- data/bin/linux/selenium-manager +0 -0
- data/bin/macos/selenium-manager +0 -0
- data/bin/windows/selenium-manager.exe +0 -0
- data/lib/selenium/webdriver/atoms/findElements.js +1 -1
- data/lib/selenium/webdriver/atoms/getAttribute.js +1 -1
- data/lib/selenium/webdriver/atoms/isDisplayed.js +1 -1
- data/lib/selenium/webdriver/chrome/driver.rb +2 -2
- data/lib/selenium/webdriver/chrome.rb +0 -2
- data/lib/selenium/webdriver/chromium/options.rb +1 -1
- data/lib/selenium/webdriver/chromium.rb +0 -2
- data/lib/selenium/webdriver/common/driver.rb +0 -12
- data/lib/selenium/webdriver/common/local_driver.rb +8 -17
- data/lib/selenium/webdriver/common/selenium_manager.rb +5 -7
- data/lib/selenium/webdriver/edge/driver.rb +2 -2
- data/lib/selenium/webdriver/edge.rb +0 -2
- data/lib/selenium/webdriver/firefox/driver.rb +2 -2
- data/lib/selenium/webdriver/firefox/options.rb +1 -1
- data/lib/selenium/webdriver/ie/driver.rb +2 -2
- data/lib/selenium/webdriver/ie/options.rb +2 -2
- data/lib/selenium/webdriver/remote/driver.rb +12 -0
- data/lib/selenium/webdriver/safari/driver.rb +2 -2
- data/lib/selenium/webdriver/version.rb +1 -1
- data/lib/selenium/webdriver.rb +1 -0
- 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: 55168c5bf8486c6fa21e644095be740f2f6db107b6864097e4ee53fdf4568f96
|
4
|
+
data.tar.gz: 276d1d1976e25f0190fdbf3c5745ef20fd8c9693e6602c774a3ad41af0a054c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78c70c53eb450854a115edd260d1e6f796c58f42f795434202868eb025cb0d9e0e06a9268b31c4a7fbb765c25c8a4fabe11ad06a7f6dd3cda25ca0e951c4ba41
|
7
|
+
data.tar.gz: 2efb72b14eb8d51dd8dfe5a4b88a58e9e551194e28ff05f890d208393fc2f34239665e143bddf405b88681c959402527b303a602fc01bfd37b7d12d8dbf29781
|
data/CHANGES
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
4.12.0 (Unreleased)
|
2
|
+
=========================
|
3
|
+
Ruby:
|
4
|
+
* Fix bug preventing good error messages in Selenium Manager when stdout empty
|
5
|
+
* Fix bug with Firefox not loading net/http library by default (#12506)
|
6
|
+
* Remove support for using capabilities in local drivers
|
7
|
+
|
8
|
+
BiDi:
|
9
|
+
* Released selenium-devtools 0.116.0 (supports CDP v85, v114, v115, v116)
|
10
|
+
|
1
11
|
4.11.0 (2023-07-31)
|
2
12
|
=========================
|
3
13
|
Ruby:
|
data/bin/linux/selenium-manager
CHANGED
Binary file
|
data/bin/macos/selenium-manager
CHANGED
Binary file
|
Binary file
|
@@ -118,4 +118,4 @@ d=W(d);e=new U(e.a-c,e.b-c,e.width+2*c,e.height+2*c);return e.a<=d.a+d.width&&d.
|
|
118
118
|
}};Z.P={left:Z.V,right:Z.aa,above:Z.R,below:Z.S,near:Z.W};Z.O={left:Z.u,right:Z.u,above:Z.u,below:Z.u,near:Z.u};Z.U=function(a,b){var c=[];l(a,function(e){e&&ta(b,function(f){var g=f.kind,h=Z.P[g];if(!h)throw new P(61,"Cannot find filter suitable for "+g);return h.apply(null,f.args)(e)},null)&&c.push(e)},null);a=b[b.length-1];var d=Z.O[a?a.kind:"unknown"];return d?(a=d.apply(null,a.args))?Z.ba(a,c):c:c};
|
119
119
|
Z.ba=function(a,b){function c(f){f=W(f);return Math.sqrt(Math.pow(d-(f.a+Math.max(1,f.width)/2),2)+Math.pow(e-(f.b+Math.max(1,f.height)/2),2))}a=W(a);var d=a.a+Math.max(1,a.width)/2,e=a.b+Math.max(1,a.height)/2;xa(b,function(f,g){return c(f)-c(g)});return b};Z.o=function(a,b){a=Z.j(a,b);return 0==a.length?null:a[0]};
|
120
120
|
Z.j=function(a,b){if(!a.hasOwnProperty("root")||!a.hasOwnProperty("filters"))throw new P(61,"Locator not suitable for relative locators: "+JSON.stringify(a));var c=a.filters,d=da(c);if("array"!=d&&("object"!=d||"number"!=typeof c.length))throw new P(61,"Targets should be an array: "+JSON.stringify(a));var e;S(a.root)?e=[a.root]:e=ud(a.root,b);return 0==e.length?[]:Z.U(e,a.filters)};var vd={o:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)[0]||null},j:function(a,b){if(""===a)throw new P(32,'Unable to locate an element with the tagName ""');return b.getElementsByTagName(a)}};var td={className:Dc,"class name":Dc,css:Nc,"css selector":Nc,relative:Z,id:qd,linkText:Y,"link text":Y,name:{o:function(a,b){b=mb(eb(b),"*",null,b);return ua(b,function(c){return Uc(c,"name")==a})},j:function(a,b){b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"name")==a})}},partialLinkText:rd,"partial link text":rd,tagName:vd,"tag name":vd,xpath:T};function sd(a){for(var b in a)if(a.hasOwnProperty(b))return b;return null}
|
121
|
-
function ud(a,b){var c=sd(a);if(c){var d=td[c];if(d&&ea(d.j))return d.j(a[c],b||Bc.document)}throw new P(61,"Unsupported locator strategy: "+c);};ca("_",ud);; return this._.apply(null,arguments);}).apply(
|
121
|
+
function ud(a,b){var c=sd(a);if(c){var d=td[c];if(d&&ea(d.j))return d.j(a[c],b||Bc.document)}throw new P(61,"Unsupported locator strategy: "+c);};ca("_",ud);; return this._.apply(null,arguments);}).apply(window, arguments);}
|
@@ -97,4 +97,4 @@ Uc.prototype.set=function(a,b){Object.prototype.hasOwnProperty.call(this.b,a)||(
|
|
97
97
|
Z(69,"e","E");Z(70,"f","F");Z(71,"g","G");Z(72,"h","H");Z(73,"i","I");Z(74,"j","J");Z(75,"k","K");Z(76,"l","L");Z(77,"m","M");Z(78,"n","N");Z(79,"o","O");Z(80,"p","P");Z(81,"q","Q");Z(82,"r","R");Z(83,"s","S");Z(84,"t","T");Z(85,"u","U");Z(86,"v","V");Z(87,"w","W");Z(88,"x","X");Z(89,"y","Y");Z(90,"z","Z");var ad=Z(Ia?{g:91,h:91}:Ha?{g:224,h:91}:{g:0,h:91});Z(Ia?{g:92,h:92}:Ha?{g:224,h:93}:{g:0,h:92});Z(Ia?{g:93,h:93}:Ha?{g:0,h:0}:{g:93,h:null});Z({g:96,h:96},"0");Z({g:97,h:97},"1");
|
98
98
|
Z({g:98,h:98},"2");Z({g:99,h:99},"3");Z({g:100,h:100},"4");Z({g:101,h:101},"5");Z({g:102,h:102},"6");Z({g:103,h:103},"7");Z({g:104,h:104},"8");Z({g:105,h:105},"9");Z({g:106,h:106},"*");Z({g:107,h:107},"+");Z({g:109,h:109},"-");Z({g:110,h:110},".");Z({g:111,h:111},"/");Z(144);Z(112);Z(113);Z(114);Z(115);Z(116);Z(117);Z(118);Z(119);Z(120);Z(121);Z(122);Z(123);Z({g:107,h:187},"=","+");Z(108,",");Z({g:109,h:189},"-","_");Z(188,",","<");Z(190,".",">");Z(191,"/","?");Z(192,"`","~");Z(219,"[","{");
|
99
99
|
Z(220,"\\","|");Z(221,"]","}");Z({g:59,h:186},";",":");Z(222,"'",'"');var bd=new Uc;bd.set(1,Yc);bd.set(2,Zc);bd.set(4,$c);bd.set(8,ad);(function(a){var b=new Uc;n(Vc(a),function(c){b.set(a.get(c).code,c)});return b})(bd);var cd={"class":"className",readonly:"readOnly"},dd="allowfullscreen allowpaymentrequest allowusermedia async autofocus autoplay checked compact complete controls declare default defaultchecked defaultselected defer disabled ended formnovalidate hidden indeterminate iscontenteditable ismap itemscope loop multiple muted nohref nomodule noresize noshade novalidate nowrap open paused playsinline pubdate readonly required reversed scoped seamless seeking selected truespeed typemustmatch willvalidate".split(" ");ba("_",function(a,b){var c=null,d=b.toLowerCase();if("style"==d)return(c=a.style)&&!aa(c)&&(c=c.cssText),c;if(("selected"==d||"checked"==d)&&Jc(a)){if(!Jc(a))throw new U(15,"Element is not selectable");b="selected";c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";return Ic(a,b)?"true":null}var e=Gc(a,"A");if(Gc(a,"IMG")&&"src"==d||e&&"href"==d)return(c=Ec(a,d))&&(c=Ic(a,d)),c;if("spellcheck"==d){c=Ec(a,d);if(null!==c){if("false"==c.toLowerCase())return"false";if("true"==c.toLowerCase())return"true"}return Ic(a,
|
100
|
-
d)+""}e=cd[b]||b;if(0<=ma(dd,d))return(c=null!==Ec(a,b)||Ic(a,e))?"true":null;try{var f=Ic(a,e)}catch(g){}null==f||da(f)?c=Ec(a,b):c=f;return null!=c?c.toString():null});; return this._.apply(null,arguments);}).apply(
|
100
|
+
d)+""}e=cd[b]||b;if(0<=ma(dd,d))return(c=null!==Ec(a,b)||Ic(a,e))?"true":null;try{var f=Ic(a,e)}catch(g){}null==f||da(f)?c=Ec(a,b):c=f;return null!=c?c.toString():null});; return this._.apply(null,arguments);}).apply(window, arguments);}
|
@@ -97,4 +97,4 @@ r.y){var D=Jc(a);if(0==D.width||0==D.height)return Z;var L=e.a<D.a,M=e.b<D.b;if(
|
|
97
97
|
function Jc(a){var b=Lc(a);if(b)return b.rect;if(W(a,"HTML"))return a=A(a),a=((a?a.parentWindow||a.defaultView:window)||window).document,a="CSS1Compat"==a.compatMode?a.documentElement:a.body,a=new Va(a.clientWidth,a.clientHeight),new X(0,0,a.width,a.height);try{var c=a.getBoundingClientRect()}catch(d){return new X(0,0,0,0)}b=new X(c.left,c.top,c.right-c.left,c.bottom-c.top);v&&a.ownerDocument.body&&(a=A(a),b.a-=a.documentElement.clientLeft+a.body.clientLeft,b.b-=a.documentElement.clientTop+a.body.clientTop);
|
98
98
|
return b}function Lc(a){var b=W(a,"MAP");if(!b&&!W(a,"AREA"))return null;var c=b?a:W(a.parentNode,"MAP")?a.parentNode:null,d=null,e=null;c&&c.name&&(d=Dc('/descendant::*[@usemap = "#'+c.name+'"]',A(c)))&&(e=Jc(d),b||"default"==a.shape.toLowerCase()||(a=Oc(a),b=Math.min(Math.max(a.a,0),e.width),c=Math.min(Math.max(a.b,0),e.height),e=new X(b+e.a,c+e.b,Math.min(a.width,e.width-b),Math.min(a.height,e.height-c))));return{image:d,rect:e||new X(0,0,0,0)}}
|
99
99
|
function Oc(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4==a.length){b=a[0];var c=a[1];return new X(b,c,a[2]-b,a[3]-c)}if("circle"==b&&3==a.length)return b=a[2],new X(a[0]-b,a[1]-b,2*b,2*b);if("poly"==b&&2<a.length){b=a[0];c=a[1];for(var d=b,e=c,f=2;f+1<a.length;f+=2)b=Math.min(b,a[f]),d=Math.max(d,a[f]),c=Math.min(c,a[f+1]),e=Math.max(e,a[f+1]);return new X(b,c,d-b,e-c)}return new X(0,0,0,0)}function Nc(a){a=Jc(a);return new Ec(a.b,a.a+a.width,a.b+a.height,a.a)}
|
100
|
-
function Mc(a){if(Ac){if("relative"==Y(a,"position"))return 1;a=Y(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return Pc(a)}function Pc(a){var b=1,c=Y(a,"opacity");c&&(b=Number(c));(a=Gc(a))&&(b*=Pc(a));return b};ba("_",function(a,b){function c(d){if(W(d)&&"none"==Y(d,"display"))return!1;var e;if((e=d.parentNode)&&e.shadowRoot&&void 0!==d.assignedSlot)e=d.assignedSlot?d.assignedSlot.parentNode:null;else if(d.getDestinationInsertionPoints){var f=d.getDestinationInsertionPoints();0<f.length&&(e=f[f.length-1])}if(Fc&&e instanceof ShadowRoot){if(e.host.shadowRoot!==e)return!1;e=e.host}return!e||9!=e.nodeType&&11!=e.nodeType?e&&W(e,"DETAILS")&&!e.open&&!W(d,"SUMMARY")?!1:!!e&&c(e):!0}return Ic(a,!!b,c)});; return this._.apply(null,arguments);}).apply(
|
100
|
+
function Mc(a){if(Ac){if("relative"==Y(a,"position"))return 1;a=Y(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return Pc(a)}function Pc(a){var b=1,c=Y(a,"opacity");c&&(b=Number(c));(a=Gc(a))&&(b*=Pc(a));return b};ba("_",function(a,b){function c(d){if(W(d)&&"none"==Y(d,"display"))return!1;var e;if((e=d.parentNode)&&e.shadowRoot&&void 0!==d.assignedSlot)e=d.assignedSlot?d.assignedSlot.parentNode:null;else if(d.getDestinationInsertionPoints){var f=d.getDestinationInsertionPoints();0<f.length&&(e=f[f.length-1])}if(Fc&&e instanceof ShadowRoot){if(e.host.shadowRoot!==e)return!1;e=e.host}return!e||9!=e.nodeType&&11!=e.nodeType?e&&W(e,"DETAILS")&&!e.open&&!W(d,"SUMMARY")?!1:!!e&&c(e):!0}return Ic(a,!!b,c)});; return this._.apply(null,arguments);}).apply(window, arguments);}
|
@@ -30,8 +30,8 @@ module Selenium
|
|
30
30
|
class Driver < Chromium::Driver
|
31
31
|
include LocalDriver
|
32
32
|
|
33
|
-
def initialize(
|
34
|
-
caps, url = initialize_local_driver(
|
33
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
34
|
+
caps, url = initialize_local_driver(options, service, url)
|
35
35
|
super(caps: caps, url: url, **opts)
|
36
36
|
end
|
37
37
|
|
@@ -47,7 +47,7 @@ module Selenium
|
|
47
47
|
#
|
48
48
|
# @example
|
49
49
|
# options = Selenium::WebDriver::Chrome::Options.new(args: ['start-maximized', 'user-data-dir=/tmp/temp_profile'])
|
50
|
-
# driver = Selenium::WebDriver.for(:chrome,
|
50
|
+
# driver = Selenium::WebDriver.for(:chrome, options: options)
|
51
51
|
#
|
52
52
|
# @param [Profile] profile An instance of a Chrome::Profile Class
|
53
53
|
# @param [Hash] opts the pre-defined options to create the Chrome::Options with
|
@@ -318,18 +318,6 @@ module Selenium
|
|
318
318
|
end
|
319
319
|
end
|
320
320
|
|
321
|
-
def generate_capabilities(capabilities)
|
322
|
-
Array(capabilities).map { |cap|
|
323
|
-
if cap.is_a? Symbol
|
324
|
-
cap = WebDriver::Options.send(cap)
|
325
|
-
elsif !cap.respond_to? :as_json
|
326
|
-
msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not"
|
327
|
-
raise ArgumentError, msg
|
328
|
-
end
|
329
|
-
cap.as_json
|
330
|
-
}.inject(:merge)
|
331
|
-
end
|
332
|
-
|
333
321
|
def service_url(service)
|
334
322
|
@service_manager = service.launch
|
335
323
|
@service_manager.uri
|
@@ -20,35 +20,26 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module LocalDriver
|
23
|
-
def initialize_local_driver(
|
23
|
+
def initialize_local_driver(options, service, url)
|
24
24
|
raise ArgumentError, "Can't initialize #{self.class} with :url" if url
|
25
25
|
|
26
26
|
service ||= Service.send(browser)
|
27
|
-
caps = process_options(options,
|
27
|
+
caps = process_options(options, service)
|
28
28
|
url = service_url(service)
|
29
29
|
|
30
30
|
[caps, url]
|
31
31
|
end
|
32
32
|
|
33
|
-
def process_options(options,
|
33
|
+
def process_options(options, service)
|
34
34
|
default_options = Options.send(browser)
|
35
|
+
options ||= default_options
|
35
36
|
|
36
|
-
|
37
|
-
msg = "Don't use both :options and :capabilities when initializing #{self.class}, prefer :options"
|
38
|
-
raise ArgumentError, msg
|
39
|
-
elsif options && !options.is_a?(default_options.class)
|
37
|
+
unless options.is_a?(default_options.class)
|
40
38
|
raise ArgumentError, ":options must be an instance of #{default_options.class}"
|
41
|
-
elsif capabilities
|
42
|
-
WebDriver.logger.deprecate("The :capabilities parameter for #{self.class}",
|
43
|
-
":options argument with an instance of #{self.class}",
|
44
|
-
id: :capabilities)
|
45
|
-
service.executable_path ||= WebDriver::DriverFinder.path(capabilities, service.class)
|
46
|
-
generate_capabilities(capabilities)
|
47
|
-
else
|
48
|
-
options ||= default_options
|
49
|
-
service.executable_path ||= WebDriver::DriverFinder.path(options, service.class)
|
50
|
-
options.as_json
|
51
39
|
end
|
40
|
+
|
41
|
+
service.executable_path ||= WebDriver::DriverFinder.path(options, service.class)
|
42
|
+
options.as_json
|
52
43
|
end
|
53
44
|
end
|
54
45
|
end
|
@@ -108,22 +108,20 @@ module Selenium
|
|
108
108
|
|
109
109
|
begin
|
110
110
|
stdout, stderr, status = Open3.capture3(*command)
|
111
|
-
json_output = stdout.empty? ? nil : JSON.parse(stdout)
|
112
|
-
result = json_output['result']
|
113
111
|
rescue StandardError => e
|
114
112
|
raise Error::WebDriverError, "Unsuccessful command executed: #{command}; #{e.message}"
|
115
113
|
end
|
116
114
|
|
117
|
-
|
115
|
+
json_output = stdout.empty? ? {} : JSON.parse(stdout)
|
116
|
+
(json_output['logs'] || []).each do |log|
|
118
117
|
level = log['level'].casecmp('info').zero? ? 'debug' : log['level'].downcase
|
119
118
|
WebDriver.logger.send(level, log['message'], id: :selenium_manager)
|
120
119
|
end
|
121
120
|
|
122
|
-
|
123
|
-
|
124
|
-
end
|
121
|
+
result = json_output['result']
|
122
|
+
return result unless status.exitstatus.positive?
|
125
123
|
|
126
|
-
result
|
124
|
+
raise Error::WebDriverError, "Unsuccessful command executed: #{command}\n#{result}#{stderr}"
|
127
125
|
end
|
128
126
|
end
|
129
127
|
end # SeleniumManager
|
@@ -30,8 +30,8 @@ module Selenium
|
|
30
30
|
class Driver < Chromium::Driver
|
31
31
|
include LocalDriver
|
32
32
|
|
33
|
-
def initialize(
|
34
|
-
caps, url = initialize_local_driver(
|
33
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
34
|
+
caps, url = initialize_local_driver(options, service, url)
|
35
35
|
super(caps: caps, url: url, **opts)
|
36
36
|
end
|
37
37
|
|
@@ -38,8 +38,8 @@ module Selenium
|
|
38
38
|
|
39
39
|
include LocalDriver
|
40
40
|
|
41
|
-
def initialize(
|
42
|
-
caps, url = initialize_local_driver(
|
41
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
42
|
+
caps, url = initialize_local_driver(options, service, url)
|
43
43
|
super(caps: caps, url: url, **opts)
|
44
44
|
end
|
45
45
|
|
@@ -45,7 +45,7 @@ module Selenium
|
|
45
45
|
#
|
46
46
|
# @example
|
47
47
|
# options = Selenium::WebDriver::Firefox::Options.new(args: ['--host=127.0.0.1'])
|
48
|
-
# driver = Selenium::WebDriver.for :firefox,
|
48
|
+
# driver = Selenium::WebDriver.for :firefox, options: options
|
49
49
|
#
|
50
50
|
# @param [Hash] opts the pre-defined options to create the Firefox::Options with
|
51
51
|
# @option opts [String] :binary Path to the Firefox executable to use
|
@@ -31,8 +31,8 @@ module Selenium
|
|
31
31
|
|
32
32
|
include LocalDriver
|
33
33
|
|
34
|
-
def initialize(
|
35
|
-
caps, url = initialize_local_driver(
|
34
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
35
|
+
caps, url = initialize_local_driver(options, service, url)
|
36
36
|
super(caps: caps, url: url, **opts)
|
37
37
|
end
|
38
38
|
|
@@ -53,12 +53,12 @@ module Selenium
|
|
53
53
|
#
|
54
54
|
# @example
|
55
55
|
# options = Selenium::WebDriver::IE::Options.new(args: ['--host=127.0.0.1'])
|
56
|
-
# driver = Selenium::WebDriver.for(:ie,
|
56
|
+
# driver = Selenium::WebDriver.for(:ie, options: options)
|
57
57
|
#
|
58
58
|
# @example
|
59
59
|
# options = Selenium::WebDriver::IE::Options.new
|
60
60
|
# options.element_scroll_behavior = Selenium::WebDriver::IE::Options::SCROLL_BOTTOM
|
61
|
-
# driver = Selenium::WebDriver.for(:ie,
|
61
|
+
# driver = Selenium::WebDriver.for(:ie, options: options)
|
62
62
|
#
|
63
63
|
# @param [Hash] opts the pre-defined options
|
64
64
|
# @option opts [Array<String>] args
|
@@ -60,6 +60,18 @@ module Selenium
|
|
60
60
|
end
|
61
61
|
options ? options.as_json : generate_capabilities(capabilities)
|
62
62
|
end
|
63
|
+
|
64
|
+
def generate_capabilities(capabilities)
|
65
|
+
Array(capabilities).map { |cap|
|
66
|
+
if cap.is_a? Symbol
|
67
|
+
cap = WebDriver::Options.send(cap)
|
68
|
+
elsif !cap.respond_to? :as_json
|
69
|
+
msg = ":capabilities parameter only accepts objects responding to #as_json which #{cap.class} does not"
|
70
|
+
raise ArgumentError, msg
|
71
|
+
end
|
72
|
+
cap.as_json
|
73
|
+
}.inject(:merge)
|
74
|
+
end
|
63
75
|
end # Driver
|
64
76
|
end # Remote
|
65
77
|
end # WebDriver
|
@@ -32,8 +32,8 @@ module Selenium
|
|
32
32
|
|
33
33
|
include LocalDriver
|
34
34
|
|
35
|
-
def initialize(
|
36
|
-
caps, url = initialize_local_driver(
|
35
|
+
def initialize(options: nil, service: nil, url: nil, **opts)
|
36
|
+
caps, url = initialize_local_driver(options, service, url)
|
37
37
|
super(caps: caps, url: url, **opts)
|
38
38
|
end
|
39
39
|
|
data/lib/selenium/webdriver.rb
CHANGED
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.12.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: 2023-
|
13
|
+
date: 2023-08-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rexml
|