selenium-webdriver 4.9.1 → 4.10.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/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 +3 -4
- data/lib/selenium/webdriver/common/driver_finder.rb +11 -8
- data/lib/selenium/webdriver/common/error.rb +28 -3
- data/lib/selenium/webdriver/common/logger.rb +21 -8
- data/lib/selenium/webdriver/common/proxy.rb +1 -1
- data/lib/selenium/webdriver/common/selenium_manager.rb +40 -23
- data/lib/selenium/webdriver/edge/options.rb +14 -0
- data/lib/selenium/webdriver/safari/service.rb +10 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/selenium-webdriver.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 57f5a526cd47137c459f2eb349f03fbebc28b428a4d1eba1aed962cb8b32f0d4
|
|
4
|
+
data.tar.gz: 0e246eec8fc308f54bb651245cebaf3610a5abf4f6027728a6e96210b72a397e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 679674b291a9b3da8d41a917ed782d14743150b524767a915e464e39751971ce9420e7a21127dcf10ca070f3bd7bff14a61690c028b013daab8d638550f38a61
|
|
7
|
+
data.tar.gz: a39c8fdecf8a60ad8736aa3392bba7f540c692bdba451546463b8db4e9b967d81d1d30ca665aedb99901e6f173deb3af29fcdfcd7d7c087783b8e24358ae8814
|
data/CHANGES
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
4.10.0 (2023-06-07)
|
|
2
|
+
=========================
|
|
3
|
+
Ruby:
|
|
4
|
+
* Implement proxy support for Selenium Manager
|
|
5
|
+
* Prevent setting driver log level in Safari
|
|
6
|
+
* Change all Selenium Manager logging to :debug (#12145)
|
|
7
|
+
* Error messages include links to documentation
|
|
8
|
+
* Add custom error class for driver location and improve error logic
|
|
9
|
+
|
|
10
|
+
BiDi:
|
|
11
|
+
* Released selenium-devtools 0.114.0 (supports CDP v85, v112, v113, v114)
|
|
12
|
+
|
|
13
|
+
Edge:
|
|
14
|
+
* Add support for webview2
|
|
15
|
+
|
|
1
16
|
4.9.1 (2023-05-08)
|
|
2
17
|
=========================
|
|
3
18
|
Ruby:
|
data/bin/linux/selenium-manager
CHANGED
|
Binary file
|
data/bin/macos/selenium-manager
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -113,10 +113,9 @@ function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.repla
|
|
|
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)};
|
|
116
|
-
rd.j=function(a,b){return Y.K(a,b,!0)};var Z={F:function(a,b){return function(c){var d=Z.u(a);d=W(d);c=W(c);return b.call(null,d,c)}},R:function(a){return Z.F(a,function(b,c){return c.b+c.height<b.b})},S:function(a){return Z.F(a,function(b,c){return b.b+b.height<c.b})},V:function(a){return Z.F(a,function(b,c){return c.a+c.width<b.a})},aa:function(a){return Z.F(a,function(b,c){return b.a+b.width<c.a})},W:function(a,b){var c;b?c=b:"number"==typeof a.distance&&(c=a.distance);c||(c=
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
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};
|
|
116
|
+
rd.j=function(a,b){return Y.K(a,b,!0)};var Z={F:function(a,b){return function(c){var d=Z.u(a);d=W(d);c=W(c);return b.call(null,d,c)}},R:function(a){return Z.F(a,function(b,c){return c.b+c.height<b.b})},S:function(a){return Z.F(a,function(b,c){return b.b+b.height<c.b})},V:function(a){return Z.F(a,function(b,c){return c.a+c.width<b.a})},aa:function(a){return Z.F(a,function(b,c){return b.a+b.width<c.a})},W:function(a,b){var c;b?c=b:"number"==typeof a.distance&&(c=a.distance);c||(c=50);return function(d){var e=Z.u(a);if(e===d)return!1;e=W(e);
|
|
117
|
+
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.a<=e.a+e.width&&e.b<=d.b+d.height&&d.b<=e.b+e.height}},u:function(a){if(ha(a)&&1==a.nodeType)return a;if(ea(a))return Z.u(a.call(null));if(ha(a)){var b;a:{if(b=sd(a)){var c=td[b];if(c&&ea(c.o)){b=c.o(a[b],Bc.document);break a}}throw new P(61,"Unsupported locator strategy: "+b);}if(!b)throw new P(7,"No element has been found by "+JSON.stringify(a));return b}throw new P(61,"Selector is of wrong type: "+JSON.stringify(a));
|
|
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};
|
|
120
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]};
|
|
121
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}
|
|
122
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);}
|
|
@@ -26,17 +26,20 @@ module Selenium
|
|
|
26
26
|
path ||= Platform.find_binary(klass::EXECUTABLE)
|
|
27
27
|
|
|
28
28
|
path ||= begin
|
|
29
|
-
SeleniumManager.driver_path(options)
|
|
29
|
+
SeleniumManager.driver_path(options) unless options.is_a?(Remote::Capabilities)
|
|
30
30
|
rescue StandardError => e
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
raise Error::NoSuchDriverError, "Unable to obtain #{klass::EXECUTABLE} using Selenium Manager; #{e.message}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
begin
|
|
35
|
+
Platform.assert_file(path)
|
|
36
|
+
Platform.assert_executable(path)
|
|
37
|
+
rescue TypeError
|
|
38
|
+
raise Error::NoSuchDriverError, "Unable to locate or obtain #{klass::EXECUTABLE}"
|
|
39
|
+
rescue Error::WebDriverError => e
|
|
40
|
+
raise Error::NoSuchDriverError, "#{klass::EXECUTABLE} located, but: #{e.message}"
|
|
34
41
|
end
|
|
35
|
-
msg = "Unable to locate the #{klass::EXECUTABLE} executable; for more information on how to install drivers, " \
|
|
36
|
-
'see https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers/'
|
|
37
|
-
raise Error::WebDriverError, msg unless path
|
|
38
42
|
|
|
39
|
-
Platform.assert_executable path
|
|
40
43
|
path
|
|
41
44
|
end
|
|
42
45
|
end
|
|
@@ -34,13 +34,20 @@ module Selenium
|
|
|
34
34
|
WebDriverError
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
+
SUPPORT_MSG = 'For documentation on this error, please visit:'
|
|
38
|
+
ERROR_URL = 'https://www.selenium.dev/documentation/webdriver/troubleshooting/errors'
|
|
39
|
+
|
|
37
40
|
class WebDriverError < StandardError; end
|
|
38
41
|
|
|
39
42
|
#
|
|
40
43
|
# An element could not be located on the page using the given search parameters.
|
|
41
44
|
#
|
|
42
45
|
|
|
43
|
-
class NoSuchElementError < WebDriverError
|
|
46
|
+
class NoSuchElementError < WebDriverError
|
|
47
|
+
def initialize(msg = '')
|
|
48
|
+
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#no-such-element-exception")
|
|
49
|
+
end
|
|
50
|
+
end
|
|
44
51
|
|
|
45
52
|
#
|
|
46
53
|
# A command to switch to a frame could not be satisfied because the frame could not be found.
|
|
@@ -58,7 +65,11 @@ module Selenium
|
|
|
58
65
|
# A command failed because the referenced element is no longer attached to the DOM.
|
|
59
66
|
#
|
|
60
67
|
|
|
61
|
-
class StaleElementReferenceError < WebDriverError
|
|
68
|
+
class StaleElementReferenceError < WebDriverError
|
|
69
|
+
def initialize(msg = '')
|
|
70
|
+
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#stale-element-reference-exception")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
62
73
|
|
|
63
74
|
#
|
|
64
75
|
# A command failed because the referenced shadow root is no longer attached to the DOM.
|
|
@@ -132,7 +143,11 @@ module Selenium
|
|
|
132
143
|
# Argument was an invalid selector.
|
|
133
144
|
#
|
|
134
145
|
|
|
135
|
-
class InvalidSelectorError < WebDriverError
|
|
146
|
+
class InvalidSelectorError < WebDriverError
|
|
147
|
+
def initialize(msg = '')
|
|
148
|
+
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}#invalid-selector-exception")
|
|
149
|
+
end
|
|
150
|
+
end
|
|
136
151
|
|
|
137
152
|
#
|
|
138
153
|
# A new session could not be created.
|
|
@@ -212,6 +227,16 @@ module Selenium
|
|
|
212
227
|
#
|
|
213
228
|
|
|
214
229
|
class UnsupportedOperationError < WebDriverError; end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# Indicates that driver was not specified and could not be located.
|
|
233
|
+
#
|
|
234
|
+
|
|
235
|
+
class NoSuchDriverError < WebDriverError
|
|
236
|
+
def initialize(msg = '')
|
|
237
|
+
super("#{msg}; #{SUPPORT_MSG} #{ERROR_URL}/driver_location")
|
|
238
|
+
end
|
|
239
|
+
end
|
|
215
240
|
end # Error
|
|
216
241
|
end # WebDriver
|
|
217
242
|
end # Selenium
|
|
@@ -41,7 +41,7 @@ module Selenium
|
|
|
41
41
|
:debug?,
|
|
42
42
|
:info?,
|
|
43
43
|
:warn?,
|
|
44
|
-
:error
|
|
44
|
+
:error?,
|
|
45
45
|
:fatal, :fatal?,
|
|
46
46
|
:level
|
|
47
47
|
|
|
@@ -127,16 +127,20 @@ module Selenium
|
|
|
127
127
|
# @yield see #deprecate
|
|
128
128
|
#
|
|
129
129
|
def info(message, id: [], &block)
|
|
130
|
-
unless @first_warning
|
|
131
|
-
@first_warning = true
|
|
132
|
-
info("Details on how to use and modify Selenium logger:\n", id: [:logger_info]) do
|
|
133
|
-
"https://selenium.dev/documentation/webdriver/troubleshooting/logging\n"
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
130
|
discard_or_log(:info, message, id, &block)
|
|
138
131
|
end
|
|
139
132
|
|
|
133
|
+
#
|
|
134
|
+
# Used to supply information that suggests an error occurred
|
|
135
|
+
#
|
|
136
|
+
# @param [String] message
|
|
137
|
+
# @param [Symbol, Array<Sybmol>] id
|
|
138
|
+
# @yield see #deprecate
|
|
139
|
+
#
|
|
140
|
+
def error(message, id: [], &block)
|
|
141
|
+
discard_or_log(:error, message, id, &block)
|
|
142
|
+
end
|
|
143
|
+
|
|
140
144
|
#
|
|
141
145
|
# Used to supply information that suggests action be taken by user
|
|
142
146
|
#
|
|
@@ -192,6 +196,15 @@ module Selenium
|
|
|
192
196
|
return if (@ignored & id).any?
|
|
193
197
|
return if @allowed.any? && (@allowed & id).none?
|
|
194
198
|
|
|
199
|
+
return if ::Logger::Severity.const_get(level.upcase) < @logger.level
|
|
200
|
+
|
|
201
|
+
unless @first_warning
|
|
202
|
+
@first_warning = true
|
|
203
|
+
info("Details on how to use and modify Selenium logger:\n", id: [:logger_info]) do
|
|
204
|
+
"https://selenium.dev/documentation/webdriver/troubleshooting/logging\n"
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
195
208
|
msg = id.empty? ? message : "[#{id.map(&:inspect).join(', ')}] #{message} "
|
|
196
209
|
msg += " #{yield}" if block_given?
|
|
197
210
|
|
|
@@ -27,19 +27,31 @@ module Selenium
|
|
|
27
27
|
# @api private
|
|
28
28
|
#
|
|
29
29
|
class SeleniumManager
|
|
30
|
-
BIN_PATH = '../../../../../bin'
|
|
31
|
-
|
|
32
30
|
class << self
|
|
31
|
+
attr_writer :bin_path
|
|
32
|
+
|
|
33
|
+
def bin_path
|
|
34
|
+
@bin_path ||= '../../../../../bin'
|
|
35
|
+
end
|
|
36
|
+
|
|
33
37
|
# @param [Options] options browser options.
|
|
34
38
|
# @return [String] the path to the correct driver.
|
|
35
39
|
def driver_path(options)
|
|
36
40
|
message = 'applicable driver not found; attempting to install with Selenium Manager (Beta)'
|
|
37
|
-
WebDriver.logger.
|
|
41
|
+
WebDriver.logger.debug(message, id: :selenium_manager)
|
|
38
42
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
command = generate_command(binary, options)
|
|
44
|
+
|
|
45
|
+
location = run(*command)
|
|
46
|
+
WebDriver.logger.debug("Driver found at #{location}", id: :selenium_manager)
|
|
47
|
+
Platform.assert_executable location
|
|
48
|
+
|
|
49
|
+
location
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
42
53
|
|
|
54
|
+
def generate_command(binary, options)
|
|
43
55
|
command = [binary, '--browser', options.browser_name, '--output', 'json']
|
|
44
56
|
if options.browser_version
|
|
45
57
|
command << '--browser-version'
|
|
@@ -49,21 +61,18 @@ module Selenium
|
|
|
49
61
|
command << '--browser-path'
|
|
50
62
|
command << options.binary.gsub('\\', '\\\\\\')
|
|
51
63
|
end
|
|
64
|
+
if options.proxy
|
|
65
|
+
command << '--proxy'
|
|
66
|
+
(command << options.proxy.ssl) || options.proxy.http
|
|
67
|
+
end
|
|
52
68
|
command << '--debug' if WebDriver.logger.debug?
|
|
53
|
-
|
|
54
|
-
location = run(*command)
|
|
55
|
-
WebDriver.logger.debug("Driver found at #{location}", id: :selenium_manager)
|
|
56
|
-
Platform.assert_executable location
|
|
57
|
-
|
|
58
|
-
location
|
|
69
|
+
command
|
|
59
70
|
end
|
|
60
71
|
|
|
61
|
-
private
|
|
62
|
-
|
|
63
72
|
# @return [String] the path to the correct selenium manager
|
|
64
73
|
def binary
|
|
65
74
|
@binary ||= begin
|
|
66
|
-
path = File.expand_path(
|
|
75
|
+
path = File.expand_path(bin_path, __FILE__)
|
|
67
76
|
path << if Platform.windows?
|
|
68
77
|
'/windows/selenium-manager.exe'
|
|
69
78
|
elsif Platform.mac?
|
|
@@ -72,11 +81,18 @@ module Selenium
|
|
|
72
81
|
'/linux/selenium-manager'
|
|
73
82
|
end
|
|
74
83
|
location = File.expand_path(path, __FILE__)
|
|
75
|
-
|
|
76
|
-
|
|
84
|
+
|
|
85
|
+
begin
|
|
86
|
+
Platform.assert_file(location)
|
|
87
|
+
Platform.assert_executable(location)
|
|
88
|
+
rescue TypeError
|
|
89
|
+
raise Error::WebDriverError,
|
|
90
|
+
"Unable to locate or obtain Selenium Manager binary; #{location} is not a valid file object"
|
|
91
|
+
rescue Error::WebDriverError => e
|
|
92
|
+
raise Error::WebDriverError, "Selenium Manager binary located, but #{e.message}"
|
|
77
93
|
end
|
|
78
94
|
|
|
79
|
-
WebDriver.logger.debug("Selenium Manager found at #{location}", id: :selenium_manager)
|
|
95
|
+
WebDriver.logger.debug("Selenium Manager binary found at #{location}", id: :selenium_manager)
|
|
80
96
|
location
|
|
81
97
|
end
|
|
82
98
|
end
|
|
@@ -89,15 +105,16 @@ module Selenium
|
|
|
89
105
|
json_output = stdout.empty? ? nil : JSON.parse(stdout)
|
|
90
106
|
result = json_output&.dig('result', 'message')
|
|
91
107
|
rescue StandardError => e
|
|
92
|
-
raise Error::WebDriverError, "Unsuccessful command executed: #{command}
|
|
108
|
+
raise Error::WebDriverError, "Unsuccessful command executed: #{command}; #{e.message}"
|
|
93
109
|
end
|
|
94
110
|
|
|
95
|
-
|
|
96
|
-
|
|
111
|
+
(json_output&.fetch('logs') || []).each do |log|
|
|
112
|
+
level = log['level'].casecmp('info').zero? ? 'debug' : log['level'].downcase
|
|
113
|
+
WebDriver.logger.send(level, log['message'], id: :selenium_manager)
|
|
97
114
|
end
|
|
98
115
|
|
|
99
|
-
|
|
100
|
-
|
|
116
|
+
if status.exitstatus.positive?
|
|
117
|
+
raise Error::WebDriverError, "Unsuccessful command executed: #{command}\n#{result}#{stderr}"
|
|
101
118
|
end
|
|
102
119
|
|
|
103
120
|
result
|
|
@@ -26,6 +26,20 @@ module Selenium
|
|
|
26
26
|
KEY = 'ms:edgeOptions'
|
|
27
27
|
BROWSER = 'MicrosoftEdge'
|
|
28
28
|
|
|
29
|
+
#
|
|
30
|
+
# Changes the browser name enable webview2
|
|
31
|
+
# see: https://learn.microsoft.com/en-us/microsoft-edge/webview2/how-to/webdriver
|
|
32
|
+
# Automation of WebView2 apps with Microsoft Edge WebDriver
|
|
33
|
+
#
|
|
34
|
+
# @example Enable webview2
|
|
35
|
+
# options = Selenium::WebDriver::Edge::Options.new
|
|
36
|
+
# options.webview2!
|
|
37
|
+
#
|
|
38
|
+
|
|
39
|
+
def webview2!
|
|
40
|
+
@options[:browser_name] = 'webview2'
|
|
41
|
+
end
|
|
42
|
+
|
|
29
43
|
private
|
|
30
44
|
|
|
31
45
|
def enable_logging(browser_options)
|
|
@@ -24,6 +24,16 @@ module Selenium
|
|
|
24
24
|
DEFAULT_PORT = 7050
|
|
25
25
|
EXECUTABLE = 'safaridriver'
|
|
26
26
|
SHUTDOWN_SUPPORTED = false
|
|
27
|
+
|
|
28
|
+
def initialize(path: nil, port: nil, log: nil, args: nil)
|
|
29
|
+
raise Error::WebDriverError, 'Safari Service does not support setting log output' if log
|
|
30
|
+
|
|
31
|
+
super
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def log=(*)
|
|
35
|
+
raise Error::WebDriverError, 'Safari Service does not support setting log output'
|
|
36
|
+
end
|
|
27
37
|
end # Service
|
|
28
38
|
end # Safari
|
|
29
39
|
end # WebDriver
|
data/selenium-webdriver.gemspec
CHANGED
|
@@ -54,6 +54,7 @@ Gem::Specification.new do |s|
|
|
|
54
54
|
s.add_runtime_dependency 'websocket', ['~> 1.0']
|
|
55
55
|
|
|
56
56
|
s.add_development_dependency 'rack', ['~> 2.0']
|
|
57
|
+
s.add_development_dependency 'rake', ['~> 13.0']
|
|
57
58
|
s.add_development_dependency 'rspec', ['~> 3.0']
|
|
58
59
|
s.add_development_dependency 'rubocop', ['~> 1.42']
|
|
59
60
|
s.add_development_dependency 'rubocop-performance', ['~> 1.15']
|
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.10.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-06-07 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: rexml
|
|
@@ -80,6 +80,20 @@ dependencies:
|
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '2.0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rake
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '13.0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '13.0'
|
|
83
97
|
- !ruby/object:Gem::Dependency
|
|
84
98
|
name: rspec
|
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|