Source code for kibitzr.fetcher.browser.launcher

"""
FireFox housekeeping - starting and stopping process
"""

import os
import shutil
import logging
from contextlib import contextmanager


PROFILE_DIR = 'firefox_profile'
logger = logging.getLogger(__name__)
FIREFOX_INSTANCE = {
    'headless': None,
    'headed': None,
}


[docs]def cleanup(): """Must be called before exit""" temp_dirs = [] for key in ('headless', 'headed'): if FIREFOX_INSTANCE[key] is not None: if FIREFOX_INSTANCE[key]['profile']: temp_dirs.append(FIREFOX_INSTANCE[key]['profile'].path) try: FIREFOX_INSTANCE[key]['webdriver'].quit() FIREFOX_INSTANCE[key] = None except: logger.exception( "Exception occurred in browser cleanup" ) for temp_dir in temp_dirs: shutil.rmtree(temp_dir, ignore_errors=True)
[docs]@contextmanager def firefox(headless=True): """ Context manager returning Selenium webdriver. Instance is reused and must be cleaned up on exit. """ from selenium import webdriver # pylint: disable=import-outside-toplevel from selenium.webdriver.firefox.options import Options # pylint: disable=import-outside-toplevel firefox_options = Options() if headless: driver_key = 'headless' firefox_options.add_argument('-headless') else: driver_key = 'headed' # Load profile, if it exists: if os.path.isdir(PROFILE_DIR): firefox_profile = webdriver.FirefoxProfile(PROFILE_DIR) firefox_options.profile = firefox_profile else: firefox_profile = None if FIREFOX_INSTANCE[driver_key] is None: FIREFOX_INSTANCE[driver_key] = { 'webdriver': webdriver.Firefox(options=firefox_options), 'profile': firefox_profile } yield FIREFOX_INSTANCE[driver_key]['webdriver']