From c699b6409e98fe64a70417a18b6e335b4c60f86d Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Mon, 13 Dec 2021 17:58:29 +0100 Subject: facilitate creating and installing WebExtensions during tests It is now possible to more conveniently test WebExtension APIs code by wrapping it into a test WebExtension and temporarily installing in the driven browser. --- test/unit/conftest.py | 31 ++++++++++++++++++++++++++----- test/unit/test_basic.py | 17 +++++++++++++++-- 2 files changed, 41 insertions(+), 7 deletions(-) (limited to 'test/unit') diff --git a/test/unit/conftest.py b/test/unit/conftest.py index 1500006..e1c98a1 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -26,10 +26,14 @@ Common fixtures for Haketilo unit tests # proprietary program, I am not going to enforce this in court. import pytest +from pathlib import Path +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC -from ..profiles import firefox_safe_mode -from ..server import do_an_internet -from ..script_loader import load_script +from ..profiles import firefox_safe_mode +from ..server import do_an_internet +from ..script_loader import load_script +from ..extension_crafting import make_extension @pytest.fixture(scope="package") def proxy(): @@ -43,6 +47,23 @@ def driver(proxy): yield driver driver.quit() +@pytest.fixture() +def webextension(driver, request): + ext_data = request.node.get_closest_marker('ext_data') + if ext_data is None: + raise Exception('"webextension" fixture requires "ext_data" marker to be set') + + ext_path = make_extension(Path(driver.firefox_profile.path), + **ext_data.args[0]) + driver.get('https://gotmyowndoma.in/') + addon_id = driver.install_addon(str(ext_path), temporary=True) + WebDriverWait(driver, 10).until( + EC.title_contains("Extension's options page for testing") + ) + yield + driver.uninstall_addon(addon_id) + ext_path.unlink() + script_injecting_script = '''\ /* * Selenium by default executes scripts in some weird one-time context. We want @@ -63,8 +84,8 @@ window.arguments = arguments[1]; document.body.append(script_elem); /* - * To ease debugging, we want this script to forward signal all exceptions from - * the injectee. + * To ease debugging, we want this script to signal all exceptions from the + * injectee. */ try { if (window.haketilo_selenium_exception !== false) diff --git a/test/unit/test_basic.py b/test/unit/test_basic.py index cbe5c8c..3b09cb6 100644 --- a/test/unit/test_basic.py +++ b/test/unit/test_basic.py @@ -26,8 +26,9 @@ def test_driver(driver): """ for proto in ['http://', 'https://']: driver.get(proto + 'gotmyowndoma.in') - element = driver.find_element_by_tag_name('title') - title = driver.execute_script('return arguments[0].innerText;', element) + title = driver.execute_script( + 'return document.getElementsByTagName("title")[0].innerText;' + ) assert "Schrodinger's Document" in title def test_script_loader(execute_in_page, load_into_page): @@ -39,3 +40,15 @@ def test_script_loader(execute_in_page, load_into_page): page='https://gotmyowndoma.in') assert execute_in_page('returnval(TYPE_PREFIX.VAR);') == '_' + +@pytest.mark.ext_data({}) +def test_webextension(driver, webextension): + """ + A trivial test case that verifies a test WebExtension created and installed + by the `webextension` fixture works and redirects specially-constructed URLs + to its test page. + """ + heading = driver.execute_script( + 'return document.getElementsByTagName("h1")[0].innerText;' + ) + assert "Extension's options page for testing" in heading -- cgit v1.2.3