webdrivers 4.6.0 → 5.3.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/CHANGELOG.md +28 -0
- data/LICENSE.txt +2 -2
- data/README.md +25 -1
- data/lib/webdrivers/chrome_finder.rb +13 -3
- data/lib/webdrivers/chromedriver.rb +51 -28
- data/lib/webdrivers/common.rb +7 -11
- data/lib/webdrivers/edge_finder.rb +11 -12
- data/lib/webdrivers/edgedriver.rb +5 -20
- data/lib/webdrivers/geckodriver.rb +2 -23
- data/lib/webdrivers/iedriver.rb +11 -20
- data/lib/webdrivers/logger.rb +2 -93
- data/lib/webdrivers/railtie.rb +0 -1
- data/lib/webdrivers/system.rb +13 -2
- data/lib/webdrivers/version.rb +1 -1
- data/spec/webdrivers/chromedriver_spec.rb +78 -7
- data/spec/webdrivers/edge_finder_spec.rb +1 -5
- data/spec/webdrivers/edgedriver_spec.rb +13 -16
- data/spec/webdrivers/geckodriver_spec.rb +41 -9
- data/spec/webdrivers/i_edriver_spec.rb +12 -9
- data/spec/webdrivers/webdrivers_spec.rb +15 -21
- metadata +19 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ea3a67076ea1a3e77e954a92642eed78d0bbcc041dfa0715ff08f911b20e2577
|
|
4
|
+
data.tar.gz: 0bc4ae97ff8d252e5201b79aa24f58d29e1e965948bc4f63bd1923cf84d0accd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c6c95c4b5cc8f198f1df0715574bcf76018e976a311c51e498ef9e3b56277e1a9e45b6255ce721a22e415d546fdef1dcd2b02e864553bdbb1290a06ff3ad8264
|
|
7
|
+
data.tar.gz: d3a8876c9ee4cbe31552946e870775a9fd0aa833db5c9a8843a56ecfd85bbc92d285b9f4237de365fb8bcb1fe837afee6633c9937010442e5c6e47759899645b
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
# 5.3.0 (2023-07-31)
|
|
2
|
+
* Add support for Chrome for Testing drivers ([#237](https://github.com/titusfortner/webdrivers/issues/249), thanks sadahiro-ono)
|
|
3
|
+
* Support is restricted to Selenium 4.0 - 4.10 to encourage people to update to Selenium 4.11
|
|
4
|
+
|
|
5
|
+
# 5.2.0 (2022-09-29)
|
|
6
|
+
* `chromedriver` - Fix downloading on M1 macs from version 106.0.5249.61 ([#237](https://github.com/titusfortner/webdrivers/issues/237), thanks jmccure)
|
|
7
|
+
|
|
8
|
+
# 5.1.0 (2022-09-19)
|
|
9
|
+
* Improve error messages (#232, thanks dan-jensen)
|
|
10
|
+
* Fix circular require bug with railtie (#233, thanks amatsuda)
|
|
11
|
+
* Support downloading correct geckodriver on Apple silicon (#234 thanks stephannv)
|
|
12
|
+
* Update linux locations for Chrome to latest chromedriver finder (thanks entretechno-jeremiah)
|
|
13
|
+
* Add support for Microsoft Edge on Linux (#236)
|
|
14
|
+
|
|
15
|
+
# 5.0.0 (2021-10-19)
|
|
16
|
+
* Require Selenium 4+
|
|
17
|
+
* Remove custom Logger and use the one in Selenium 4
|
|
18
|
+
|
|
19
|
+
# 4.7.0 (2021-10-14)
|
|
20
|
+
* Add support for Selenium 4.x #218 (thanks yahonda )
|
|
21
|
+
* Allow Edge on Linux
|
|
22
|
+
* Update required Selenium > 3.141 because of a change in 4.6
|
|
23
|
+
* Require Ruby 2.6+
|
|
24
|
+
* Fix IE downloads with the change in location of assets
|
|
25
|
+
|
|
26
|
+
# 4.6.1 (2021-08-19)
|
|
27
|
+
* Fix bug in IEdriver caused by bad formatting in recent release
|
|
28
|
+
|
|
1
29
|
# 4.6.0 (2021-02-26)
|
|
2
30
|
* Update `Edgedriver` naming to support Selenium 4 beta (([#206](https://github.com/titusfortner/webdrivers/pull/206))
|
|
3
31
|
|
data/LICENSE.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
(The MIT License)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2017-
|
|
4
|
-
Copyright (c) 2019: Lakshya Kapoor, Thomas Walpole
|
|
3
|
+
Copyright (c) 2017-2023: Titus Fortner
|
|
4
|
+
Copyright (c) 2019-2023: Lakshya Kapoor, Thomas Walpole
|
|
5
5
|
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining
|
|
7
7
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
|
@@ -5,6 +5,30 @@
|
|
|
5
5
|
|
|
6
6
|
Run Selenium tests more easily with automatic installation and updates for all supported webdrivers.
|
|
7
7
|
|
|
8
|
+
## Update: Future of this Project
|
|
9
|
+
|
|
10
|
+
With Google's new [Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing/) project,
|
|
11
|
+
and Selenium's new [Selenium Manager](https://www.selenium.dev/documentation/selenium_manager/) feature,
|
|
12
|
+
what is required of this gem has changed.
|
|
13
|
+
|
|
14
|
+
If you can update to to the latest version of Selenium (4.11+), please do so and stop requiring this gem.
|
|
15
|
+
Provide feedback or raise issues to [Selenium Project](https://github.com/SeleniumHQ/selenium/issues/new/choose)
|
|
16
|
+
|
|
17
|
+
If you cannot upgrade to Selenium 4.11, Webdrivers 5.3.0 will continue to support Ruby 2.6+ and Selenium 4.0 - 4.10
|
|
18
|
+
|
|
19
|
+
If you are using an older version of webdrivers gem, and cannot upgrade, you can set
|
|
20
|
+
the required version of chromedriver to v114 (`Webdrivers.required_version = '114.0.5735.90'`) and
|
|
21
|
+
[Disable the build check](https://www.selenium.dev/documentation/webdriver/browsers/chrome/#disabling-build-check).
|
|
22
|
+
This is not guaranteed to continue working and will not receive bug fixes.
|
|
23
|
+
|
|
24
|
+
**Webdrivers 6.0**
|
|
25
|
+
To provide support for Selenium 3 and Ruby < 2.6 a 6.0 version is planned. It requires:
|
|
26
|
+
* Creating a `selenium-manager.gem` based off of https://github.com/SeleniumHQ/selenium/pull/12429
|
|
27
|
+
* Re-implementing this gem to wrap `selenium-manager.gem`
|
|
28
|
+
* Ensuring compatible with older versions of Selenium & Ruby
|
|
29
|
+
|
|
30
|
+
If anyone would like to help get Webdrivers 6 working, please let us know.
|
|
31
|
+
|
|
8
32
|
## Description
|
|
9
33
|
|
|
10
34
|
`webdrivers` downloads drivers and directs Selenium to use them. Currently supports:
|
|
@@ -22,7 +46,7 @@ notes at the bottom.
|
|
|
22
46
|
In your Gemfile:
|
|
23
47
|
|
|
24
48
|
```ruby
|
|
25
|
-
gem 'webdrivers', '~>
|
|
49
|
+
gem 'webdrivers', '~> 5.0', require: false
|
|
26
50
|
```
|
|
27
51
|
|
|
28
52
|
In your project:
|
|
@@ -8,7 +8,7 @@ module Webdrivers
|
|
|
8
8
|
class << self
|
|
9
9
|
def version
|
|
10
10
|
version = send("#{System.platform}_version", location)
|
|
11
|
-
raise VersionError, 'Failed to
|
|
11
|
+
raise VersionError, 'Failed to determine Chrome version.' if version.nil? || version.empty?
|
|
12
12
|
|
|
13
13
|
Webdrivers.logger.debug "Browser version: #{version}"
|
|
14
14
|
version[/\d+\.\d+\.\d+\.\d+/] # Google Chrome 73.0.3683.75 -> 73.0.3683.75
|
|
@@ -18,7 +18,7 @@ module Webdrivers
|
|
|
18
18
|
chrome_bin = user_defined_location || send("#{System.platform}_location")
|
|
19
19
|
return chrome_bin unless chrome_bin.nil?
|
|
20
20
|
|
|
21
|
-
raise BrowserNotFound, 'Failed to
|
|
21
|
+
raise BrowserNotFound, 'Failed to determine Chrome binary location.'
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
private
|
|
@@ -90,7 +90,17 @@ module Webdrivers
|
|
|
90
90
|
def linux_location
|
|
91
91
|
return wsl_location if System.wsl_v1?
|
|
92
92
|
|
|
93
|
-
directories = %w[
|
|
93
|
+
directories = %w[
|
|
94
|
+
/usr/local/sbin
|
|
95
|
+
/usr/local/bin
|
|
96
|
+
/usr/sbin
|
|
97
|
+
/usr/bin
|
|
98
|
+
/sbin
|
|
99
|
+
/bin
|
|
100
|
+
/snap/bin
|
|
101
|
+
/opt/google/chrome
|
|
102
|
+
/opt/chromium.org/chromium
|
|
103
|
+
]
|
|
94
104
|
files = %w[google-chrome chrome chromium chromium-browser]
|
|
95
105
|
|
|
96
106
|
directories.each do |dir|
|
|
@@ -63,7 +63,11 @@ module Webdrivers
|
|
|
63
63
|
private
|
|
64
64
|
|
|
65
65
|
def latest_point_release(version)
|
|
66
|
-
normalize_version(
|
|
66
|
+
if version < normalize_version('115')
|
|
67
|
+
return normalize_version(Network.get(URI.join(base_url, "LATEST_RELEASE_#{version}")))
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
latest_patch_version(version)
|
|
67
71
|
rescue NetworkError
|
|
68
72
|
msg = "Unable to find latest point release version for #{version}."
|
|
69
73
|
msg = begin
|
|
@@ -78,7 +82,7 @@ module Webdrivers
|
|
|
78
82
|
end
|
|
79
83
|
|
|
80
84
|
msg = "#{msg} Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` "\
|
|
81
|
-
|
|
85
|
+
'to a known chromedriver version: https://chromedriver.chromium.org/downloads/version-selection'
|
|
82
86
|
Webdrivers.logger.debug msg
|
|
83
87
|
raise VersionError, msg
|
|
84
88
|
end
|
|
@@ -97,18 +101,23 @@ module Webdrivers
|
|
|
97
101
|
false
|
|
98
102
|
end
|
|
99
103
|
|
|
100
|
-
def
|
|
101
|
-
|
|
104
|
+
def apple_filename(driver_version)
|
|
105
|
+
unless apple_m1_compatible?(driver_version)
|
|
106
|
+
return driver_version >= normalize_version('115') ? 'mac-x64' : 'mac64'
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
if driver_version < normalize_version('106.0.5249.61')
|
|
110
|
+
'mac64_m1'
|
|
111
|
+
elsif driver_version < normalize_version('115')
|
|
112
|
+
'mac_arm64'
|
|
113
|
+
else
|
|
114
|
+
'mac-arm64'
|
|
115
|
+
end
|
|
116
|
+
end
|
|
102
117
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
normalize_version(required_version)
|
|
107
|
-
end
|
|
108
|
-
filename = driver_filename(driver_version)
|
|
109
|
-
url = "#{base_url}/#{driver_version}/chromedriver_#{filename}.zip"
|
|
110
|
-
Webdrivers.logger.debug "chromedriver URL: #{url}"
|
|
111
|
-
@download_url = url
|
|
118
|
+
def direct_url(driver_version)
|
|
119
|
+
direct_url_from_api(driver_version) ||
|
|
120
|
+
"#{base_url}/#{driver_version}/chromedriver_#{driver_filename(driver_version)}.zip"
|
|
112
121
|
end
|
|
113
122
|
|
|
114
123
|
def driver_filename(driver_version)
|
|
@@ -117,8 +126,7 @@ module Webdrivers
|
|
|
117
126
|
elsif System.platform == 'linux'
|
|
118
127
|
'linux64'
|
|
119
128
|
elsif System.platform == 'mac'
|
|
120
|
-
|
|
121
|
-
"mac64#{apple_arch}"
|
|
129
|
+
apple_filename(driver_version)
|
|
122
130
|
else
|
|
123
131
|
raise 'Failed to determine driver filename to download for your OS.'
|
|
124
132
|
end
|
|
@@ -144,6 +152,7 @@ module Webdrivers
|
|
|
144
152
|
def browser_build_version
|
|
145
153
|
normalize_version(browser_version.segments[0..2].join('.'))
|
|
146
154
|
end
|
|
155
|
+
|
|
147
156
|
alias chrome_build_version browser_build_version
|
|
148
157
|
|
|
149
158
|
# Returns true if an executable driver binary exists
|
|
@@ -152,21 +161,35 @@ module Webdrivers
|
|
|
152
161
|
super && current_version && (current_version < normalize_version('70.0.3538') ||
|
|
153
162
|
current_build_version == browser_build_version)
|
|
154
163
|
end
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
164
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
def chrome_for_testing_base_url
|
|
166
|
+
'https://googlechromelabs.github.io/chrome-for-testing/'
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def latest_patch_version(driver_version)
|
|
170
|
+
latest_patch_version = URI.join(chrome_for_testing_base_url, 'latest-patch-versions-per-build.json')
|
|
171
|
+
.then { |url| Network.get(url) }
|
|
172
|
+
.then { |res| JSON.parse(res, symbolize_names: true) }
|
|
173
|
+
.then { |json| json.dig(:builds, :"#{driver_version}", :version) }
|
|
174
|
+
.then { |version| version ? normalize_version(version) : nil }
|
|
175
|
+
raise NetworkError unless latest_patch_version
|
|
176
|
+
|
|
177
|
+
latest_patch_version
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def direct_url_from_api(driver_version)
|
|
181
|
+
return if normalize_version(driver_version) < normalize_version('115')
|
|
182
|
+
|
|
183
|
+
URI.join(chrome_for_testing_base_url, 'known-good-versions-with-downloads.json')
|
|
184
|
+
.then { |url| Network.get(url) }
|
|
185
|
+
.then { |res| JSON.parse(res, symbolize_names: true) }
|
|
186
|
+
.then { |json| json[:versions].find { |e| e[:version] == driver_version.to_s } }
|
|
187
|
+
.then { |json| json.dig(:downloads, :chromedriver) }
|
|
188
|
+
.then { |json| json.find { |e| e[:platform] == driver_filename(driver_version) } }
|
|
189
|
+
.then { |json| json&.dig(:url) }
|
|
169
190
|
end
|
|
170
191
|
end
|
|
171
192
|
end
|
|
172
193
|
end
|
|
194
|
+
|
|
195
|
+
::Selenium::WebDriver::Chrome::Service.driver_path = proc { ::Webdrivers::Chromedriver.update }
|
data/lib/webdrivers/common.rb
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'rubygems/package'
|
|
4
|
-
require 'webdrivers/logger'
|
|
5
4
|
require 'webdrivers/network'
|
|
6
5
|
require 'webdrivers/system'
|
|
7
6
|
require 'selenium-webdriver'
|
|
7
|
+
require 'webdrivers/logger'
|
|
8
8
|
require 'webdrivers/version'
|
|
9
9
|
|
|
10
10
|
module Webdrivers
|
|
@@ -118,12 +118,12 @@ module Webdrivers
|
|
|
118
118
|
|
|
119
119
|
private
|
|
120
120
|
|
|
121
|
+
def download_version
|
|
122
|
+
required_version == EMPTY_VERSION ? latest_version : required_version
|
|
123
|
+
end
|
|
124
|
+
|
|
121
125
|
def download_url
|
|
122
|
-
@download_url ||=
|
|
123
|
-
downloads[downloads.keys.max]
|
|
124
|
-
else
|
|
125
|
-
downloads[normalize_version(required_version)]
|
|
126
|
-
end
|
|
126
|
+
@download_url ||= direct_url(download_version).tap { |url| Webdrivers.logger.debug "#{file_name} URL: #{url}" }
|
|
127
127
|
end
|
|
128
128
|
|
|
129
129
|
def exists?
|
|
@@ -131,11 +131,7 @@ module Webdrivers
|
|
|
131
131
|
end
|
|
132
132
|
|
|
133
133
|
def correct_binary?
|
|
134
|
-
current_version ==
|
|
135
|
-
latest_version
|
|
136
|
-
else
|
|
137
|
-
normalize_version(required_version)
|
|
138
|
-
end
|
|
134
|
+
current_version == download_version
|
|
139
135
|
rescue ConnectionError, VersionError
|
|
140
136
|
driver_path if sufficient_binary?
|
|
141
137
|
end
|
|
@@ -69,18 +69,17 @@ module Webdrivers
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def linux_location
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
raise 'Default location not yet known'
|
|
72
|
+
directories = %w[/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /snap/bin /opt/microsoft/edge]
|
|
73
|
+
files = %w[microsoft-edge microsoft-edge-beta microsoft-edge-dev]
|
|
74
|
+
|
|
75
|
+
directories.each do |dir|
|
|
76
|
+
files.each do |file|
|
|
77
|
+
option = "#{dir}/#{file}"
|
|
78
|
+
return option if File.exist?(option)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
nil
|
|
84
83
|
end
|
|
85
84
|
|
|
86
85
|
def win_version(location)
|
|
@@ -22,8 +22,7 @@ module Webdrivers
|
|
|
22
22
|
#
|
|
23
23
|
# @return [String]
|
|
24
24
|
def base_url
|
|
25
|
-
|
|
26
|
-
'https://msedgedriver.azureedge.net/'
|
|
25
|
+
'https://msedgedriver.azureedge.net'
|
|
27
26
|
end
|
|
28
27
|
|
|
29
28
|
private
|
|
@@ -76,15 +75,11 @@ module Webdrivers
|
|
|
76
75
|
false
|
|
77
76
|
end
|
|
78
77
|
|
|
79
|
-
# def linux_compatible?(driver_version)
|
|
80
|
-
# System.platform == 'linux' && driver_version >= normalize_version('89.0.731.0')
|
|
81
|
-
# end
|
|
82
|
-
|
|
83
78
|
def driver_filename(driver_version)
|
|
84
79
|
if System.platform == 'win' || System.wsl_v1?
|
|
85
80
|
"win#{System.bitsize}" # 32 or 64-bit
|
|
86
|
-
|
|
87
|
-
|
|
81
|
+
elsif System.platform == 'linux'
|
|
82
|
+
'linux64'
|
|
88
83
|
elsif System.platform == 'mac'
|
|
89
84
|
# Determine M1 or Intel architecture
|
|
90
85
|
apple_arch = apple_m1_compatible?(driver_version) ? 'arm' : 'mac'
|
|
@@ -94,18 +89,8 @@ module Webdrivers
|
|
|
94
89
|
end
|
|
95
90
|
end
|
|
96
91
|
|
|
97
|
-
def
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
driver_version = if required_version == EMPTY_VERSION
|
|
101
|
-
latest_version
|
|
102
|
-
else
|
|
103
|
-
normalize_version(required_version)
|
|
104
|
-
end
|
|
105
|
-
filename = driver_filename(driver_version)
|
|
106
|
-
url = "#{base_url}/#{driver_version}/edgedriver_#{filename}.zip"
|
|
107
|
-
Webdrivers.logger.debug "msedgedriver URL: #{url}"
|
|
108
|
-
@download_url = url
|
|
92
|
+
def direct_url(driver_version)
|
|
93
|
+
"#{base_url}/#{driver_version}/edgedriver_#{driver_filename(driver_version)}.zip"
|
|
109
94
|
end
|
|
110
95
|
end
|
|
111
96
|
end
|
|
@@ -42,14 +42,6 @@ module Webdrivers
|
|
|
42
42
|
System.platform == 'win' ? 'geckodriver.exe' : 'geckodriver'
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
def download_url
|
|
46
|
-
@download_url ||= if required_version == EMPTY_VERSION
|
|
47
|
-
direct_url(latest_version)
|
|
48
|
-
else
|
|
49
|
-
direct_url(required_version)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
45
|
def direct_url(version)
|
|
54
46
|
"#{base_url}/download/v#{version}/geckodriver-v#{version}-#{platform_ext}"
|
|
55
47
|
end
|
|
@@ -59,7 +51,7 @@ module Webdrivers
|
|
|
59
51
|
when 'linux'
|
|
60
52
|
"linux#{System.bitsize}.tar.gz"
|
|
61
53
|
when 'mac'
|
|
62
|
-
'macos.tar.gz'
|
|
54
|
+
System.apple_m1_architecture? ? 'macos-aarch64.tar.gz' : 'macos.tar.gz'
|
|
63
55
|
when 'win'
|
|
64
56
|
"win#{System.bitsize}.zip"
|
|
65
57
|
end
|
|
@@ -68,17 +60,4 @@ module Webdrivers
|
|
|
68
60
|
end
|
|
69
61
|
end
|
|
70
62
|
|
|
71
|
-
|
|
72
|
-
::Selenium::WebDriver::Firefox::Service.driver_path = proc { ::Webdrivers::Geckodriver.update }
|
|
73
|
-
else
|
|
74
|
-
# v3.141.0 and lower
|
|
75
|
-
module Selenium
|
|
76
|
-
module WebDriver
|
|
77
|
-
module Firefox
|
|
78
|
-
def self.driver_path
|
|
79
|
-
@driver_path ||= Webdrivers::Geckodriver.update
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
63
|
+
::Selenium::WebDriver::Firefox::Service.driver_path = proc { ::Webdrivers::Geckodriver.update }
|
data/lib/webdrivers/iedriver.rb
CHANGED
|
@@ -34,7 +34,7 @@ module Webdrivers
|
|
|
34
34
|
#
|
|
35
35
|
# @return [String]
|
|
36
36
|
def base_url
|
|
37
|
-
'https://
|
|
37
|
+
'https://api.github.com/repos/seleniumhq/selenium/releases'
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
private
|
|
@@ -43,35 +43,26 @@ module Webdrivers
|
|
|
43
43
|
'IEDriverServer.exe'
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
def direct_url(version)
|
|
47
|
+
downloads[version]
|
|
48
|
+
end
|
|
49
|
+
|
|
46
50
|
def downloads
|
|
47
51
|
ds = download_manifest.each_with_object({}) do |item, hash|
|
|
48
|
-
version = normalize_version item[
|
|
49
|
-
hash[version] =
|
|
52
|
+
version = normalize_version item['name'][/\.?([^_]+)\.zip/, 1]
|
|
53
|
+
hash[version] = item['browser_download_url']
|
|
50
54
|
end
|
|
51
55
|
Webdrivers.logger.debug "Versions now located on downloads site: #{ds.keys}"
|
|
52
56
|
ds
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
def download_manifest
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
json = Network.get(base_url)
|
|
61
|
+
all_assets = JSON.parse(json).map { |release| release['assets'] }.flatten
|
|
62
|
+
all_assets.select { |asset| asset['name'].include?('IEDriverServer_Win32') }
|
|
59
63
|
end
|
|
60
64
|
end
|
|
61
65
|
end
|
|
62
66
|
end
|
|
63
67
|
|
|
64
|
-
|
|
65
|
-
::Selenium::WebDriver::IE::Service.driver_path = proc { ::Webdrivers::IEdriver.update }
|
|
66
|
-
else
|
|
67
|
-
# v3.141.0 and lower
|
|
68
|
-
module Selenium
|
|
69
|
-
module WebDriver
|
|
70
|
-
module IE
|
|
71
|
-
def self.driver_path
|
|
72
|
-
@driver_path ||= Webdrivers::IEdriver.update
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
68
|
+
::Selenium::WebDriver::IE::Service.driver_path = proc { ::Webdrivers::IEdriver.update }
|
data/lib/webdrivers/logger.rb
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'forwardable'
|
|
4
|
-
require 'logger'
|
|
5
|
-
|
|
6
|
-
# Code adapted from Selenium Implementation
|
|
7
|
-
# https://github.com/SeleniumHQ/selenium/blob/master/rb/lib/selenium/webdriver/common/logger.rb
|
|
8
|
-
|
|
9
3
|
module Webdrivers
|
|
10
4
|
#
|
|
11
5
|
# @example Enable full logging
|
|
@@ -18,94 +12,9 @@ module Webdrivers
|
|
|
18
12
|
# Webdrivers.logger.info('This is info message')
|
|
19
13
|
# Webdrivers.logger.warn('This is warning message')
|
|
20
14
|
#
|
|
21
|
-
class Logger
|
|
22
|
-
extend Forwardable
|
|
23
|
-
include ::Logger::Severity
|
|
24
|
-
|
|
25
|
-
def_delegators :@logger, :debug, :debug?,
|
|
26
|
-
:info, :info?,
|
|
27
|
-
:warn, :warn?,
|
|
28
|
-
:error, :error?,
|
|
29
|
-
:fatal, :fatal?,
|
|
30
|
-
:level
|
|
31
|
-
|
|
15
|
+
class Logger < Selenium::WebDriver::Logger
|
|
32
16
|
def initialize
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def output=(io)
|
|
37
|
-
# `Logger#reopen` was added in Ruby 2.3
|
|
38
|
-
if @logger.respond_to?(:reopen)
|
|
39
|
-
@logger.reopen(io)
|
|
40
|
-
else
|
|
41
|
-
@logger = create_logger(io)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
#
|
|
46
|
-
# For Ruby < 2.3 compatibility
|
|
47
|
-
# Based on https://github.com/ruby/ruby/blob/ruby_2_3/lib/logger.rb#L250
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
def level=(severity)
|
|
51
|
-
if severity.is_a?(Integer)
|
|
52
|
-
@logger.level = severity
|
|
53
|
-
else
|
|
54
|
-
case severity.to_s.downcase
|
|
55
|
-
when 'debug'
|
|
56
|
-
@logger.level = DEBUG
|
|
57
|
-
when 'info'
|
|
58
|
-
@logger.level = INFO
|
|
59
|
-
when 'warn'
|
|
60
|
-
@logger.level = WARN
|
|
61
|
-
when 'error'
|
|
62
|
-
@logger.level = ERROR
|
|
63
|
-
when 'fatal'
|
|
64
|
-
@logger.level = FATAL
|
|
65
|
-
when 'unknown'
|
|
66
|
-
@logger.level = UNKNOWN
|
|
67
|
-
else
|
|
68
|
-
raise ArgumentError, "invalid log level: #{severity}"
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
#
|
|
74
|
-
# Returns IO object used by logger internally.
|
|
75
|
-
#
|
|
76
|
-
# Normally, we would have never needed it, but we want to
|
|
77
|
-
# use it as IO object for all child processes to ensure their
|
|
78
|
-
# output is redirected there.
|
|
79
|
-
#
|
|
80
|
-
# It is only used in debug level, in other cases output is suppressed.
|
|
81
|
-
#
|
|
82
|
-
# @api private
|
|
83
|
-
#
|
|
84
|
-
def io
|
|
85
|
-
@logger.instance_variable_get(:@logdev).instance_variable_get(:@dev)
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
#
|
|
89
|
-
# Marks code as deprecated with replacement.
|
|
90
|
-
#
|
|
91
|
-
# @param [String] old
|
|
92
|
-
# @param [String] new
|
|
93
|
-
#
|
|
94
|
-
def deprecate(old, new)
|
|
95
|
-
warn "[DEPRECATION] #{old} is deprecated. Use #{new} instead."
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
private
|
|
99
|
-
|
|
100
|
-
def create_logger(output)
|
|
101
|
-
logger = ::Logger.new(output)
|
|
102
|
-
logger.progname = 'Webdrivers'
|
|
103
|
-
logger.level = ($DEBUG ? DEBUG : WARN)
|
|
104
|
-
logger.formatter = proc do |severity, time, progname, msg|
|
|
105
|
-
"#{time.strftime('%F %T')} #{severity} #{progname} #{msg}\n"
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
logger
|
|
17
|
+
super('Webdrivers')
|
|
109
18
|
end
|
|
110
19
|
end
|
|
111
20
|
end
|
data/lib/webdrivers/railtie.rb
CHANGED
data/lib/webdrivers/system.rb
CHANGED
|
@@ -127,8 +127,7 @@ module Webdrivers
|
|
|
127
127
|
Webdrivers.logger.debug "Decompressing #{filename}"
|
|
128
128
|
|
|
129
129
|
Zip::File.open(filename) do |zip_file|
|
|
130
|
-
driver = zip_file
|
|
131
|
-
f_path = File.join(Dir.pwd, driver.name)
|
|
130
|
+
driver, f_path = driver_and_path(zip_file, driver_name)
|
|
132
131
|
delete(f_path)
|
|
133
132
|
FileUtils.mkdir_p(File.dirname(f_path)) unless File.exist?(File.dirname(f_path))
|
|
134
133
|
zip_file.extract(driver, f_path)
|
|
@@ -136,6 +135,18 @@ module Webdrivers
|
|
|
136
135
|
driver_name
|
|
137
136
|
end
|
|
138
137
|
|
|
138
|
+
def driver_and_path(zip_file, driver_name)
|
|
139
|
+
driver = zip_file.get_entry(driver_name)
|
|
140
|
+
f_path = File.join(Dir.pwd, driver.name)
|
|
141
|
+
|
|
142
|
+
[driver, f_path]
|
|
143
|
+
rescue Errno::ENOENT
|
|
144
|
+
driver = zip_file.entries.find { |e| File.basename(e.name) == driver_name }
|
|
145
|
+
f_path = File.join(Dir.pwd, File.basename(driver.name))
|
|
146
|
+
|
|
147
|
+
[driver, f_path]
|
|
148
|
+
end
|
|
149
|
+
|
|
139
150
|
def platform
|
|
140
151
|
if Selenium::WebDriver::Platform.linux?
|
|
141
152
|
'linux'
|
data/lib/webdrivers/version.rb
CHANGED
|
@@ -65,8 +65,9 @@ describe Webdrivers::Chromedriver do
|
|
|
65
65
|
it 'raises ConnectionError when offline, and no binary exists' do
|
|
66
66
|
allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
|
|
67
67
|
allow(chromedriver).to receive(:exists?).and_return(false)
|
|
68
|
+
allow(Webdrivers::ChromeFinder).to receive(:version).and_return('115.0.5790.114')
|
|
68
69
|
|
|
69
|
-
msg = %r{Can not reach https://
|
|
70
|
+
msg = %r{Can not reach https://googlechromelabs.github.io/chrome-for-testing}
|
|
70
71
|
expect { chromedriver.update }.to raise_error(Webdrivers::ConnectionError, msg)
|
|
71
72
|
end
|
|
72
73
|
end
|
|
@@ -100,8 +101,9 @@ describe Webdrivers::Chromedriver do
|
|
|
100
101
|
|
|
101
102
|
it 'raises ConnectionError if offline' do
|
|
102
103
|
allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
|
|
104
|
+
chromedriver.required_version = '115.0.5790.102'
|
|
103
105
|
|
|
104
|
-
msg = %r{Can not reach https://
|
|
106
|
+
msg = %r{Can not reach https://googlechromelabs.github.io/chrome-for-testing}
|
|
105
107
|
expect { chromedriver.update }.to raise_error(Webdrivers::ConnectionError, msg)
|
|
106
108
|
end
|
|
107
109
|
end
|
|
@@ -135,6 +137,62 @@ describe Webdrivers::Chromedriver do
|
|
|
135
137
|
expect(chromedriver.current_version.version).to eq('72.0.3626.7')
|
|
136
138
|
end
|
|
137
139
|
end
|
|
140
|
+
|
|
141
|
+
context 'when using an Apple machine' do
|
|
142
|
+
before do
|
|
143
|
+
allow(Webdrivers::System).to receive(:platform).and_return('mac')
|
|
144
|
+
allow(Webdrivers::System).to receive(:download)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
context 'with Intel architecture' do
|
|
148
|
+
it 'v114 uses correct suffix' do
|
|
149
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(false)
|
|
150
|
+
allow(chromedriver).to receive(:latest_version).and_return(Gem::Version.new('114.0.5735.90'))
|
|
151
|
+
chromedriver.required_version = nil
|
|
152
|
+
|
|
153
|
+
chromedriver.update
|
|
154
|
+
expect(Webdrivers::System).to have_received(:download).with(end_with('_mac64.zip'), anything)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it 'v115 uses correct suffix' do
|
|
158
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(false)
|
|
159
|
+
allow(chromedriver).to receive(:latest_version).and_return(Gem::Version.new('115.0.5790.102'))
|
|
160
|
+
chromedriver.required_version = nil
|
|
161
|
+
|
|
162
|
+
chromedriver.update
|
|
163
|
+
expect(Webdrivers::System).to have_received(:download).with(end_with('-mac-x64.zip'), anything)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
context 'with Apple architecture' do
|
|
168
|
+
it 'v106.0.5249.61 uses correct suffix' do
|
|
169
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(true)
|
|
170
|
+
allow(chromedriver).to receive(:latest_version).and_return(Gem::Version.new('106.0.5249.61'))
|
|
171
|
+
chromedriver.required_version = nil
|
|
172
|
+
|
|
173
|
+
chromedriver.update
|
|
174
|
+
expect(Webdrivers::System).to have_received(:download).with(end_with('_arm64.zip'), anything)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it 'less than v106.0.5249.61 uses correct suffix' do
|
|
178
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(true)
|
|
179
|
+
allow(chromedriver).to receive(:latest_version).and_return(Gem::Version.new('106.0.5249.21'))
|
|
180
|
+
chromedriver.required_version = nil
|
|
181
|
+
|
|
182
|
+
chromedriver.update
|
|
183
|
+
expect(Webdrivers::System).to have_received(:download).with(end_with('_mac64_m1.zip'), anything)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
it 'v115 uses correct suffix' do
|
|
187
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(true)
|
|
188
|
+
allow(chromedriver).to receive(:latest_version).and_return(Gem::Version.new('115.0.5790.102'))
|
|
189
|
+
chromedriver.required_version = nil
|
|
190
|
+
|
|
191
|
+
chromedriver.update
|
|
192
|
+
expect(Webdrivers::System).to have_received(:download).with(end_with('-mac-arm64.zip'), anything)
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
138
196
|
end
|
|
139
197
|
|
|
140
198
|
describe '#current_version' do
|
|
@@ -168,11 +226,11 @@ describe Webdrivers::Chromedriver do
|
|
|
168
226
|
end
|
|
169
227
|
|
|
170
228
|
it 'raises VersionError for beta version' do
|
|
171
|
-
allow(chromedriver).to receive(:browser_version).and_return Gem::Version.new('
|
|
172
|
-
msg = 'Unable to find latest point release version for
|
|
229
|
+
allow(chromedriver).to receive(:browser_version).and_return Gem::Version.new('999.0.0')
|
|
230
|
+
msg = 'Unable to find latest point release version for 999.0.0. '\
|
|
173
231
|
'You appear to be using a non-production version of Chrome. '\
|
|
174
232
|
'Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` '\
|
|
175
|
-
'to a known chromedriver version: https://chromedriver.
|
|
233
|
+
'to a known chromedriver version: https://chromedriver.chromium.org/downloads/version-selection'
|
|
176
234
|
|
|
177
235
|
expect { chromedriver.latest_version }.to raise_exception(Webdrivers::VersionError, msg)
|
|
178
236
|
end
|
|
@@ -181,19 +239,21 @@ describe Webdrivers::Chromedriver do
|
|
|
181
239
|
allow(chromedriver).to receive(:browser_version).and_return Gem::Version.new('72.0.9999.0000')
|
|
182
240
|
msg = 'Unable to find latest point release version for 72.0.9999. '\
|
|
183
241
|
'Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` '\
|
|
184
|
-
'to a known chromedriver version: https://chromedriver.
|
|
242
|
+
'to a known chromedriver version: https://chromedriver.chromium.org/downloads/version-selection'
|
|
185
243
|
|
|
186
244
|
expect { chromedriver.latest_version }.to raise_exception(Webdrivers::VersionError, msg)
|
|
187
245
|
end
|
|
188
246
|
|
|
189
247
|
it 'raises ConnectionError when offline' do
|
|
190
248
|
allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
|
|
249
|
+
allow(Webdrivers::ChromeFinder).to receive(:version).and_return('115.0.5790.114')
|
|
191
250
|
|
|
192
|
-
msg = %r{^Can not reach https://
|
|
251
|
+
msg = %r{^Can not reach https://googlechromelabs.github.io/chrome-for-testing}
|
|
193
252
|
expect { chromedriver.latest_version }.to raise_error(Webdrivers::ConnectionError, msg)
|
|
194
253
|
end
|
|
195
254
|
|
|
196
255
|
it 'creates cached file' do
|
|
256
|
+
allow(chromedriver).to receive(:latest_patch_version).and_return(nil)
|
|
197
257
|
allow(Webdrivers::Network).to receive(:get).and_return('71.0.3578.137')
|
|
198
258
|
|
|
199
259
|
chromedriver.latest_version
|
|
@@ -224,6 +284,17 @@ describe Webdrivers::Chromedriver do
|
|
|
224
284
|
expect(Webdrivers::Network).to have_received(:get)
|
|
225
285
|
expect(Webdrivers::System).to have_received(:valid_cache?)
|
|
226
286
|
end
|
|
287
|
+
|
|
288
|
+
it 'call chrome_for_testing if the browser version is greater than 115' do
|
|
289
|
+
allow(chromedriver).to receive(:browser_version).and_return Gem::Version.new('115.0.5790.102')
|
|
290
|
+
allow(Webdrivers::Network).to receive(:get).and_return(
|
|
291
|
+
{"builds": {'115.0.5790': {"version": '115.0.5790.102'}}}.to_json
|
|
292
|
+
)
|
|
293
|
+
uri = URI.join('https://googlechromelabs.github.io', '/chrome-for-testing/latest-patch-versions-per-build.json')
|
|
294
|
+
|
|
295
|
+
expect(chromedriver.latest_version).to eq Gem::Version.new('115.0.5790.102')
|
|
296
|
+
expect(Webdrivers::Network).to have_received(:get).with(uri)
|
|
297
|
+
end
|
|
227
298
|
end
|
|
228
299
|
|
|
229
300
|
describe '#required_version=' do
|
|
@@ -5,11 +5,7 @@ require 'spec_helper'
|
|
|
5
5
|
describe Webdrivers::EdgeFinder do
|
|
6
6
|
let(:edge_finder) { described_class }
|
|
7
7
|
|
|
8
|
-
before
|
|
9
|
-
if Selenium::WebDriver::VERSION[0].to_i < 4
|
|
10
|
-
skip "The current selenium-webdriver doesn't include Chromium based Edge support"
|
|
11
|
-
end
|
|
12
|
-
end
|
|
8
|
+
before { skip 'Edge is not yet supported on Linux' if Webdrivers::System.platform == 'linux' }
|
|
13
9
|
|
|
14
10
|
context 'when the user relies on the gem to figure out the location of Edge' do
|
|
15
11
|
it 'determines the location correctly based on the current OS' do
|
|
@@ -5,14 +5,10 @@ require 'spec_helper'
|
|
|
5
5
|
describe Webdrivers::Edgedriver do
|
|
6
6
|
let(:edgedriver) { described_class }
|
|
7
7
|
|
|
8
|
-
before
|
|
9
|
-
|
|
10
|
-
skip "The current selenium-webdriver doesn't include Chromium based Edge support"
|
|
11
|
-
end
|
|
8
|
+
before do
|
|
9
|
+
edgedriver.remove
|
|
12
10
|
end
|
|
13
11
|
|
|
14
|
-
before { edgedriver.remove }
|
|
15
|
-
|
|
16
12
|
describe '#update' do
|
|
17
13
|
context 'when evaluating #correct_binary?' do
|
|
18
14
|
it 'does not download when latest version and current version match' do
|
|
@@ -99,6 +95,7 @@ describe Webdrivers::Edgedriver do
|
|
|
99
95
|
before { allow(edgedriver).to receive(:correct_binary?).and_return(false) }
|
|
100
96
|
|
|
101
97
|
it 'downloads binary' do
|
|
98
|
+
allow(Webdrivers::EdgeFinder).to receive(:version).and_return('115.0.1901.188')
|
|
102
99
|
edgedriver.update
|
|
103
100
|
|
|
104
101
|
expect(edgedriver.current_version).not_to be_nil
|
|
@@ -126,19 +123,19 @@ describe Webdrivers::Edgedriver do
|
|
|
126
123
|
|
|
127
124
|
context 'when required version is 0' do
|
|
128
125
|
it 'downloads the latest version' do
|
|
129
|
-
allow(edgedriver).to receive(:latest_version).and_return(Gem::Version.new('
|
|
126
|
+
allow(edgedriver).to receive(:latest_version).and_return(Gem::Version.new('98.0.1089.1'))
|
|
130
127
|
edgedriver.required_version = 0
|
|
131
128
|
edgedriver.update
|
|
132
|
-
expect(edgedriver.current_version.version).to eq('
|
|
129
|
+
expect(edgedriver.current_version.version).to eq('98.0.1089.1')
|
|
133
130
|
end
|
|
134
131
|
end
|
|
135
132
|
|
|
136
133
|
context 'when required version is nil' do
|
|
137
134
|
it 'downloads the latest version' do
|
|
138
|
-
allow(edgedriver).to receive(:latest_version).and_return(Gem::Version.new('
|
|
135
|
+
allow(edgedriver).to receive(:latest_version).and_return(Gem::Version.new('98.0.1089.1'))
|
|
139
136
|
edgedriver.required_version = nil
|
|
140
137
|
edgedriver.update
|
|
141
|
-
expect(edgedriver.current_version.version).to eq('
|
|
138
|
+
expect(edgedriver.current_version.version).to eq('98.0.1089.1')
|
|
142
139
|
end
|
|
143
140
|
end
|
|
144
141
|
end
|
|
@@ -168,21 +165,20 @@ describe Webdrivers::Edgedriver do
|
|
|
168
165
|
end
|
|
169
166
|
|
|
170
167
|
it 'raises VersionError for beta version' do
|
|
171
|
-
allow(edgedriver).to receive(:browser_version).and_return Gem::Version.new('
|
|
172
|
-
msg = 'Unable to find latest point release version for
|
|
168
|
+
allow(edgedriver).to receive(:browser_version).and_return Gem::Version.new('999.0.0')
|
|
169
|
+
msg = 'Unable to find latest point release version for 999.0.0. '\
|
|
173
170
|
'You appear to be using a non-production version of Edge. '\
|
|
174
171
|
'Please set `Webdrivers::Edgedriver.required_version = <desired driver version>` '\
|
|
175
|
-
'to a known edgedriver version: Can not reach https://msedgedriver.azureedge.net
|
|
172
|
+
'to a known edgedriver version: Can not reach https://msedgedriver.azureedge.net'
|
|
176
173
|
|
|
177
174
|
expect { edgedriver.latest_version }.to raise_exception(Webdrivers::VersionError, msg)
|
|
178
175
|
end
|
|
179
176
|
|
|
180
177
|
it 'raises VersionError for unknown version' do
|
|
181
|
-
|
|
182
|
-
allow(edgedriver).to receive(:browser_version).and_return('77.0.9999.0000')
|
|
178
|
+
allow(edgedriver).to receive(:browser_version).and_return Gem::Version.new('77.0.9999')
|
|
183
179
|
msg = 'Unable to find latest point release version for 77.0.9999. '\
|
|
184
180
|
'Please set `Webdrivers::Edgedriver.required_version = <desired driver version>` '\
|
|
185
|
-
'to a known edgedriver version: Can not reach https://msedgedriver.azureedge.net
|
|
181
|
+
'to a known edgedriver version: Can not reach https://msedgedriver.azureedge.net'
|
|
186
182
|
|
|
187
183
|
expect { edgedriver.latest_version }.to raise_exception(Webdrivers::VersionError, msg)
|
|
188
184
|
end
|
|
@@ -246,6 +242,7 @@ describe Webdrivers::Edgedriver do
|
|
|
246
242
|
|
|
247
243
|
describe '#remove' do
|
|
248
244
|
it 'removes existing edgedriver' do
|
|
245
|
+
allow(Webdrivers::EdgeFinder).to receive(:version).and_return('115.0.1901.188')
|
|
249
246
|
edgedriver.update
|
|
250
247
|
|
|
251
248
|
edgedriver.remove
|
|
@@ -86,12 +86,46 @@ describe Webdrivers::Geckodriver do
|
|
|
86
86
|
expect(Webdrivers::System).to have_received(:download).with(url, geckodriver.driver_path)
|
|
87
87
|
end
|
|
88
88
|
|
|
89
|
-
it '
|
|
89
|
+
it 'raises error when a wrong version is supplied' do
|
|
90
90
|
geckodriver.required_version = '0.2.0'
|
|
91
91
|
|
|
92
|
-
msg = /
|
|
92
|
+
msg = /404 "Not Found"/
|
|
93
93
|
expect { geckodriver.update }.to raise_error(StandardError, msg)
|
|
94
94
|
end
|
|
95
|
+
|
|
96
|
+
context 'when platform is Apple Sillicon' do
|
|
97
|
+
it 'downloads aarch64 binary' do
|
|
98
|
+
allow(Webdrivers::System).to receive(:platform).and_return('mac')
|
|
99
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(true)
|
|
100
|
+
base = 'https://github.com/mozilla/geckodriver/releases/download'
|
|
101
|
+
binary = 'geckodriver-v0.31.0-macos-aarch64.tar.gz'
|
|
102
|
+
url = "#{base}/v0.31.0/#{binary}"
|
|
103
|
+
|
|
104
|
+
allow(Webdrivers::System).to receive(:download).with(url, geckodriver.driver_path)
|
|
105
|
+
|
|
106
|
+
geckodriver.required_version = '0.31.0'
|
|
107
|
+
geckodriver.update
|
|
108
|
+
|
|
109
|
+
expect(Webdrivers::System).to have_received(:download).with(url, geckodriver.driver_path)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
context 'when platform isn\'t Apple Sillicon' do
|
|
114
|
+
it 'downloads default binary' do
|
|
115
|
+
allow(Webdrivers::System).to receive(:platform).and_return('mac')
|
|
116
|
+
allow(Webdrivers::System).to receive(:apple_m1_architecture?).and_return(false)
|
|
117
|
+
base = 'https://github.com/mozilla/geckodriver/releases/download'
|
|
118
|
+
binary = 'geckodriver-v0.31.0-macos.tar.gz'
|
|
119
|
+
url = "#{base}/v0.31.0/#{binary}"
|
|
120
|
+
|
|
121
|
+
allow(Webdrivers::System).to receive(:download).with(url, geckodriver.driver_path)
|
|
122
|
+
|
|
123
|
+
geckodriver.required_version = '0.31.0'
|
|
124
|
+
geckodriver.update
|
|
125
|
+
|
|
126
|
+
expect(Webdrivers::System).to have_received(:download).with(url, geckodriver.driver_path)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
95
129
|
end
|
|
96
130
|
|
|
97
131
|
describe '#current_version' do
|
|
@@ -192,14 +226,12 @@ You can obtain a copy of the license at https://mozilla.org/MPL/2.0/"
|
|
|
192
226
|
end
|
|
193
227
|
|
|
194
228
|
it 'uses provided value' do
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
Webdrivers.install_dir = install_dir
|
|
229
|
+
install_dir = File.expand_path(File.join(ENV['HOME'], '.webdrivers2'))
|
|
230
|
+
Webdrivers.install_dir = install_dir
|
|
198
231
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
end
|
|
232
|
+
expect(Webdrivers::System.install_dir).to eq install_dir
|
|
233
|
+
ensure
|
|
234
|
+
Webdrivers.install_dir = nil
|
|
203
235
|
end
|
|
204
236
|
end
|
|
205
237
|
|
|
@@ -6,6 +6,10 @@ describe Webdrivers::IEdriver do
|
|
|
6
6
|
let(:iedriver) { described_class }
|
|
7
7
|
|
|
8
8
|
before do
|
|
9
|
+
if ENV['CI'] && !Selenium::WebDriver::Platform.windows?
|
|
10
|
+
skip('Only run IE tests on Windows on CI because rate limiting')
|
|
11
|
+
end
|
|
12
|
+
|
|
9
13
|
iedriver.remove
|
|
10
14
|
iedriver.required_version = nil
|
|
11
15
|
end
|
|
@@ -69,7 +73,7 @@ describe Webdrivers::IEdriver do
|
|
|
69
73
|
it 'raises ConnectionError if offline' do
|
|
70
74
|
allow(Net::HTTP).to receive(:get_response).and_raise(SocketError)
|
|
71
75
|
|
|
72
|
-
msg = %r{Can not reach https://
|
|
76
|
+
msg = %r{Can not reach https://api.github.com/repos/seleniumhq/selenium/releases}
|
|
73
77
|
expect { iedriver.update }.to raise_error(Webdrivers::ConnectionError, msg)
|
|
74
78
|
end
|
|
75
79
|
end
|
|
@@ -109,7 +113,8 @@ describe Webdrivers::IEdriver do
|
|
|
109
113
|
end
|
|
110
114
|
|
|
111
115
|
it 'creates cached file' do
|
|
112
|
-
|
|
116
|
+
json = '[{"assets": [{"name":"IEDriverServer_Win32_3.150.0.zip"}]}]'
|
|
117
|
+
allow(Webdrivers::Network).to receive(:get).and_return(json)
|
|
113
118
|
|
|
114
119
|
iedriver.latest_version
|
|
115
120
|
expect(File.exist?("#{Webdrivers::System.install_dir}/IEDriverServer.version")).to eq true
|
|
@@ -174,14 +179,12 @@ describe Webdrivers::IEdriver do
|
|
|
174
179
|
end
|
|
175
180
|
|
|
176
181
|
it 'uses provided value' do
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
Webdrivers.install_dir = install_dir
|
|
182
|
+
install_dir = File.expand_path(File.join(ENV['HOME'], '.webdrivers2'))
|
|
183
|
+
Webdrivers.install_dir = install_dir
|
|
180
184
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
end
|
|
185
|
+
expect(Webdrivers::System.install_dir).to eq install_dir
|
|
186
|
+
ensure
|
|
187
|
+
Webdrivers.install_dir = nil
|
|
185
188
|
end
|
|
186
189
|
end
|
|
187
190
|
|
|
@@ -49,37 +49,31 @@ describe Webdrivers do
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
it 'uses provided value' do
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
described_class.install_dir = install_dir
|
|
52
|
+
install_dir = File.expand_path(File.join(ENV['HOME'], '.webdrivers2'))
|
|
53
|
+
described_class.install_dir = install_dir
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
end
|
|
55
|
+
expect(described_class.install_dir).to eq install_dir
|
|
56
|
+
ensure
|
|
57
|
+
described_class.install_dir = nil
|
|
60
58
|
end
|
|
61
59
|
|
|
62
60
|
context 'when ENV variable WD_INSTALL_DIR is set and Webdrivers.install_dir is not' do
|
|
63
61
|
it 'uses path from the ENV variable' do
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
described_class.install_dir = nil
|
|
70
|
-
end
|
|
62
|
+
described_class.install_dir = nil
|
|
63
|
+
allow(ENV).to receive(:[]).with('WD_INSTALL_DIR').and_return('custom_dir')
|
|
64
|
+
expect(described_class.install_dir).to be('custom_dir')
|
|
65
|
+
ensure
|
|
66
|
+
described_class.install_dir = nil
|
|
71
67
|
end
|
|
72
68
|
end
|
|
73
69
|
|
|
74
70
|
context 'when both ENV variable WD_INSTALL_DIR and Webdrivers.install_dir are set' do
|
|
75
71
|
it 'uses path from Webdrivers.install_dir' do
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
described_class.install_dir = nil
|
|
82
|
-
end
|
|
72
|
+
described_class.install_dir = 'my_install_dir_path'
|
|
73
|
+
allow(ENV).to receive(:[]).with('WD_INSTALL_DIR').and_return('my_env_path')
|
|
74
|
+
expect(described_class.install_dir).to be('my_install_dir_path')
|
|
75
|
+
ensure
|
|
76
|
+
described_class.install_dir = nil
|
|
83
77
|
end
|
|
84
78
|
end
|
|
85
79
|
end
|
metadata
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: webdrivers
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 5.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Titus Fortner
|
|
8
8
|
- Lakshya Kapoor
|
|
9
9
|
- Thomas Walpole
|
|
10
|
-
autorequire:
|
|
10
|
+
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2023-07-31 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: ffi
|
|
@@ -156,22 +156,22 @@ dependencies:
|
|
|
156
156
|
name: selenium-webdriver
|
|
157
157
|
requirement: !ruby/object:Gem::Requirement
|
|
158
158
|
requirements:
|
|
159
|
-
- - "
|
|
159
|
+
- - "~>"
|
|
160
160
|
- !ruby/object:Gem::Version
|
|
161
|
-
version: '
|
|
161
|
+
version: '4.0'
|
|
162
162
|
- - "<"
|
|
163
163
|
- !ruby/object:Gem::Version
|
|
164
|
-
version: '4.
|
|
164
|
+
version: '4.11'
|
|
165
165
|
type: :runtime
|
|
166
166
|
prerelease: false
|
|
167
167
|
version_requirements: !ruby/object:Gem::Requirement
|
|
168
168
|
requirements:
|
|
169
|
-
- - "
|
|
169
|
+
- - "~>"
|
|
170
170
|
- !ruby/object:Gem::Version
|
|
171
|
-
version: '
|
|
171
|
+
version: '4.0'
|
|
172
172
|
- - "<"
|
|
173
173
|
- !ruby/object:Gem::Version
|
|
174
|
-
version: '4.
|
|
174
|
+
version: '4.11'
|
|
175
175
|
description: Run Selenium tests more easily with install and updates for all supported
|
|
176
176
|
webdrivers.
|
|
177
177
|
email:
|
|
@@ -218,9 +218,9 @@ licenses:
|
|
|
218
218
|
metadata:
|
|
219
219
|
bug_tracker_uri: https://github.com/titusfortner/webdrivers/issues
|
|
220
220
|
changelog_uri: https://github.com/titusfortner/webdrivers/blob/master/CHANGELOG.md
|
|
221
|
-
documentation_uri: https://www.rubydoc.info/gems/webdrivers/
|
|
222
|
-
source_code_uri: https://github.com/titusfortner/webdrivers/tree/
|
|
223
|
-
post_install_message:
|
|
221
|
+
documentation_uri: https://www.rubydoc.info/gems/webdrivers/5.3.0
|
|
222
|
+
source_code_uri: https://github.com/titusfortner/webdrivers/tree/v5.3.0
|
|
223
|
+
post_install_message:
|
|
224
224
|
rdoc_options: []
|
|
225
225
|
require_paths:
|
|
226
226
|
- lib
|
|
@@ -228,25 +228,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
228
228
|
requirements:
|
|
229
229
|
- - ">="
|
|
230
230
|
- !ruby/object:Gem::Version
|
|
231
|
-
version: 2.
|
|
231
|
+
version: 2.6.0
|
|
232
232
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
233
233
|
requirements:
|
|
234
234
|
- - ">="
|
|
235
235
|
- !ruby/object:Gem::Version
|
|
236
236
|
version: '0'
|
|
237
237
|
requirements: []
|
|
238
|
-
rubygems_version: 3.
|
|
239
|
-
signing_key:
|
|
238
|
+
rubygems_version: 3.2.33
|
|
239
|
+
signing_key:
|
|
240
240
|
specification_version: 4
|
|
241
241
|
summary: Easy download and use of browser drivers.
|
|
242
242
|
test_files:
|
|
243
243
|
- spec/spec_helper.rb
|
|
244
244
|
- spec/webdrivers/chrome_finder_spec.rb
|
|
245
|
+
- spec/webdrivers/chromedriver_spec.rb
|
|
245
246
|
- spec/webdrivers/edge_finder_spec.rb
|
|
246
|
-
- spec/webdrivers/webdrivers_spec.rb
|
|
247
|
-
- spec/webdrivers/system_spec.rb
|
|
248
247
|
- spec/webdrivers/edgedriver_spec.rb
|
|
249
|
-
- spec/webdrivers/i_edriver_spec.rb
|
|
250
248
|
- spec/webdrivers/geckodriver_spec.rb
|
|
251
|
-
- spec/webdrivers/
|
|
249
|
+
- spec/webdrivers/i_edriver_spec.rb
|
|
250
|
+
- spec/webdrivers/system_spec.rb
|
|
251
|
+
- spec/webdrivers/webdrivers_spec.rb
|
|
252
252
|
- spec/webdrivers_proxy_support_spec.rb
|