From 58fe4c7d806359bed299f74ba56902ab396a6ed1 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Tue, 14 Dec 2021 21:40:23 +0100 Subject: facilitate broadcasting messages to different execution contexts within the webextension --- test/unit/conftest.py | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) (limited to 'test/unit/conftest.py') diff --git a/test/unit/conftest.py b/test/unit/conftest.py index e1c98a1..eec311c 100644 --- a/test/unit/conftest.py +++ b/test/unit/conftest.py @@ -27,6 +27,7 @@ Common fixtures for Haketilo unit tests import pytest from pathlib import Path +from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC @@ -42,11 +43,24 @@ def proxy(): httpd.shutdown() @pytest.fixture(scope="package") -def driver(proxy): +def _driver(proxy): with firefox_safe_mode() as driver: yield driver driver.quit() +def close_all_but_one_window(driver): + while len(driver.window_handles) > 1: + driver.switch_to.window(driver.window_handles[-1]) + driver.close() + driver.switch_to.window(driver.window_handles[0]) + +@pytest.fixture() +def driver(_driver, request): + nav_target = request.node.get_closest_marker('get_page') + close_all_but_one_window(_driver) + _driver.get(nav_target.args[0] if nav_target else 'about:blank') + yield _driver + @pytest.fixture() def webextension(driver, request): ext_data = request.node.get_closest_marker('ext_data') @@ -58,7 +72,7 @@ def webextension(driver, request): 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") + EC.url_matches('^moz-extension://.*') ) yield driver.uninstall_addon(addon_id) @@ -115,22 +129,28 @@ def _execute_in_page_context(driver, script, args): raise e from None -@pytest.fixture(scope="package") -def execute_in_page(driver): - def do_execute(script, *args, **kwargs): - if 'page' in kwargs: - driver.get(kwargs['page']) +# Some fixtures here just define functions that operate on driver. We should +# consider making them into webdriver wrapper class methods. +@pytest.fixture() +def execute_in_page(driver): + def do_execute(script, *args): return _execute_in_page_context(driver, script, args) yield do_execute -@pytest.fixture(scope="package") +@pytest.fixture() def load_into_page(driver): - def do_load(path, import_dirs, *args, **kwargs): - if 'page' in kwargs: - driver.get(kwargs['page']) - + def do_load(path, import_dirs, *args): _execute_in_page_context(driver, load_script(path, import_dirs), args) yield do_load + +@pytest.fixture() +def wait_elem_text(driver): + def do_wait(id, text): + WebDriverWait(driver, 10).until( + EC.text_to_be_present_in_element((By.ID, id), text) + ) + + yield do_wait -- cgit v1.2.3