blob: b2e36dd5acedab17a7ddd967d0dbd251a12f3571 [file] [log] [blame]
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