diff --git a/deletefb/tools/chrome_driver.py b/deletefb/tools/chrome_driver.py index d19f0f6..94d2c4d 100644 --- a/deletefb/tools/chrome_driver.py +++ b/deletefb/tools/chrome_driver.py @@ -7,6 +7,7 @@ from subprocess import check_output from urllib.request import urlretrieve from appdirs import AppDirs from ..version import version +from os.path import exists import os, sys, stat, platform import progressbar @@ -22,12 +23,19 @@ try: except FileExistsError: pass -def extract_zip(filename): +def extract_zip(filename, chrome_maj_version): """ Uses zipfile package to extract a single zipfile :param filename: :return: new filename """ + + # Remove any leftover unversioned chromedriver + try: + os.remove(f"{cache_dir}/chromedriver") + except FileNotFoundError: + pass + try: _file = zipfile.ZipFile(filename, 'r') except FileNotFoundError: @@ -35,11 +43,14 @@ def extract_zip(filename): sys.exit(1) # Save the name of the new file - new_file_name = f"{cache_dir}/{_file.namelist()[0]}" + new_file_name = f"{cache_dir}/{_file.namelist()[0] + chrome_maj_version}" # Extract the file and make it executable _file.extractall(path=cache_dir) + # Rename the filename to a versioned one + os.rename(f"{cache_dir}/chromedriver", f"{cache_dir}/chromedriver{chrome_maj_version}") + driver_stat = os.stat(new_file_name) os.chmod(new_file_name, driver_stat.st_mode | stat.S_IEXEC) @@ -48,8 +59,10 @@ def extract_zip(filename): return new_file_name -def setup_selenium(driver_path, options): +def setup_selenium(options, chrome_binary_path): # Configures selenium to use a custom path + driver_path = get_webdriver(chrome_binary_path) + return webdriver.Chrome(executable_path=driver_path, options=options) def parse_version(output): @@ -88,7 +101,7 @@ def construct_driver_url(chrome_binary_path=None): 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) + return version, 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". @@ -104,57 +117,47 @@ def get_webdriver(chrome_binary_path): If Not, Download it. """ - webdriver_regex = re.compile('chromedriver') + # Download it according to the current machine + chrome_maj_version, chrome_webdriver = construct_driver_url(chrome_binary_path) - web_driver = list(filter(webdriver_regex.match, cache_dir)) + driver_path = f"{cache_dir}/chromedriver{chrome_maj_version}" + if exists(driver_path): + return driver_path - if web_driver: - # check if a extracted copy already exists - if not os.path.isfile(f"{cache_dir}/chromedriver"): - # Extract file - extract_zip(web_driver[0]) + if not chrome_webdriver: + raise UnknownOSException("Unknown Operating system platform") - return "{0}/chromedriver".format(cache_dir) - - else: - # Download it according to the current machine - - chrome_webdriver = construct_driver_url(chrome_binary_path) - - if not chrome_webdriver: - raise UnknownOSException("Unknown Operating system platform") + global total_size + def show_progress(*res): global total_size + pbar = None + downloaded = 0 + block_num, block_size, total_size = res - def show_progress(*res): - global total_size - pbar = None - downloaded = 0 - block_num, block_size, total_size = res + if not pbar: + pbar = progressbar.ProgressBar(maxval=total_size) + pbar.start() + downloaded += block_num * block_size - if not pbar: - pbar = progressbar.ProgressBar(maxval=total_size) - pbar.start() - downloaded += block_num * block_size - - if downloaded < total_size: - pbar.update(downloaded) - else: - pbar.finish() + if downloaded < total_size: + pbar.update(downloaded) + else: + pbar.finish() - puts(colored.yellow("Downloading Chrome Webdriver")) - file_name = f"{cache_dir}/{chrome_webdriver.split('/')[-1]}" - response = urlretrieve(chrome_webdriver, file_name, show_progress) + puts(colored.yellow("Downloading Chrome Webdriver")) + file_name = f"{cache_dir}/{chrome_webdriver.split('/')[-1]}" + response = urlretrieve(chrome_webdriver, file_name, show_progress) - if int(response[1].get("Content-Length")) == total_size: - puts(colored.green("Completed downloading the Chrome Driver.")) + if int(response[1].get("Content-Length")) == total_size: + puts(colored.green("Completed downloading the Chrome Driver.")) - return extract_zip(file_name) + return extract_zip(file_name, chrome_maj_version) - else: - puts(colored.red("An error Occurred While trying to download the driver.")) - # remove the downloaded file and exit - os.remove(file_name) - sys.stderr.write(NO_CHROME_DRIVER) - sys.exit(1) + else: + puts(colored.red("An error Occurred While trying to download the driver.")) + # remove the downloaded file and exit + os.remove(file_name) + sys.stderr.write(NO_CHROME_DRIVER) + sys.exit(1) diff --git a/deletefb/tools/login.py b/deletefb/tools/login.py index 65e44f4..c8e3e86 100644 --- a/deletefb/tools/login.py +++ b/deletefb/tools/login.py @@ -1,4 +1,4 @@ -from .chrome_driver import get_webdriver, setup_selenium +from .chrome_driver import setup_selenium from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.chrome.options import Options from ..quit_driver import quit_driver_and_reap_children @@ -41,8 +41,7 @@ def login(user_email_address, chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('log-level=2') - driver_path = get_webdriver(chrome_binary_path) - driver = setup_selenium(driver_path, chrome_options) + driver = setup_selenium(chrome_options, chrome_binary_path) try: driver.implicitly_wait(10)