webdrivers 4.0.0 → 5.2.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: 7f9dfef27ff9ab5bae476fa1b8667572f892ef8f4d6631d150bc95018d33d327
4
- data.tar.gz: a38a950bf647ec8d94fc7101d06a0325cac68568a2b0bcde65775fb64ee34a4e
3
+ metadata.gz: abf2f2c3590d8497b09a84c7f2b55c2b8c5a5cf5752d178fcd4e4a852c0cfd2c
4
+ data.tar.gz: 422f61f2c96fa03e7d4ae5b8564d52058f13334d51ccda07b334805bb2403d6b
5
5
  SHA512:
6
- metadata.gz: 27a4cdef15c93e2fee024e0314dcaa663aeaf1f33bc23a5caecf3143d73b958c5486d4b09e52b961ab9bd80273630957dec8e773a7d76a4c8f85533c1cded036
7
- data.tar.gz: bef2bc7580981a2444d5a8e5eb45c9be99c5bcdbe1f60029179cf0e28d3d2a3145bf608e06afec4da63d75041e4fdd47444a3a8e67c98b222b69e9a7095d5437
6
+ metadata.gz: dad2443ef52807af22f9780064bb72c226e9101e9997bd787e6ccd3c8a2e161357eb46f476e663a046bee4b9848002f2112a3db5e03a13cd7ca87b564708f54b
7
+ data.tar.gz: 809752d1ef3e67e1fe8a5021eeafe3ab93ad1436c1c894ca6765e8f9e739caf8b4b359d2f2ced0ee61cd118cb7492a8281049f60695d2ba0ec5a51d3fa76b1f4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,101 @@
1
+ # 5.2.0 (2022-09-29)
2
+ * `chromedriver` - Fix downloading on M1 macs from version 106.0.5249.61 ([#237](https://github.com/titusfortner/webdrivers/issues/237), thanks jmccure)
3
+
4
+ # 5.1.0 (2022-09-19)
5
+ * Improve error messages (#232, thanks dan-jensen)
6
+ * Fix circular require bug with railtie (#233, thanks amatsuda)
7
+ * Support downloading correct geckodriver on Apple silicon (#234 thanks stephannv)
8
+ * Update linux locations for Chrome to latest chromedriver finder (thanks entretechno-jeremiah)
9
+ * Add support for Microsoft Edge on Linux (#236)
10
+
11
+ # 5.0.0 (2021-10-19)
12
+ * Require Selenium 4+
13
+ * Remove custom Logger and use the one in Selenium 4
14
+
15
+ # 4.7.0 (2021-10-14)
16
+ * Add support for Selenium 4.x #218 (thanks yahonda )
17
+ * Allow Edge on Linux
18
+ * Update required Selenium > 3.141 because of a change in 4.6
19
+ * Require Ruby 2.6+
20
+ * Fix IE downloads with the change in location of assets
21
+
22
+ # 4.6.1 (2021-08-19)
23
+ * Fix bug in IEdriver caused by bad formatting in recent release
24
+
25
+ # 4.6.0 (2021-02-26)
26
+ * Update `Edgedriver` naming to support Selenium 4 beta (([#206](https://github.com/titusfortner/webdrivers/pull/206))
27
+
28
+ # 4.5.0 (2021-01-19)
29
+ * Improve format of README usage section. Thanks, [okuramasafumi](https://github.com/okuramasafumi)!
30
+ * `chromedriver` - Add support for Apple M1 specific builds ([#193](https://github.com/titusfortner/webdrivers/pull/193)). Thanks, [MichaelHoste](https://github.com/MichaelHoste)!
31
+ * `msedgedriver` - Add support for Apple M1 specific builds.
32
+ * `msedgedriver` - Added automatic selection of 32-bit vs 64-bit builds on Windows and WSLv1.
33
+ * When using this gem in WSLv2, Chrome installed on the Linux filesystem will be automatically used ([#196](https://github.com/titusfortner/webdrivers/pull/196)).
34
+ WSLv1 continues to automatically use Chrome from the Windows filesystem though. Thanks, [fabioxgn](https://github.com/fabioxgn)!
35
+ * We'll aim to make the behavior consistent in a future release.
36
+
37
+ ### 4.4.2 (2020-12-29)
38
+ * Use new powershell if available to enhance WSL support ([#176](https://github.com/titusfortner/webdrivers/issues/176),
39
+ [#186](https://github.com/titusfortner/webdrivers/pull/186)). Thanks, [G-Rath](https://github.com/G-Rath) and
40
+ [131](https://github.com/131)!
41
+ * Update rubocop version (development dependency only) ([#178](https://github.com/titusfortner/webdrivers/pull/178)).
42
+ Thanks, [utkarsh2102](https://github.com/utkarsh2102)!
43
+ * Replace `git ls-files` with `dir` in the gemspec for better Debian support ([#179](https://github.com/titusfortner/webdrivers/pull/179),
44
+ [#184](https://github.com/titusfortner/webdrivers/issues/184)).
45
+ Thanks again, [utkarsh2102](https://github.com/utkarsh2102)!
46
+ * Update README with `require: false` when adding gem to Gemfile ([#183](https://github.com/titusfortner/webdrivers/pull/183)).
47
+ * Make WSL detection more generic ([#187](https://github.com/titusfortner/webdrivers/pull/187)).
48
+ [rbclark](https://github.com/rbclark)!
49
+
50
+ ### 4.4.1 (2020-06-01)
51
+ * Do not include binstubs used for troubleshooting only. Fixes [#174](https://github.com/titusfortner/webdrivers/issues/174).
52
+
53
+ ### 4.4.0 (2020-05-31)
54
+ * Implement support for `chromedriver` in Windows Subsystem for Linux (WSL) v1 ([#172](https://github.com/titusfortner/webdrivers/issues/172)).
55
+ Thanks, [G-Rath](https://github.com/G-Rath)!
56
+ * Chrome/Edgedriver - Fix [#171](https://github.com/titusfortner/webdrivers/issues/171) by making sure the cached
57
+ driver build version matches the browser build version before using it.
58
+ * Chrome/Edgedriver - Driver version check now matches the driver and browser `major.minor.build` versions instead of just
59
+ the major version to be fully compliant with the `chromedriver` version selection
60
+ [document](https://chromedriver.chromium.org/downloads/version-selection).
61
+
62
+ ### 4.3.0 (2020-04-14)
63
+ * Add support for Microsoft Edge (Chromium) stable
64
+ * Drop support for Ruby < 2.4.0
65
+
66
+ ### 4.2.0 (2019-12-27)
67
+ * Add support for Microsoft Edge (Chromium) Beta releases ([#155](https://github.com/titusfortner/webdrivers/pull/155))
68
+ * Use tilde expansion to resolve user's home directory ([#166](https://github.com/titusfortner/webdrivers/pull/161))
69
+ * Add support for Chromium installed using Snap on Ubuntu ([#163](https://github.com/titusfortner/webdrivers/pull/163)). Thanks Tietew!
70
+
71
+ ### 4.1.3 (2019-10-07)
72
+ * Require rubyzip version 1.3.0 or higher to fix [rubyzip#403](https://github.com/rubyzip/rubyzip/pull/403). Thanks rhymes! ([#153](https://github.com/titusfortner/webdrivers/pull/153))
73
+ * Fix a bug where the file deletion confirmation was printed even when there were no files to delete.
74
+
75
+ ### 4.1.2 (2019-07-29)
76
+ * Fix a bug related to raising `BrowserNotFound`.
77
+
78
+ ### 4.1.1 (2019-07-18)
79
+ * Raise `BrowserNotFound` if Chrome and Edge binary are not found (issue [#144](https://github.com/titusfortner/webdrivers/issues/144)).
80
+
81
+ ### 4.1.0 (2019-07-03)
82
+ * Add support for `msedgedriver` (issue [#93](https://github.com/titusfortner/webdrivers/issues/93))
83
+ * Allow users to provide a custom binary path via `WD_CHROME_PATH`
84
+ and `WD_EDGE_CHROME_ATH` environment variables (issues #[137](https://github.com/titusfortner/webdrivers/issues/137)
85
+ and [#93](https://github.com/titusfortner/webdrivers/issues/93))
86
+ * Fix a bug where the user given Chrome binary path via `Selenium::WebDriver::Chrome.path`
87
+ was not properly escaped (issue [#139](https://github.com/titusfortner/webdrivers/issues/139))
88
+ * Fix miscellaneous code warnings.
89
+ * ~~**Announcement**: As of 06/21/2019, `heroku-buildpack-google-chrome`
90
+ no longer requires a [workaround](https://github.com/titusfortner/webdrivers/wiki/Heroku-buildpack-google-chrome)
91
+ to work with this gem. See [heroku-buildpack-google-chrome#73](https://github.com/heroku/heroku-buildpack-google-chrome/pull/73)
92
+ for more information.~~
93
+
94
+ ### 4.0.1 (2019-06-12)
95
+ * Cache time now defaults to 86,400 Seconds (24 hours). Please note the special exception for `chromedriver` in the [README](https://github.com/titusfortner/webdrivers#special-exception-for-chromedriver-and-msedgedriver) (issue [#132](https://github.com/titusfortner/webdrivers/issues/132))
96
+ * Properly escape Chrome binary path when using JRuby on Windows (issue [#130](https://github.com/titusfortner/webdrivers/issues/130))
97
+ * Allow use of `selenium-webdriver` v4 (pre-releases only)
98
+
1
99
  ### 4.0.0 (2019-05-28)
2
100
 
3
101
  No changes since rc2. Please report any issues [here](https://github.com/titusfortner/webdrivers/issues)
data/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  # Webdrivers
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/webdrivers.svg)](https://badge.fury.io/rb/webdrivers)
4
- [![Build status](https://travis-ci.org/titusfortner/webdrivers.svg?branch=master)](https://travis-ci.org/titusfortner/webdrivers)
5
- [![AppVeyor status](https://ci.appveyor.com/api/projects/status/ejh90xqbvkphq4cy/branch/master?svg=true)](https://ci.appveyor.com/project/titusfortner/webdrivers/branch/master)
4
+ ![Tests](https://github.com/titusfortner/webdrivers/workflows/Tests/badge.svg)
6
5
 
7
6
  Run Selenium tests more easily with automatic installation and updates for all supported webdrivers.
8
7
 
@@ -13,16 +12,18 @@ Run Selenium tests more easily with automatic installation and updates for all s
13
12
  * [chromedriver](http://chromedriver.chromium.org/)
14
13
  * [geckodriver](https://github.com/mozilla/geckodriver)
15
14
  * [IEDriverServer](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver)
15
+ * [msedgedriver](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)
16
16
 
17
- Support for [`msedgedriver`](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)
18
- will be added once the next Microsoft Edge version (v75) is released. More information is available
19
- [here](https://developer.microsoft.com/en-us/microsoft-edge/).
17
+ Works on macOS, Linux, Windows, and Windows Subsystem for Linux (WSL) v1 and v2. And do see the browser and OS specific
18
+ notes at the bottom.
20
19
 
21
20
  ## Usage
22
21
 
23
- In your Gemfile:
22
+ In your Gemfile:
24
23
 
25
- `gem 'webdrivers', '~> 4.0'`
24
+ ```ruby
25
+ gem 'webdrivers', '~> 5.0', require: false
26
+ ```
26
27
 
27
28
  In your project:
28
29
 
@@ -31,21 +32,23 @@ require 'webdrivers'
31
32
  ```
32
33
 
33
34
  The drivers will now be automatically downloaded or updated when you launch a browser
34
- through Selenium.
35
+ through Selenium.
35
36
 
36
37
  ### Specific Drivers
37
38
 
38
39
  If you want webdrivers to only manage specific drivers you can specify one or more as follows:
40
+
39
41
  ```ruby
40
42
  require 'webdrivers/chromedriver'
41
43
  require 'webdrivers/geckodriver'
42
44
  require 'webdrivers/iedriver'
45
+ require 'webdrivers/edgedriver'
43
46
  ```
44
47
 
45
48
  ### Download Location
46
49
 
47
50
  The default download location is `~/.webdrivers` directory, and this is configurable:
48
-
51
+
49
52
  ```ruby
50
53
  Webdrivers.install_dir = '/webdrivers/install/dir'
51
54
  ```
@@ -55,7 +58,7 @@ variable.
55
58
 
56
59
  ### Version Pinning
57
60
 
58
- If you would like to use a specific (older or beta) version, you can specify it for each driver. Otherwise,
61
+ If you would like to use a specific (older or beta) version, you can specify it for each driver. Otherwise,
59
62
  the latest (stable) driver will be downloaded and passed to Selenium.
60
63
 
61
64
  ```ruby
@@ -67,6 +70,9 @@ Webdrivers::Geckodriver.required_version = '0.23.0'
67
70
 
68
71
  # Internet Explorer
69
72
  Webdrivers::IEdriver.required_version = '3.14.0'
73
+
74
+ # Edge (Chromium)
75
+ Webdrivers::Edgedriver.required_version = '76.0.183.0'
70
76
  ```
71
77
 
72
78
  You can explicitly trigger the update in your code, but this will happen
@@ -82,13 +88,18 @@ You can set Webdrivers to only look for updates if the previous check
82
88
  was longer ago than a specified number of seconds.
83
89
 
84
90
  ```ruby
85
- Webdrivers.cache_time = 86_400
91
+ Webdrivers.cache_time = 86_400 # Default: 86,400 Seconds (24 hours)
86
92
  ```
87
93
 
88
94
  Alternatively, you can define this value via the `WD_CACHE_TIME` environment
89
- variable.
95
+ variable. **Only set one to avoid confusion**.
96
+
97
+ ##### Special exception for chromedriver and msedgedriver
90
98
 
91
- The default is set to 24 hours (86,400 seconds).
99
+ Cache time will be respected as long as a driver binary exists and the major.minor.build versions of
100
+ the browser and the driver match. For example, if you update Chrome or Edge to v76.0.123 and its driver is
101
+ still at v76.0.100, `webdrivers` will ignore the cache time and update the driver to make sure you're
102
+ using a compatible build version.
92
103
 
93
104
  ### Proxy
94
105
 
@@ -107,7 +118,7 @@ end
107
118
  ### `SSL_connect` errors
108
119
 
109
120
  If you are getting an error like this (especially common on Windows):
110
-
121
+
111
122
  `SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed`
112
123
 
113
124
  Add the following to your Gemfile:
@@ -127,15 +138,34 @@ Other solutions are documented on the RubyGems [website](https://guides.rubygems
127
138
  ### Rake tasks
128
139
 
129
140
  Each driver has its own set of `rake` tasks (with `Railtie` support) that
130
- you can call once before executing the tests. These are especially
131
- useful if you're running tests in parallel and want to avoid performing
141
+ you can call once before executing the tests. These are especially
142
+ useful if you're running tests in parallel and want to avoid performing
132
143
  an update check per thread.
133
144
 
145
+ If you are using Rails default configuration the `webdrivers` gem will only be loaded in the test group
146
+ so you will need to specify the test environment when using the tasks:
147
+
148
+ ```ruby
149
+ RAILS_ENV=test rails webdrivers:chromedriver:update
150
+ ```
151
+
152
+ If you are not using Rails, you'll need to load them into your Rakefile like this:
153
+
154
+ ```ruby
155
+ require 'webdrivers'
156
+ load 'webdrivers/Rakefile'
157
+ ```
158
+
159
+ The full list of available tasks is:
160
+
134
161
  ```bash
135
162
  $ bundle exec rake -T
136
163
  rake webdrivers:chromedriver:remove # Force remove chromedriver
137
164
  rake webdrivers:chromedriver:update[version] # Remove and download updated chromedriver if necessary
138
165
  rake webdrivers:chromedriver:version # Print current chromedriver version
166
+ rake webdrivers:edgedriver:remove # Force remove msedgedriver
167
+ rake webdrivers:edgedriver:update[version] # Remove and download updated msedgedriver if necessary
168
+ rake webdrivers:edgedriver:version # Print current msedgedriver version
139
169
  rake webdrivers:geckodriver:remove # Force remove geckodriver
140
170
  rake webdrivers:geckodriver:update[version] # Remove and download updated geckodriver if necessary
141
171
  rake webdrivers:geckodriver:version # Print current geckodriver version
@@ -144,8 +174,9 @@ rake webdrivers:iedriver:update[version] # Remove and download updated IEDr
144
174
  rake webdrivers:iedriver:version # Print current IEDriverServer version
145
175
  ```
146
176
 
147
- These tasks respect the `WD_INSTALL_DIR` and `WD_CACHE_TIME` environment
148
- variables which can also be passed through the `rake` command:
177
+ These tasks respect the `WD_INSTALL_DIR`, `WD_CACHE_TIME`, `WD_CHROME_PATH`,
178
+ and `WD_EDGE_CHROME_PATH` environment variables, which can also be passed
179
+ through the `rake` command:
149
180
 
150
181
  ```bash
151
182
  $ bundle exec rake webdrivers:chromedriver:update[2.46] webdrivers:geckodriver:update[0.24.0] WD_CACHE_TIME=86_400 WD_INSTALL_DIR='my_dir'
@@ -165,44 +196,67 @@ The logging level can be configured for debugging purpose:
165
196
  Webdrivers.logger.level = :DEBUG
166
197
  ```
167
198
 
168
- ### Browser Specific Notes
199
+ ### Browser & OS Specific Notes
169
200
 
170
201
  #### Chrome/Chromium
171
202
 
172
203
  The version of `chromedriver` will depend on the version of Chrome you are using it with:
173
204
 
174
- * For versions >= 70, the downloaded version of `chromedriver` will match the installed version of Google Chrome.
205
+ * For versions >= 70, the downloaded version of `chromedriver` will match the installed version of Google Chrome.
175
206
  More information [here](http://chromedriver.chromium.org/downloads/version-selection).
176
207
  * For versions <= 69, `chromedriver` version 2.41 will be downloaded.
177
- * For beta versions, you'll have to require the beta version of `chromedriver`
208
+ * For beta versions, you'll have to require the beta version of `chromedriver`
178
209
  using `Webdrivers::Chromedriver.required_version`.
179
-
180
- The gem looks for the Chrome/Chromium version that `chromedriver` will use by default.
210
+
211
+ The gem looks for the Chrome/Chromium version that `chromedriver` will use by default.
181
212
  You can override this behavior by providing a path to the browser binary you want to use:
182
213
 
183
214
  ```ruby
184
215
  Selenium::WebDriver::Chrome.path = '/chromium/install/path/to/binary'
185
216
  ```
186
217
 
187
- This is also required if Google Chrome is not installed in its
218
+ Alternatively, you can define the path via the `WD_CHROME_PATH` environment
219
+ variable.
220
+
221
+ This is also required if Google Chrome is not installed in its
188
222
  [default location](https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver).
189
223
 
190
- ##### Heroku/CircleCI Users
224
+ #### Chrome on Heroku
225
+
226
+ Follow the specific instructions [here](https://github.com/titusfortner/webdrivers/wiki/Heroku-buildpack-google-chrome) if you're using `heroku-buildpack-google-chrome`.
227
+
228
+ #### Microsoft Edge (Chromium)
229
+
230
+ Microsoft Edge (Chromium) support was added in v4.1.0. Notes
231
+ from the [Chrome/Chromium](https://github.com/titusfortner/webdrivers#chromechromium)
232
+ section apply to this browser as well.
233
+
234
+ Please note that `msedgedriver` requires `selenium-webdriver` v4.
235
+
236
+ #### WSLv1 support
237
+
238
+ While WSLv1 is not designed to run headful applications like Chrome, it can run exes; as such when found to be running
239
+ in WSL, `webdrivers` will use Chrome on the Windows filesystem.
240
+
241
+ It's recommended that you install the new PowerShell (PS7) to avoid [a known issue](https://github.com/microsoft/terminal/issues/367)
242
+ with the console font being changed when calling the old PowerShell (PS5).
243
+
244
+ #### WSLv2 support
191
245
 
192
- Follow the specific instructions [here](https://github.com/titusfortner/webdrivers/wiki/Heroku-buildpack-google-chrome) if your CI environment provides custom shims for Chrome or Chromium.
246
+ Webdrivers will detect WSLv2 as running on Linux and use Chrome on the Linux filesystem.
193
247
 
194
- #### Microsoft Edge
248
+ WSLv2 doesn't support connecting to host ports out of the box, so it isn't possible to connect to Chromedriver on
249
+ Windows without extra configurations, see: https://github.com/microsoft/WSL/issues/4619. The simplest way to use
250
+ Chromedriver with WSLv2 is to run Chrome headless on Linux.
195
251
 
196
- Microsoft Edge support for v18 and older has been removed for now, as it is currently
197
- unreliable. To use Microsoft Edge, please visit the [Downloads and Installation page](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads).
252
+ #### Chrome and Edge on Apple M1 (`arm64`)
198
253
 
199
- Support for [`msedgedriver`](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)
200
- will be added once the next Microsoft Edge version (v75) is released. More information is available
201
- [here](https://developer.microsoft.com/en-us/microsoft-edge/).
254
+ If you're switching from Intel to M1, you'll have to manually delete the existing Intel (`mac64`) driver before the
255
+ M1 (`arm64`) build can be downloaded. Otherwise, you'll get an error: `Bad CPU type in executable - ~/.webdrivers/chromedriver (Errno::E086)`
202
256
 
203
257
  ## Wiki
204
258
 
205
- Please see the [wiki](https://github.com/titusfortner/webdrivers/wiki)
259
+ Please see the [wiki](https://github.com/titusfortner/webdrivers/wiki)
206
260
  for solutions to commonly reported issues.
207
261
 
208
262
  Join us in the `#webdrivers-gem` channel on [Slack](https://seleniumhq.herokuapp.com/)
@@ -215,5 +269,5 @@ see LICENSE.txt for full details and copyright.
215
269
 
216
270
  ## Contributing
217
271
 
218
- Bug reports and pull requests are welcome [on GitHub](https://github.com/titusfortner/webdrivers).
272
+ Bug reports and pull requests are welcome [on GitHub](https://github.com/titusfortner/webdrivers).
219
273
  Run `bundle exec rake` and squash the commits in your PRs.
@@ -1,21 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Webdrivers
4
+ #
5
+ # @api private
6
+ #
4
7
  class ChromeFinder
5
8
  class << self
6
9
  def version
7
- location = Selenium::WebDriver::Chrome.path || send("#{System.platform}_location")
8
10
  version = send("#{System.platform}_version", location)
9
-
10
- raise VersionError, 'Failed to find Chrome binary or its version.' if version.nil? || version.empty?
11
+ raise VersionError, 'Failed to determine Chrome version.' if version.nil? || version.empty?
11
12
 
12
13
  Webdrivers.logger.debug "Browser version: #{version}"
13
14
  version[/\d+\.\d+\.\d+\.\d+/] # Google Chrome 73.0.3683.75 -> 73.0.3683.75
14
15
  end
15
16
 
16
- def win_location
17
- return Selenium::WebDriver::Chrome.path unless Selenium::WebDriver::Chrome.path.nil?
17
+ def location
18
+ chrome_bin = user_defined_location || send("#{System.platform}_location")
19
+ return chrome_bin unless chrome_bin.nil?
20
+
21
+ raise BrowserNotFound, 'Failed to determine Chrome binary location.'
22
+ end
23
+
24
+ private
25
+
26
+ def user_defined_location
27
+ if Selenium::WebDriver::Chrome.path
28
+ Webdrivers.logger.debug "Selenium::WebDriver::Chrome.path: #{Selenium::WebDriver::Chrome.path}"
29
+ return Selenium::WebDriver::Chrome.path
30
+ end
31
+
32
+ return if ENV['WD_CHROME_PATH'].nil?
18
33
 
34
+ Webdrivers.logger.debug "WD_CHROME_PATH: #{ENV['WD_CHROME_PATH']}"
35
+ ENV['WD_CHROME_PATH']
36
+ end
37
+
38
+ def win_location
19
39
  envs = %w[LOCALAPPDATA PROGRAMFILES PROGRAMFILES(X86)]
20
40
  directories = ['\\Google\\Chrome\\Application', '\\Chromium\\Application']
21
41
  file = 'chrome.exe'
@@ -26,6 +46,30 @@ module Webdrivers
26
46
  return option if File.exist?(option)
27
47
  end
28
48
  end
49
+
50
+ nil
51
+ end
52
+
53
+ def wsl_location
54
+ _, drive, user = ENV['PATH'].match(%r{/([a-z])/Users/([^/:]+)/AppData/}).to_a
55
+
56
+ roots = [
57
+ "#{drive}:\\Users\\#{user}\\AppData\\Local",
58
+ "#{drive}:\\Program Files (x86)",
59
+ "#{drive}:\\Program Files"
60
+ ]
61
+
62
+ directories = %w[Google\\Chrome\\Application Chromium\\Application]
63
+ file = 'chrome.exe'
64
+
65
+ directories.each do |dir|
66
+ roots.each do |root|
67
+ option = System.to_wsl_path("#{root}\\#{dir}\\#{file}")
68
+ return option if File.exist?(option)
69
+ end
70
+ end
71
+
72
+ nil
29
73
  end
30
74
 
31
75
  def mac_location
@@ -39,10 +83,24 @@ module Webdrivers
39
83
  return option if File.exist?(option)
40
84
  end
41
85
  end
86
+
87
+ nil
42
88
  end
43
89
 
44
90
  def linux_location
45
- directories = %w[/usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /opt/google/chrome]
91
+ return wsl_location if System.wsl_v1?
92
+
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
+ ]
46
104
  files = %w[google-chrome chrome chromium chromium-browser]
47
105
 
48
106
  directories.each do |dir|
@@ -51,18 +109,28 @@ module Webdrivers
51
109
  return option if File.exist?(option)
52
110
  end
53
111
  end
112
+
113
+ nil
54
114
  end
55
115
 
56
116
  def win_version(location)
57
- System.call("powershell (Get-ItemProperty '#{location}').VersionInfo.ProductVersion")&.strip
117
+ System.call("pwsh.exe -command \"(Get-ItemProperty '#{location}').VersionInfo.ProductVersion\"")&.strip
118
+ rescue StandardError
119
+ System.call("powershell.exe \"(Get-ItemProperty '#{location}').VersionInfo.ProductVersion\"")&.strip
120
+ end
121
+
122
+ def wsl_version(location)
123
+ win_version(System.to_win32_path(location))
58
124
  end
59
125
 
60
126
  def linux_version(location)
61
- System.call("#{Shellwords.escape location} --product-version")&.strip
127
+ return wsl_version(location) if System.wsl_v1?
128
+
129
+ System.call(location, '--product-version')&.strip
62
130
  end
63
131
 
64
132
  def mac_version(location)
65
- System.call("#{Shellwords.escape location} --version")&.strip
133
+ System.call(location, '--version')&.strip
66
134
  end
67
135
  end
68
136
  end
@@ -29,9 +29,14 @@ module Webdrivers
29
29
  def latest_version
30
30
  @latest_version ||= begin
31
31
  # Versions before 70 do not have a LATEST_RELEASE file
32
- return normalize_version('2.41') if release_version < normalize_version('70')
32
+ return normalize_version('2.41') if browser_build_version < normalize_version('70')
33
33
 
34
- latest_applicable = with_cache(file_name) { latest_point_release(release_version) }
34
+ # Cache check
35
+ # Cached version should exist and be compatible with the current browser version.
36
+ # Otherwise, fetch the latest compatible driver.
37
+ latest_applicable = with_cache(file_name,
38
+ current_build_version,
39
+ browser_build_version) { latest_point_release(browser_build_version) }
35
40
 
36
41
  Webdrivers.logger.debug "Latest version available: #{latest_applicable}"
37
42
  normalize_version(latest_applicable)
@@ -42,9 +47,10 @@ module Webdrivers
42
47
  # Returns currently installed Chrome/Chromium version.
43
48
  #
44
49
  # @return [Gem::Version]
45
- def chrome_version
50
+ def browser_version
46
51
  normalize_version ChromeFinder.version
47
52
  end
53
+ alias chrome_version browser_version
48
54
 
49
55
  #
50
56
  # Returns url with domain for calls to get this driver.
@@ -67,64 +73,84 @@ module Webdrivers
67
73
  else
68
74
  msg
69
75
  end
70
- rescue NetworkError
71
- "#{msg} A network issue is preventing determination of latest chromedriver release."
76
+ rescue NetworkError
77
+ "#{msg} A network issue is preventing determination of latest chromedriver release."
72
78
  end
73
79
 
74
80
  msg = "#{msg} Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` "\
75
- 'to a known chromedriver version: https://chromedriver.storage.googleapis.com/index.html'
76
-
81
+ 'to a known chromedriver version: https://chromedriver.storage.googleapis.com/index.html'
77
82
  Webdrivers.logger.debug msg
78
83
  raise VersionError, msg
79
84
  end
80
85
 
81
86
  def file_name
82
- System.platform == 'win' ? 'chromedriver.exe' : 'chromedriver'
87
+ System.platform == 'win' || System.wsl_v1? ? 'chromedriver.exe' : 'chromedriver'
88
+ end
89
+
90
+ def apple_m1_compatible?(driver_version)
91
+ if System.apple_m1_architecture? && driver_version >= normalize_version('87.0.4280.88')
92
+ Webdrivers.logger.debug 'chromedriver version is Apple M1 compatible.'
93
+ return true
94
+ end
95
+
96
+ Webdrivers.logger.debug 'chromedriver version is NOT Apple M1 compatible. Required >= 87.0.4280.88'
97
+ false
83
98
  end
84
99
 
85
- def download_url
86
- return @download_url if @download_url
100
+ def apple_filename(driver_version)
101
+ if apple_m1_compatible?(driver_version)
102
+ driver_version >= normalize_version('106.0.5249.61') ? 'mac_arm64' : 'mac64_m1'
103
+ else
104
+ 'mac64'
105
+ end
106
+ end
107
+
108
+ def direct_url(driver_version)
109
+ "#{base_url}/#{driver_version}/chromedriver_#{driver_filename(driver_version)}.zip"
110
+ end
87
111
 
88
- version = if required_version == EMPTY_VERSION
89
- latest_version
90
- else
91
- normalize_version(required_version)
92
- end
112
+ def driver_filename(driver_version)
113
+ if System.platform == 'win' || System.wsl_v1?
114
+ 'win32'
115
+ elsif System.platform == 'linux'
116
+ 'linux64'
117
+ elsif System.platform == 'mac'
118
+ apple_filename(driver_version)
119
+ else
120
+ raise 'Failed to determine driver filename to download for your OS.'
121
+ end
122
+ end
93
123
 
94
- file_name = System.platform == 'win' ? 'win32' : "#{System.platform}64"
95
- url = "#{base_url}/#{version}/chromedriver_#{file_name}.zip"
96
- Webdrivers.logger.debug "chromedriver URL: #{url}"
97
- @download_url = url
124
+ # Returns major.minor.build version from the currently installed chromedriver version
125
+ #
126
+ # @example
127
+ # 73.0.3683.68 (major.minor.build.patch) -> 73.0.3683 (major.minor.build)
128
+ def current_build_version
129
+ build_ver = if current_version.nil? # Driver not found
130
+ nil
131
+ else
132
+ current_version.segments[0..2].join('.')
133
+ end
134
+ normalize_version(build_ver)
98
135
  end
99
136
 
100
- # Returns release version from the currently installed Chrome version
137
+ # Returns major.minor.build version from the currently installed Chrome version
101
138
  #
102
139
  # @example
103
- # 73.0.3683.75 -> 73.0.3683
104
- def release_version
105
- chrome = normalize_version(chrome_version)
106
- normalize_version(chrome.segments[0..2].join('.'))
140
+ # 73.0.3683.75 (major.minor.build.patch) -> 73.0.3683 (major.minor.build)
141
+ def browser_build_version
142
+ normalize_version(browser_version.segments[0..2].join('.'))
107
143
  end
144
+ alias chrome_build_version browser_build_version
108
145
 
146
+ # Returns true if an executable driver binary exists
147
+ # and its build version matches the browser build version
109
148
  def sufficient_binary?
110
149
  super && current_version && (current_version < normalize_version('70.0.3538') ||
111
- current_version.segments.first == release_version.segments.first)
150
+ current_build_version == browser_build_version)
112
151
  end
113
152
  end
114
153
  end
115
154
  end
116
155
 
117
- if ::Selenium::WebDriver::Service.respond_to? :driver_path=
118
- ::Selenium::WebDriver::Chrome::Service.driver_path = proc { ::Webdrivers::Chromedriver.update }
119
- else
120
- # v3.141.0 and lower
121
- module Selenium
122
- module WebDriver
123
- module Chrome
124
- def self.driver_path
125
- @driver_path ||= Webdrivers::Chromedriver.update
126
- end
127
- end
128
- end
129
- end
130
- end
156
+ ::Selenium::WebDriver::Chrome::Service.driver_path = proc { ::Webdrivers::Chromedriver.update }