Browse Source

Starting a refactor of all chrome driver code (#105)

* Starting a refactor of all chrome driver code

* proper chrome version extraction
pull/120/head
Wesley Kerfoot 4 years ago
committed by GitHub
parent
commit
82d749f261
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      deletefb/exceptions.py
  2. 67
      deletefb/tools/chrome_driver.py
  3. 2
      deletefb/tools/login.py

3
deletefb/exceptions.py

@ -1,2 +1,5 @@
class UnknownOSException(Exception): class UnknownOSException(Exception):
pass pass
class ChromeError(Exception):
pass

67
deletefb/tools/chrome_driver.py

@ -1,19 +1,16 @@
from ..exceptions import UnknownOSException from ..exceptions import UnknownOSException, ChromeError
from .common import NO_CHROME_DRIVER from .common import NO_CHROME_DRIVER
from clint.textui import puts, colored from clint.textui import puts, colored
from selenium import webdriver from selenium import webdriver
from shutil import which
from subprocess import check_output
from urllib.request import urlretrieve from urllib.request import urlretrieve
import os, sys, stat, platform import os, sys, stat, platform
import progressbar import progressbar
import re import re
import zipfile import zipfile
import requests
chrome_drivers = {
"Windows" : "https://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_win32.zip",
"Darwin" : "https://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_mac64.zip",
"Linux" : "https://chromedriver.storage.googleapis.com/80.0.3987.16/chromedriver_linux64.zip"
}
def extract_zip(filename): def extract_zip(filename):
""" """
@ -45,7 +42,54 @@ def setup_selenium(driver_path, options):
# Configures selenium to use a custom path # Configures selenium to use a custom path
return webdriver.Chrome(executable_path=driver_path, options=options) return webdriver.Chrome(executable_path=driver_path, options=options)
def get_webdriver(): def parse_version(output):
"""
Attempt to extract version number from chrome version string.
"""
return [c for c in re.split('([0-9]+)\.?', output.decode("utf-8")) if all(d.isdigit() for d in c) and c][0]
def get_chrome_version(chrome_binary_path=None):
"""
Extract the chrome major version.
"""
driver_locations = [which(loc) for loc in ["google-chrome", "google-chrome-stable", "chromium", "chrome.exe"]]
for location in driver_locations:
print(location)
if location:
return parse_version(check_output([location, "--version"]).strip())
return None
def construct_driver_url(chrome_binary_path=None):
"""
Construct a URL to download the Chrome Driver.
"""
platform_string = platform.system()
chrome_drivers = {
"Windows" : "https://chromedriver.storage.googleapis.com/{0}/chromedriver_win32.zip",
"Darwin" : "https://chromedriver.storage.googleapis.com/{0}/chromedriver_mac64.zip",
"Linux" : "https://chromedriver.storage.googleapis.com/{0}/chromedriver_linux64.zip"
}
version = get_chrome_version()
if version is None:
raise ChromeError("Chrome version not found")
latest_release_url = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{0}".format(version)
return chrome_drivers.get(platform_string).format(requests.get(latest_release_url).text)
# First, construct a LATEST_RELEASE URL using Chrome's major version number.
# For example, with Chrome version 73.0.3683.86, use URL "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_73".
# Try to download a small file from this URL. If it successful, the file contains the ChromeDriver version to use.
# If the above step failed, reduce the Chrome major version by 1 and try again.
# For example, with Chrome version 75.0.3745.4, use URL "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_74"
# to download a small file, which contains the ChromeDriver version to use.
# You can also use ChromeDriver Canary build.
def get_webdriver(chrome_binary_path):
""" """
Ensure a webdriver is available Ensure a webdriver is available
If Not, Download it. If Not, Download it.
@ -65,7 +109,8 @@ def get_webdriver():
else: else:
# Download it according to the current machine # Download it according to the current machine
chrome_webdriver = chrome_drivers.get(platform.system(), False) chrome_webdriver = construct_driver_url(chrome_binary_path)
if not chrome_webdriver: if not chrome_webdriver:
raise UnknownOSException("Unknown Operating system platform") raise UnknownOSException("Unknown Operating system platform")
@ -91,8 +136,8 @@ def get_webdriver():
file_name = chrome_webdriver.split('/')[-1] file_name = chrome_webdriver.split('/')[-1]
response = urlretrieve(chrome_webdriver, file_name, show_progress) response = urlretrieve(chrome_webdriver, file_name, show_progress)
if int(response[1].get('Content-Length')) == total_size: if int(response[1].get("Content-Length")) == total_size:
puts(colored.green(f"DONE!")) puts(colored.green("Completed downloading the Chrome Driver."))
return "{0}/{1}".format(os.getcwd(), extract_zip(file_name)) return "{0}/{1}".format(os.getcwd(), extract_zip(file_name))

2
deletefb/tools/login.py

@ -40,7 +40,7 @@ def login(user_email_address,
chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('log-level=2') chrome_options.add_argument('log-level=2')
driver_path = get_webdriver() driver_path = get_webdriver(chrome_binary_path)
driver = setup_selenium(driver_path, chrome_options) driver = setup_selenium(driver_path, chrome_options)
driver.implicitly_wait(10) driver.implicitly_wait(10)

Loading…
Cancel
Save