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.profile_dir)
try:
FIREFOX_INSTANCE[key].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 import FirefoxOptions # pylint: disable=import-outside-toplevel
if headless:
driver_key = 'headless'
firefox_options = FirefoxOptions()
firefox_options.add_argument('-headless')
else:
driver_key = 'headed'
firefox_options = None
# Load profile, if it exists:
if os.path.isdir(PROFILE_DIR):
firefox_profile = webdriver.FirefoxProfile(PROFILE_DIR)
else:
firefox_profile = None
if FIREFOX_INSTANCE[driver_key] is None:
FIREFOX_INSTANCE[driver_key] = webdriver.Firefox(
firefox_profile=firefox_profile,
options=firefox_options,
)
yield FIREFOX_INSTANCE[driver_key]