Skip to content

Commit b8ba74f

Browse files
Download latest driver version even if browser version is unknown (#260)
* Optimization: define env var GH_TOKEN for all jobs * install stable chromium on mac * Tests: adopt edge tests for CI. * [#254] softly download latest webdriver version... even if browser version is UNKNOWN. * CI: add tests on windows github actions * [#259] fix duplicating logs when "latest" version's found * up version to 3.5.2 and update changelog
1 parent c7e6e7d commit b8ba74f

File tree

10 files changed

+98
-66
lines changed

10 files changed

+98
-66
lines changed

.github/workflows/test.yml

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ on:
99
jobs:
1010
test:
1111
runs-on: ${{ matrix.os }}
12+
env:
13+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1214
strategy:
1315
fail-fast: false
1416
matrix:
15-
os: [ ubuntu-latest, macos-latest ]
17+
os: [ ubuntu-latest, macos-latest, windows-latest ]
1618
python-version: [ '3.6', '3.10' ]
1719

1820
steps:
@@ -48,13 +50,13 @@ jobs:
4850
shell: powershell
4951
run: |
5052
choco install chromium opera --no-progress -y --force
51-
.github\set_win_reg_keys.ps1
5253
5354
- name: Install browsers on MacOS
5455
if: startsWith(runner.os, 'macOS')
5556
run: |
57+
brew tap domt4/chromium
5658
brew update
57-
brew install --cask chromium opera
59+
brew install --cask mac-chromium opera
5860
5961
- name: Install Python dependencies
6062
run: |
@@ -64,24 +66,18 @@ jobs:
6466
6567
- name: Run tests on Linux (with xvfb)
6668
if: runner.os == 'Linux'
67-
env:
68-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
6969
uses: GabrielBB/xvfb-action@v1.0
7070
with:
7171
run: |
7272
pipenv run py.test -sv --cov-config .coveragerc --cov-report xml --cov-report term:skip-covered --cov=webdriver_manager --tb=short tests/
7373
7474
- name: Run tests on Windows (without xvfb)
7575
if: runner.os == 'Windows'
76-
env:
77-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7876
run: |
7977
pipenv run py.test -sv --cov-config .coveragerc --cov-report xml --cov-report term:skip-covered --cov=webdriver_manager --tb=short tests/
8078
8179
- name: Run tests on MacOS (without xvfb)
8280
if: startsWith(runner.os, 'macOS')
83-
env:
84-
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
8581
run: |
8682
pipenv run py.test -sv --cov-config .coveragerc --cov-report xml --cov-report term:skip-covered --cov=webdriver_manager --tb=short tests/
8783

CHANGELOG.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
---
44
## 3.5.2
5-
### SSL
6-
- Feature: now you can disable SSL verification by setting `os.environ['WDM_SSL_VERIFY']='0'` in case if you have troubles with SSL Certificates or SSL Certificate Chain (like in issues
5+
### Features
6+
- SSL verification can be disabled by setting `os.environ['WDM_SSL_VERIFY']='0'` in case if you have troubles with SSL Certificates or SSL Certificate Chain (like in issues
77
[#219](https://github.com/SergeyPirogov/webdriver_manager/issues/219), [#226](https://github.com/SergeyPirogov/webdriver_manager/issues/226))
8+
### Fixes
9+
- Log duplication ([#259](https://github.com/SergeyPirogov/webdriver_manager/issues/259))
10+
- Failed to Download the Edge driver for particular Version ([#251](https://github.com/SergeyPirogov/webdriver_manager/issues/251))
11+
- WDM_LOG_LEVEL not work ([#255](https://github.com/SergeyPirogov/webdriver_manager/issues/255))
12+
### Improvements
13+
- Softly download latest webdriver version even if browser version is unknown. ([#254](https://github.com/SergeyPirogov/webdriver_manager/issues/254), also fixes [#251](https://github.com/SergeyPirogov/webdriver_manager/issues/251))
14+
- Speed up when using "latest" version ([#259](https://github.com/SergeyPirogov/webdriver_manager/issues/259))
815
---
916
## 3.5.1
1017
### IEDriver

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 3.5.1
2+
current_version = 3.5.2
33
commit = True
44
tag = True
55

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
long_description_content_type="text/markdown",
2424
packages=setuptools.find_packages(exclude=['tests']),
2525
include_package_data=True,
26-
version='3.5.1',
26+
version='3.5.2',
2727
description=('Library provides the way to automatically manage drivers for different browsers'),
2828
author='Sergey Pirogov',
2929
author_email='automationremarks@gmail.com',

tests/test_edge_driver.py

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,6 @@ def test_edge_manager_with_wrong_version():
4545
) in ex.value.args[0]
4646

4747

48-
@pytest.mark.parametrize('os_type', ['win32', 'win64', 'linux64', 'mac64'])
49-
def test_can_download_edge_driver(os_type):
50-
path = EdgeChromiumDriverManager(os_type=os_type).install()
51-
assert os.path.exists(path)
52-
53-
54-
@pytest.mark.parametrize('os_type', ['win32', 'win64', 'mac64', 'linux64'])
55-
def test_can_get_edge_driver_from_cache(os_type):
56-
EdgeChromiumDriverManager(os_type=os_type).install()
57-
driver_path = EdgeChromiumDriverManager(os_type=os_type).install()
58-
assert os.path.exists(driver_path)
59-
60-
6148
@pytest.mark.parametrize('os_type', ['win32', 'win64', 'mac64', 'linux64'])
6249
@pytest.mark.parametrize('specific_version', ['86.0.600.0'])
6350
def test_edge_with_specific_version(os_type, specific_version):
@@ -66,3 +53,17 @@ def test_edge_with_specific_version(os_type, specific_version):
6653
os_type=os_type,
6754
).install()
6855
assert os.path.exists(bin_path)
56+
57+
58+
@pytest.mark.parametrize('os_type', ['win32', 'win64', 'mac64', 'linux64'])
59+
@pytest.mark.parametrize('specific_version', ['87.0.637.0'])
60+
def test_can_get_edge_driver_from_cache(os_type, specific_version):
61+
EdgeChromiumDriverManager(
62+
version=specific_version,
63+
os_type=os_type,
64+
).install()
65+
driver_path = EdgeChromiumDriverManager(
66+
version=specific_version,
67+
os_type=os_type
68+
).install()
69+
assert os.path.exists(driver_path)

webdriver_manager/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '3.5.1'
1+
__version__ = '3.5.2'

webdriver_manager/chrome.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from webdriver_manager import utils
55
from webdriver_manager.driver import ChromeDriver
6-
from webdriver_manager.logger import log
76
from webdriver_manager.manager import DriverManager
87
from webdriver_manager.utils import ChromeType
98

@@ -30,7 +29,6 @@ def __init__(self, version="latest",
3029
chrome_type=chrome_type)
3130

3231
def install(self):
33-
log(f"Current {self.driver.chrome_type} version is {self.driver.browser_version}", first_line=True)
3432
driver_path = self._get_driver_path(self.driver)
3533

3634
os.chmod(driver_path, 0o755)

webdriver_manager/driver.py

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -52,21 +52,28 @@ def __init__(self, name, version, os_type, url, latest_release_url,
5252
super(ChromeDriver, self).__init__(name, version, os_type, url,
5353
latest_release_url)
5454
self.chrome_type = chrome_type
55-
self.browser_version = get_browser_version_from_os(chrome_type)
55+
self.browser_version = ""
5656

5757
def get_os_type(self):
5858
if "win" in super().get_os_type():
5959
return "win32"
6060
return super().get_os_type()
6161

6262
def get_latest_release_version(self):
63-
log(f"Get LATEST driver version for {self.browser_version}")
63+
self.browser_version = get_browser_version_from_os(self.chrome_type)
64+
log(f"Get LATEST {self._name} version for {self.browser_version} {self.chrome_type}")
65+
latest_release_url = (
66+
f"{self._latest_release_url}_{self.browser_version}"
67+
if self.browser_version != "UNKNOWN"
68+
else self._latest_release_url
69+
)
6470
resp = requests.get(
65-
url=f"{self._latest_release_url}_{self.browser_version}",
71+
url=latest_release_url,
6672
verify=self.ssl_verify
6773
)
6874
validate_response(resp)
69-
return resp.text.rstrip()
75+
self._version = resp.text.rstrip()
76+
return self._version
7077

7178

7279
class GeckoDriver(Driver):
@@ -87,7 +94,7 @@ def __init__(
8794
latest_release_url,
8895
)
8996
self._mozila_release_tag = mozila_release_tag
90-
self.browser_version = firefox_version()
97+
self.browser_version = ""
9198
self._os_token = os.getenv("GH_TOKEN", None)
9299
self.auth_header = (
93100
{'Authorization': f'token {self._os_token}'}
@@ -98,14 +105,16 @@ def __init__(
98105
log("GH_TOKEN will be used to perform requests", first_line=True)
99106

100107
def get_latest_release_version(self) -> str:
101-
log(f"Get LATEST driver version for {self.browser_version}")
108+
self.browser_version = firefox_version()
109+
log(f"Get LATEST {self._name} version for {self.browser_version} firefox")
102110
resp = requests.get(
103111
url=self.latest_release_url,
104112
headers=self.auth_header,
105113
verify=self.ssl_verify,
106114
)
107115
validate_response(resp)
108-
return resp.json()["tag_name"]
116+
self._version = resp.json()["tag_name"]
117+
return self._version
109118

110119
def get_url(self):
111120
"""Like https://github.com/mozilla/geckodriver/releases/download/v0.11.1/geckodriver-v0.11.1-linux64.tar.gz"""
@@ -185,7 +194,8 @@ def get_latest_release_version(self) -> str:
185194
for asset in release['assets']
186195
if asset['name'].startswith(self.get_name())
187196
)
188-
return release['tag_name'].replace('selenium-', '')
197+
self._version = release['tag_name'].replace('selenium-', '')
198+
return self._version
189199

190200
def get_url(self):
191201
"""Like https://github.com/seleniumhq/selenium/releases/download/3.141.59/IEDriverServer_Win32_3.141.59.zip"""
@@ -249,7 +259,8 @@ def get_latest_release_version(self) -> str:
249259
verify=self.ssl_verify,
250260
)
251261
validate_response(resp)
252-
return resp.json()["tag_name"]
262+
self._version = resp.json()["tag_name"]
263+
return self._version
253264

254265
def get_url(self) -> str:
255266
# https://github.com/operasoftware/operachromiumdriver/releases/download/v.2.45/operadriver_linux64.zip
@@ -291,15 +302,22 @@ def __init__(
291302
url,
292303
latest_release_url,
293304
)
294-
self.browser_version = get_browser_version_from_os(ChromeType.MSEDGE)
305+
self.browser_version = ""
295306

296307
def get_latest_release_version(self) -> str:
297-
major_edge_version = self.browser_version.split(".")[0]
298-
latest_release_url = {
299-
OSType.WIN in self.get_os_type(): f'{self._latest_release_url}_{major_edge_version}_WINDOWS',
300-
OSType.MAC in self.get_os_type(): f'{self._latest_release_url}_{major_edge_version}_MACOS',
301-
OSType.LINUX in self.get_os_type(): f'{self._latest_release_url}_{major_edge_version}_LINUX',
302-
}[True]
308+
self.browser_version = get_browser_version_from_os(ChromeType.MSEDGE)
309+
log(f"Get LATEST {self._name} version for {self.browser_version} Edge")
310+
major_edge_version = self.browser_version.split(".")[0] if self.browser_version != 'UNKNOWN' else None
311+
latest_release_url = (
312+
{
313+
OSType.WIN in self.get_os_type(): f'{self._latest_release_url}_{major_edge_version}_WINDOWS',
314+
OSType.MAC in self.get_os_type(): f'{self._latest_release_url}_{major_edge_version}_MACOS',
315+
OSType.LINUX in self.get_os_type(): f'{self._latest_release_url}_{major_edge_version}_LINUX',
316+
}[True]
317+
if self.browser_version != "UNKNOWN"
318+
else self._latest_release_url.replace('LATEST_RELEASE', 'LATEST_STABLE')
319+
)
303320
resp = requests.get(latest_release_url, verify=self.ssl_verify)
304321
validate_response(resp)
305-
return resp.text.rstrip()
322+
self._version = resp.text.rstrip()
323+
return self._version

webdriver_manager/firefox.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from webdriver_manager import utils
44
from webdriver_manager.driver import GeckoDriver
55
from webdriver_manager.manager import DriverManager
6-
from webdriver_manager.logger import log
76

87

98
class GeckoDriverManager(DriverManager):
@@ -27,5 +26,4 @@ def __init__(self, version="latest",
2726
mozila_release_tag=mozila_release_tag)
2827

2928
def install(self):
30-
log(f"Current firefox version is {self.driver.browser_version}", first_line=True)
3129
return self._get_driver_path(self.driver)

webdriver_manager/utils.py

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,11 @@ def validate_response(resp):
7979
if resp.status_code == 404:
8080
raise ValueError("There is no such driver by url {}".format(resp.url))
8181
elif resp.status_code != 200:
82-
raise ValueError(resp.json())
82+
raise ValueError(
83+
f'response body:\n{resp.json()}\n'
84+
f'request url:\n{resp.request.url}\n'
85+
f'response headers:\n{dict(resp.headers)}\n'
86+
)
8387

8488

8589
def write_file(content, path):
@@ -149,35 +153,45 @@ def get_browser_version_from_os(browser_type=None):
149153
}
150154

151155
cmd = cmd_mapping[browser_type][os_name()]
152-
version = None
153-
with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL,
154-
shell=True) as stream:
155-
stdout = stream.communicate()[0].decode()
156-
version = re.search(pattern, stdout)
156+
version = read_version_from_cmd(cmd, pattern)
157157

158158
if not version:
159-
raise ValueError(
160-
f'Could not get version for {browser_type} with the command: {cmd}'
161-
)
162-
current_version = version.group(0)
159+
log(f'Could not get version for {browser_type} with the any command: {cmd}')
160+
161+
current_version = version.group(0) if version else 'UNKNOWN'
162+
163+
log(f"Current {browser_type} version is {current_version}")
163164
return current_version
164165

165166

166167
def firefox_version():
167-
pattern = r'\d+.*'
168+
pattern = r'(\d+.\d+)'
168169
cmd_mapping = {
169170
OSType.LINUX: 'firefox --version',
170171
OSType.MAC: r'/Applications/Firefox.app/Contents/MacOS/firefox --version',
171172
OSType.WIN: r"Powershell (Get-Item (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe').'(Default)').VersionInfo.ProductVersion",
172173
}
173174
cmd = cmd_mapping[os_name()]
174-
version = None
175-
with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL,
176-
shell=True) as stream:
177-
stdout = stream.communicate()[0].decode()
178-
version = re.search(pattern, stdout)
175+
176+
version = read_version_from_cmd(cmd, pattern)
179177

180178
if not version:
181-
raise ValueError(f'Could not get version for Firefox with this command: {cmd}')
182-
current_version = version.group(0)
179+
log(f'Could not get version for firefox with the any command: {cmd}')
180+
181+
current_version = version.group(0) if version else 'UNKNOWN'
182+
183+
log(f"Current firefox version is {current_version}")
183184
return current_version
185+
186+
187+
def read_version_from_cmd(cmd, pattern):
188+
with subprocess.Popen(
189+
cmd,
190+
stdout=subprocess.PIPE,
191+
stderr=subprocess.DEVNULL,
192+
stdin=subprocess.DEVNULL,
193+
shell=True,
194+
) as stream:
195+
stdout = stream.communicate()[0].decode()
196+
version = re.search(pattern, stdout)
197+
return version

0 commit comments

Comments
 (0)