Skip to content

Instantly share code, notes, and snippets.

@uluQulu
Created September 1, 2019 22:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save uluQulu/61b75f627334baa5fb102cb6501b9ad2 to your computer and use it in GitHub Desktop.
Save uluQulu/61b75f627334baa5fb102cb6501b9ad2 to your computer and use it in GitHub Desktop.
Subclass GeckoDriverDownloader in order to fix a bug in arch level detection.
class CustomizedGeckoDriverDownloader(GeckoDriverDownloader):
"""
Subclass GeckoDriverDownloader in order to fix finding accurate arch.
"""
def get_download_url(self, version="latest"):
"""
Default of this method finds arch of the python interpreter rather than OS.
To view the original source of this method, go to:
https://github.com/leonidessaguisagjr/webdriverdownloader/blob/master/webdriverdownloader/webdriverdownloader.py
"""
if version == "latest":
gecko_driver_version_release_api_url = self.gecko_driver_releases_api_url + version
gecko_driver_version_release_ui_url = self.gecko_driver_releases_ui_url + version
else:
gecko_driver_version_release_api_url = self.gecko_driver_releases_api_url + "tags/" + version
gecko_driver_version_release_ui_url = self.gecko_driver_releases_ui_url + "tags/" + version
info = requests.get(gecko_driver_version_release_api_url)
if info.status_code != 200:
info_message = "Error, unable to get info for gecko driver {0} release. Status code: {1}".format(
version, info.status_code)
resp = requests.get(gecko_driver_version_release_ui_url, allow_redirects=True)
if resp.status_code == 200:
json_data = {"assets": []}
soup = BeautifulSoup(resp.text, features="html.parser")
urls = [resp.url + a['href'] for a in soup.find_all('a', href=True) if r"/download/" in a['href']]
for url in urls:
json_data["assets"].append({"name": Path(urlsplit(url).path).name, "browser_download_url": url})
else:
json_data = info.json()
os_name = platform.system()
if os_name == "Darwin":
os_name = "macos"
elif os_name == "Windows":
os_name = "win"
elif os_name == "Linux":
os_name = "linux"
bitness = "64" if platform.machine().endswith('64') else "32"
filenames = [asset['name'] for asset in json_data['assets']]
filename = [name for name in filenames if os_name in name]
if len(filename) == 0:
info_message = "Error, unable to find a download for os: {0}".format(os_name)
raise RuntimeError(info_message)
if len(filename) > 1:
filename = [name for name in filenames if os_name + bitness in name]
if len(filename) != 1:
info_message = "Error, unable to determine correct filename for {0}bit {1}".format(bitness, os_name)
raise RuntimeError(info_message)
filename = filename[0]
result = json_data['assets'][filenames.index(filename)]['browser_download_url']
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment