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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55c2b164be56b90064957852c6b1f890f9cda063d5c0ef164752b7c67f6e40bb
4
- data.tar.gz: 778d0c6d2450a3d178d709762c76b9ef2c24832131d4487f6c84b5789a32b1de
3
+ metadata.gz: 55168c5bf8486c6fa21e644095be740f2f6db107b6864097e4ee53fdf4568f96
4
+ data.tar.gz: 276d1d1976e25f0190fdbf3c5745ef20fd8c9693e6602c774a3ad41af0a054c2
5
5
  SHA512:
6
- metadata.gz: 6777b04b259f2e7be27d7c2635f77b0e9006464f931e1e79a1e10f517474b71344534a8b02ba84445801581f4c50cb79901d15ef8e74133c08357625e5ad9de6
7
- data.tar.gz: 5f1e3af40a4bbcc3e4e77407321d64b1e6920ca91fcf7605bce780d42138fd587bfc951563205d8cf6e4b63952e7e4e35dd52aba496fcb1e468e6a086c81c92d
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:
Binary file
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({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);}
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({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);}
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({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);}
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(capabilities: nil, options: nil, service: nil, url: nil, **opts)
34
- caps, url = initialize_local_driver(capabilities, options, service, url)
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
 
@@ -17,8 +17,6 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- require 'net/http'
21
-
22
20
  module Selenium
23
21
  module WebDriver
24
22
  module Chrome
@@ -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, capabilities: options)
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
@@ -17,8 +17,6 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- require 'net/http'
21
-
22
20
  module Selenium
23
21
  module WebDriver
24
22
  module Chromium
@@ -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(capabilities, options, service, url)
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, capabilities, service)
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, capabilities, service)
33
+ def process_options(options, service)
34
34
  default_options = Options.send(browser)
35
+ options ||= default_options
35
36
 
36
- if options && capabilities
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
- (json_output&.fetch('logs') || []).each do |log|
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
- if status.exitstatus.positive?
123
- raise Error::WebDriverError, "Unsuccessful command executed: #{command}\n#{result}#{stderr}"
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(capabilities: nil, options: nil, service: nil, url: nil, **opts)
34
- caps, url = initialize_local_driver(capabilities, options, service, url)
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
 
@@ -17,8 +17,6 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- require 'net/http'
21
-
22
20
  module Selenium
23
21
  module WebDriver
24
22
  module Edge
@@ -38,8 +38,8 @@ module Selenium
38
38
 
39
39
  include LocalDriver
40
40
 
41
- def initialize(capabilities: nil, options: nil, service: nil, url: nil, **opts)
42
- caps, url = initialize_local_driver(capabilities, options, service, url)
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, capabilities: options
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(capabilities: nil, options: nil, service: nil, url: nil, **opts)
35
- caps, url = initialize_local_driver(capabilities, options, service, url)
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, capabilities: options)
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, capabilities: options)
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(capabilities: nil, options: nil, service: nil, url: nil, **opts)
36
- caps, url = initialize_local_driver(capabilities, options, service, url)
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
 
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- VERSION = '4.11.0'
22
+ VERSION = '4.12.0'
23
23
  end # WebDriver
24
24
  end # Selenium
@@ -23,6 +23,7 @@ require 'date'
23
23
  require 'json'
24
24
  require 'set'
25
25
  require 'uri'
26
+ require 'net/http'
26
27
 
27
28
  require 'selenium/webdriver/atoms'
28
29
  require 'selenium/webdriver/common'
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.11.0
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-07-31 00:00:00.000000000 Z
13
+ date: 2023-08-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rexml