diff options
Diffstat (limited to 'test/unit/conftest.py')
-rw-r--r-- | test/unit/conftest.py | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/test/unit/conftest.py b/test/unit/conftest.py index f9a17f8..beffaf5 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -34,6 +34,7 @@ from selenium.webdriver.support import expected_conditions as EC from ..profiles import firefox_safe_mode from ..server import do_an_internet from ..extension_crafting import make_extension +from ..world_wide_library import start_serving_script, dump_scripts @pytest.fixture(scope="package") def proxy(): @@ -77,55 +78,55 @@ def webextension(driver, request): driver.uninstall_addon(addon_id) ext_path.unlink() -script_injecting_script = '''\ +script_injector_script = '''\ /* * Selenium by default executes scripts in some weird one-time context. We want * separately-loaded scripts to be able to access global variables defined * before, including those declared with `const` or `let`. To achieve that, we - * run our scripts by injecting them into the page inside a <script> tag. We use - * custom properties of the `window` object to communicate with injected code. + * run our scripts by injecting them into the page with a <script> tag that runs + * javascript served by our proxy. We use custom properties of the `window` + * object to communicate with injected code. */ - -const script_elem = document.createElement('script'); -script_elem.textContent = arguments[0]; - -delete window.haketilo_selenium_return_value; -delete window.haketilo_selenium_exception; -window.returnval = (val => window.haketilo_selenium_return_value = val); -window.arguments = arguments[1]; - -document.body.append(script_elem); - -/* - * To ease debugging, we want this script to signal all exceptions from the - * injectee. - */ -try { +const inject = async () => { + delete window.haketilo_selenium_return_value; + delete window.haketilo_selenium_exception; + window.returnval = val => window.haketilo_selenium_return_value = val; + + const injectee = document.createElement('script'); + injectee.src = arguments[0]; + injectee.type = "application/javascript"; + injectee.async = true; + const prom = new Promise(cb => injectee.onload = cb); + + window.arguments = arguments[1]; + document.body.append(injectee); + + await prom; + + /* + * To ease debugging, we want this script to signal all exceptions from the + * injectee. + */ if (window.haketilo_selenium_exception !== false) - throw 'Error in injected script! Check your geckodriver.log!'; -} finally { - script_elem.remove(); -} + throw ['haketilo_selenium_error', + 'Error in injected script! Check your geckodriver.log and ./injected_scripts/!']; -return window.haketilo_selenium_return_value; + return window.haketilo_selenium_return_value; +} +return inject(); ''' def _execute_in_page_context(driver, script, args): script = script + '\n;\nwindow.haketilo_selenium_exception = false;' - driver.loaded_scripts.append(script) + script_url = start_serving_script(script) + try: - return driver.execute_script(script_injecting_script, script, args) + result = driver.execute_script(script_injector_script, script_url, args) + if type(result) == list and result[0] == 'haketilo_selenium_error': + raise Exception(result[1]) + return result except Exception as e: - import sys - - print("Scripts loaded since driver's last get() method call:", - file=sys.stderr) - - for script in driver.loaded_scripts: - lines = enumerate(script.split('\n'), 1) - for err_info in [('===',), *lines]: - print(*err_info, file=sys.stderr) - + dump_scripts() raise e from None # Some fixtures here just define functions that operate on driver. We should |