selenium-webdriver 4.19.0 → 4.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +14 -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 +2 -2
- data/lib/selenium/webdriver/common/driver_finder.rb +59 -14
- data/lib/selenium/webdriver/common/local_driver.rb +8 -1
- data/lib/selenium/webdriver/common/platform.rb +3 -1
- data/lib/selenium/webdriver/common/selenium_manager.rb +36 -73
- data/lib/selenium/webdriver/common/service.rb +1 -1
- data/lib/selenium/webdriver/devtools/network_interceptor.rb +1 -1
- data/lib/selenium/webdriver/version.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: c32a4152c7c47427939aba71e601004ee0cd8ad0c2454b00b879d0bd84f01a5e
|
4
|
+
data.tar.gz: d7cf6a825f70df0366b290da8e7fbf36417bcabe055f1835eca9402b6c37c791
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f121cc65df3f7174419ab881de0f8283e2bbb22698aa7582f019b1a2e3f7aae04376d0be02507ffbc968fe95512c97fb121515a16a9ff62b845a23e939005f7
|
7
|
+
data.tar.gz: f0b0dfba817532e5cd9ab1ab0874463823434dcdac0f15efe199d400a53539343cdcaafdecf766596dc36cbc52c6e0454784a44fc748c21e6dc380d279bb29e4
|
data/CHANGES
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
4.20.1 (2024-04-25)
|
2
|
+
=========================
|
3
|
+
|
4
|
+
* Returned accidentally removed DriverFinder.path and deprecated it.
|
5
|
+
|
6
|
+
4.20.0 (2024-04-24)
|
7
|
+
=========================
|
8
|
+
|
9
|
+
* Add CDP for Chrome 124 and remove 121
|
10
|
+
* Making Selenium Manager a thin wrapper (#13386)
|
11
|
+
* This change has been made to make it easier to maintain and improve, the interface has
|
12
|
+
changed and if users were invoking it, they might experience issues. Selenium Manager is
|
13
|
+
still in beta and these type of changes are expected.
|
14
|
+
|
1
15
|
4.19.0 (2024-03-27)
|
2
16
|
=========================
|
3
17
|
|
data/bin/linux/selenium-manager
CHANGED
Binary file
|
data/bin/macos/selenium-manager
CHANGED
Binary file
|
Binary file
|
@@ -105,8 +105,8 @@ function gd(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4
|
|
105
105
|
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," ")}
|
106
106
|
function ld(a,b,c){if(S(a,"BR"))b.push("");else{var d=S(a,"TD"),e=U(a,"display"),f=!d&&!(0<=oa(md,e)),g=void 0!==a.previousElementSibling?a.previousElementSibling:gb(a.previousSibling);g=g?U(g,"display"):"";var h=U(a,"float")||U(a,"cssFloat")||U(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=U(a,"white-space"),p=U(a,"text-transform"));l(a.childNodes,function(G){c(G,b,n,u,p)});a=b[b.length-1]||"";!d&&"table-cell"!=e||!a||
|
107
107
|
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(" ");
|
108
|
-
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:/(
|
109
|
-
|
108
|
+
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:/(^|\s|\b)(\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(" ",0)&&(a=a.substr(1));
|
109
|
+
b.push(c+a)}function dd(a){if(Mc){if("relative"==U(a,"position"))return 1;a=U(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=U(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
|
110
110
|
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?(f=S(a,"CONTENT")?a.getDistributedNodes():a.assignedNodes(),l(0<f.length?f:a.childNodes,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)}
|
111
111
|
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,
|
112
112
|
"\\$1")}};var X={},rd={};X.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})};X.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})};X.o=function(a,b){return X.N(a,b,!1)};X.j=function(a,b){return X.K(a,b,!1)};rd.o=function(a,b){return X.N(a,b,!0)};
|
@@ -20,25 +20,70 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
class DriverFinder
|
23
|
-
def self.path(options,
|
24
|
-
path
|
25
|
-
|
23
|
+
def self.path(options, service_class)
|
24
|
+
WebDriver.logger.deprecate('DriverFinder.path(options, service_class)',
|
25
|
+
'DriverFinder.new(options, service).driver_path')
|
26
|
+
new(options, service_class.new).driver_path
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(options, service)
|
30
|
+
@options = options
|
31
|
+
@service = service
|
32
|
+
end
|
33
|
+
|
34
|
+
def browser_path
|
35
|
+
paths[:browser_path]
|
36
|
+
end
|
37
|
+
|
38
|
+
def driver_path
|
39
|
+
paths[:driver_path]
|
40
|
+
end
|
26
41
|
|
27
|
-
|
28
|
-
|
42
|
+
def browser_path?
|
43
|
+
!browser_path.nil? && !browser_path.empty?
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def paths
|
49
|
+
@paths ||= begin
|
50
|
+
path = @service.class.driver_path
|
51
|
+
path = path.call if path.is_a?(Proc)
|
52
|
+
exe = @service.class::EXECUTABLE
|
53
|
+
if path
|
54
|
+
WebDriver.logger.debug("Skipping Selenium Manager; path to #{exe} specified in service class: #{path}")
|
55
|
+
Platform.assert_executable(path)
|
56
|
+
{driver_path: path}
|
57
|
+
else
|
58
|
+
output = SeleniumManager.binary_paths(*to_args)
|
59
|
+
formatted = {driver_path: Platform.cygwin_path(output['driver_path'], only_cygwin: true),
|
60
|
+
browser_path: Platform.cygwin_path(output['browser_path'], only_cygwin: true)}
|
61
|
+
Platform.assert_executable(formatted[:driver_path])
|
62
|
+
Platform.assert_executable(formatted[:browser_path])
|
63
|
+
formatted
|
64
|
+
end
|
29
65
|
rescue StandardError => e
|
30
|
-
|
66
|
+
WebDriver.logger.error("Exception occurred: #{e.message}")
|
67
|
+
WebDriver.logger.error("Backtrace:\n\t#{e.backtrace&.join("\n\t")}")
|
68
|
+
raise Error::NoSuchDriverError, "Unable to obtain #{exe}"
|
31
69
|
end
|
70
|
+
end
|
32
71
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
raise Error::NoSuchDriverError, "#{klass::EXECUTABLE} located, but: #{e.message}"
|
72
|
+
def to_args
|
73
|
+
args = ['--browser', @options.browser_name]
|
74
|
+
if @options.browser_version
|
75
|
+
args << '--browser-version'
|
76
|
+
args << @options.browser_version
|
39
77
|
end
|
40
|
-
|
41
|
-
|
78
|
+
if @options.respond_to?(:binary) && !@options.binary.nil?
|
79
|
+
args << '--browser-path'
|
80
|
+
args << @options.binary.gsub('\\', '\\\\\\')
|
81
|
+
end
|
82
|
+
if @options.proxy
|
83
|
+
args << '--proxy'
|
84
|
+
args << (@options.proxy.ssl || @options.proxy.http)
|
85
|
+
end
|
86
|
+
args
|
42
87
|
end
|
43
88
|
end
|
44
89
|
end
|
@@ -38,7 +38,14 @@ module Selenium
|
|
38
38
|
raise ArgumentError, ":options must be an instance of #{default_options.class}"
|
39
39
|
end
|
40
40
|
|
41
|
-
service.executable_path ||=
|
41
|
+
service.executable_path ||= begin
|
42
|
+
finder = WebDriver::DriverFinder.new(options, service)
|
43
|
+
if options.respond_to?(:binary) && finder.browser_path?
|
44
|
+
options.binary = finder.browser_path
|
45
|
+
options.browser_version = nil
|
46
|
+
end
|
47
|
+
finder.driver_path
|
48
|
+
end
|
42
49
|
options.as_json
|
43
50
|
end
|
44
51
|
end
|
@@ -111,7 +111,9 @@ module Selenium
|
|
111
111
|
windows? && !cygwin? ? %("#{str}") : str
|
112
112
|
end
|
113
113
|
|
114
|
-
def cygwin_path(path, **opts)
|
114
|
+
def cygwin_path(path, only_cygwin: false, **opts)
|
115
|
+
return path if only_cygwin && !cygwin?
|
116
|
+
|
115
117
|
flags = []
|
116
118
|
opts.each { |k, v| flags << "--#{k}" if v }
|
117
119
|
|
@@ -34,88 +34,33 @@ module Selenium
|
|
34
34
|
@bin_path ||= '../../../../../bin'
|
35
35
|
end
|
36
36
|
|
37
|
-
# @param [
|
38
|
-
# @return [
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
driver_path = Platform.cygwin? ? Platform.cygwin_path(output['driver_path']) : output['driver_path']
|
46
|
-
Platform.assert_executable driver_path
|
47
|
-
|
48
|
-
if options.respond_to?(:binary) && browser_path && !browser_path.empty?
|
49
|
-
options.binary = browser_path
|
50
|
-
options.browser_version = nil
|
51
|
-
end
|
52
|
-
|
53
|
-
driver_path
|
37
|
+
# @param [Array] arguments what gets sent to to Selenium Manager binary.
|
38
|
+
# @return [Hash] paths to the requested assets.
|
39
|
+
def binary_paths(*arguments)
|
40
|
+
arguments += %w[--language-binding ruby]
|
41
|
+
arguments += %w[--output json]
|
42
|
+
arguments << '--debug' if WebDriver.logger.debug?
|
43
|
+
|
44
|
+
run(binary, *arguments)
|
54
45
|
end
|
55
46
|
|
56
47
|
private
|
57
48
|
|
58
|
-
def generate_command(binary, options)
|
59
|
-
command = [binary, '--browser', options.browser_name]
|
60
|
-
if options.browser_version
|
61
|
-
command << '--browser-version'
|
62
|
-
command << options.browser_version
|
63
|
-
end
|
64
|
-
if options.respond_to?(:binary) && !options.binary.nil?
|
65
|
-
command << '--browser-path'
|
66
|
-
command << options.binary.squeeze('\\').gsub('\\', '\\\\\\')
|
67
|
-
end
|
68
|
-
if options.proxy
|
69
|
-
command << '--proxy'
|
70
|
-
command << (options.proxy.ssl || options.proxy.http)
|
71
|
-
end
|
72
|
-
command
|
73
|
-
end
|
74
|
-
|
75
49
|
# @return [String] the path to the correct selenium manager
|
76
50
|
def binary
|
77
51
|
@binary ||= begin
|
78
|
-
location = ENV.fetch('SE_MANAGER_PATH',
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
elsif Platform.mac?
|
83
|
-
"#{directory}/macos/selenium-manager"
|
84
|
-
elsif Platform.linux?
|
85
|
-
"#{directory}/linux/selenium-manager"
|
86
|
-
elsif Platform.unix?
|
87
|
-
WebDriver.logger.warn('Selenium Manager binary may not be compatible with Unix; verify settings',
|
88
|
-
id: %i[selenium_manager unix_binary])
|
89
|
-
"#{directory}/linux/selenium-manager"
|
90
|
-
end
|
91
|
-
rescue Error::WebDriverError => e
|
92
|
-
raise Error::WebDriverError, "Unable to obtain Selenium Manager binary for #{e.message}"
|
93
|
-
end)
|
52
|
+
if (location = ENV.fetch('SE_MANAGER_PATH', nil))
|
53
|
+
WebDriver.logger.debug("Selenium Manager set by ENV['SE_MANAGER_PATH']: #{location}")
|
54
|
+
end
|
55
|
+
location ||= platform_location
|
94
56
|
|
95
|
-
validate_location(location)
|
96
|
-
location
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def validate_location(location)
|
101
|
-
begin
|
102
|
-
Platform.assert_file(location)
|
103
57
|
Platform.assert_executable(location)
|
104
|
-
|
105
|
-
|
106
|
-
"Unable to locate or obtain Selenium Manager binary; #{location} is not a valid file object"
|
107
|
-
rescue Error::WebDriverError => e
|
108
|
-
raise Error::WebDriverError, "Selenium Manager binary located, but #{e.message}"
|
58
|
+
WebDriver.logger.debug("Selenium Manager binary found at #{location}", id: :selenium_manager)
|
59
|
+
location
|
109
60
|
end
|
110
|
-
|
111
|
-
WebDriver.logger.debug("Selenium Manager binary found at #{location}", id: :selenium_manager)
|
112
61
|
end
|
113
62
|
|
114
63
|
def run(*command)
|
115
|
-
command += %w[--language-binding ruby]
|
116
|
-
command += %w[--output json]
|
117
|
-
command << '--debug' if WebDriver.logger.debug?
|
118
|
-
|
119
64
|
WebDriver.logger.debug("Executing Process #{command}", id: :selenium_manager)
|
120
65
|
|
121
66
|
begin
|
@@ -124,16 +69,34 @@ module Selenium
|
|
124
69
|
raise Error::WebDriverError, "Unsuccessful command executed: #{command}; #{e.message}"
|
125
70
|
end
|
126
71
|
|
127
|
-
json_output = stdout.empty? ? {} : JSON.parse(stdout)
|
128
|
-
|
72
|
+
json_output = stdout.empty? ? {'logs' => [], 'result' => {}} : JSON.parse(stdout)
|
73
|
+
json_output['logs'].each do |log|
|
129
74
|
level = log['level'].casecmp('info').zero? ? 'debug' : log['level'].downcase
|
130
75
|
WebDriver.logger.send(level, log['message'], id: :selenium_manager)
|
131
76
|
end
|
132
77
|
|
133
78
|
result = json_output['result']
|
134
|
-
return result unless status.exitstatus.positive?
|
79
|
+
return result unless status.exitstatus.positive? || result.nil?
|
135
80
|
|
136
|
-
raise Error::WebDriverError,
|
81
|
+
raise Error::WebDriverError,
|
82
|
+
"Unsuccessful command executed: #{command} - Code #{status.exitstatus}\n#{result}\n#{stderr}"
|
83
|
+
end
|
84
|
+
|
85
|
+
def platform_location
|
86
|
+
directory = File.expand_path(bin_path, __FILE__)
|
87
|
+
if Platform.windows?
|
88
|
+
"#{directory}/windows/selenium-manager.exe"
|
89
|
+
elsif Platform.mac?
|
90
|
+
"#{directory}/macos/selenium-manager"
|
91
|
+
elsif Platform.linux?
|
92
|
+
"#{directory}/linux/selenium-manager"
|
93
|
+
elsif Platform.unix?
|
94
|
+
WebDriver.logger.warn('Selenium Manager binary may not be compatible with Unix',
|
95
|
+
id: %i[selenium_manager unix_binary])
|
96
|
+
"#{directory}/linux/selenium-manager"
|
97
|
+
else
|
98
|
+
raise Error::WebDriverError, "unsupported platform: #{Platform.os}"
|
99
|
+
end
|
137
100
|
end
|
138
101
|
end
|
139
102
|
end # SeleniumManager
|
@@ -89,7 +89,7 @@ module Selenium
|
|
89
89
|
def launch
|
90
90
|
@executable_path ||= begin
|
91
91
|
default_options = WebDriver.const_get("#{self.class.name&.split('::')&.[](2)}::Options").new
|
92
|
-
DriverFinder.
|
92
|
+
DriverFinder.new(default_options, self).driver_path
|
93
93
|
end
|
94
94
|
ServiceManager.new(self).tap(&:start)
|
95
95
|
end
|
@@ -98,7 +98,7 @@ module Selenium
|
|
98
98
|
original = DevTools::Request.from(id, params)
|
99
99
|
mutable = DevTools::Request.from(id, params)
|
100
100
|
|
101
|
-
block.call(mutable) do |&continue|
|
101
|
+
block.call(mutable) do |&continue|
|
102
102
|
pending_response_requests[id] = continue
|
103
103
|
|
104
104
|
if original == mutable
|
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.20.1
|
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: 2024-
|
13
|
+
date: 2024-04-26 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: base64
|