| from pathlib import Path | |
| from pytest import fixture | |
| from pytest_pyodide.server import spawn_web_server | |
| from pytest_pyodide import runner | |
| import logging | |
| TEST_PATH = Path(__file__).parents[1].resolve() | |
| class BaseRunner(runner._BrowserBaseRunner): | |
| def __init__( | |
| self, | |
| *args, | |
| test_dir, | |
| **kwargs, | |
| ): | |
| self.test_dir = test_dir | |
| super().__init__( | |
| *args, | |
| **kwargs, | |
| load_pyodide=False, | |
| ) | |
| def prepare_driver(self): | |
| self.base_url = ( | |
| f"http://{self.server_hostname}:{self.server_port}/{self.test_dir}/" | |
| ) | |
| self.goto(f"{self.base_url}/test.html") | |
| def javascript_setup(self): | |
| self.run_js("globalThis.TestModule = await globalThis.Module();") | |
| class FirefoxRunner(BaseRunner, runner.SeleniumFirefoxRunner): | |
| pass | |
| class ChromeRunner(BaseRunner, runner.SeleniumChromeRunner): | |
| pass | |
| # TODO: Figure out how to get NodeRunner to work. | |
| RUNNER_DICT = {x.browser: x for x in [FirefoxRunner, ChromeRunner]} | |
| @fixture(params=list(RUNNER_DICT), scope="class") | |
| def selenium_class_scope(request, web_server_main): | |
| server_hostname, server_port, server_log = web_server_main | |
| assert request.param in RUNNER_DICT | |
| logger = logging.getLogger('selenium') | |
| logger.setLevel(logging.DEBUG) | |
| cls = RUNNER_DICT[request.param] | |
| selenium = cls( | |
| test_dir=request.cls.TEST_BUILD_DIR, | |
| server_port=server_port, | |
| server_hostname=server_hostname, | |
| server_log=server_log, | |
| ) | |
| request.cls.call_number = 0 | |
| try: | |
| yield selenium | |
| finally: | |
| print(selenium.logs) | |
| selenium.driver.quit() | |
| @fixture(scope="function") | |
| def selenium(selenium_class_scope, request): | |
| selenium = selenium_class_scope | |
| request.cls.call_number += 1 | |
| # Refresh page every 50 calls to prevent firefox out of memory errors | |
| if request.cls.call_number % 50 == 0: | |
| selenium.driver.refresh() | |
| selenium.javascript_setup() | |
| selenium.clean_logs() | |
| yield selenium | |
| @fixture(scope="session") | |
| def web_server_main(request): | |
| with spawn_web_server(TEST_PATH) as output: | |
| yield output |