From cdd2e01e6e98defaac0a4aa555f17b7f6c21ca61 Mon Sep 17 00:00:00 2001 From: Patrick Avery Date: Mon, 22 Sep 2025 16:16:20 -0500 Subject: [PATCH] ci(playwright): use playwright for tests instead of selenium Signed-off-by: Patrick Avery --- .github/workflows/test_and_release.yml | 20 +--- examples/vue3/js_call.py | 2 +- tests/conftest.py | 8 +- tests/refs/simple_count_1.yml | 3 + tests/refs/simple_count_5.yml | 3 + tests/refs/test_dynamic_template_final.yml | 4 + tests/refs/test_dynamic_template_initial.yml | 4 + tests/requirements.txt | 4 +- tests/test_reactivity.py | 45 ++++---- tests/test_vue23.py | 82 +++++++------- trame/__init__.py | 1 - trame/widgets/__init__.py | 1 - trame_client/utils/testing.py | 100 ++++++++++-------- .../dynamic_template.py]/final/baseline.png | Bin 7525 -> 0 bytes .../final/tags_level_1.txt | 1 - .../final/tags_level_2.txt | 1 - .../final/tags_level_3.txt | 1 - .../dynamic_template.py]/init/baseline.png | Bin 7277 -> 0 bytes .../init/tags_level_1.txt | 1 - .../init/tags_level_2.txt | 1 - .../init/tags_level_3.txt | 1 - .../dynamic_template.py]/final/baseline.png | Bin 7499 -> 0 bytes .../final/tags_level_1.txt | 1 - .../final/tags_level_2.txt | 1 - .../final/tags_level_3.txt | 1 - .../dynamic_template.py]/init/baseline.png | Bin 7263 -> 0 bytes .../init/tags_level_1.txt | 1 - .../init/tags_level_2.txt | 1 - .../init/tags_level_3.txt | 1 - .../simple_count_1/baseline.png | Bin 3062 -> 0 bytes .../simple_count_1/tags_level_1.txt | 1 - .../simple_count_1/tags_level_2.txt | 1 - .../simple_count_1/tags_level_3.txt | 1 - .../simple_count_5/baseline.png | Bin 3270 -> 0 bytes .../simple_count_5/tags_level_1.txt | 1 - .../simple_count_5/tags_level_2.txt | 1 - .../simple_count_5/tags_level_3.txt | 1 - 37 files changed, 148 insertions(+), 147 deletions(-) create mode 100644 tests/refs/simple_count_1.yml create mode 100644 tests/refs/simple_count_5.yml create mode 100644 tests/refs/test_dynamic_template_final.yml create mode 100644 tests/refs/test_dynamic_template_initial.yml delete mode 100644 trame/__init__.py delete mode 100644 trame/widgets/__init__.py delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/final/baseline.png delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/final/tags_level_1.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/final/tags_level_2.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/final/tags_level_3.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/init/baseline.png delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/init/tags_level_1.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/init/tags_level_2.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/init/tags_level_3.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/final/baseline.png delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/final/tags_level_1.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/final/tags_level_2.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/final/tags_level_3.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/baseline.png delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_1.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_2.txt delete mode 100644 visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_3.txt delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_1/baseline.png delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_1/tags_level_1.txt delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_1/tags_level_2.txt delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_1/tags_level_3.txt delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/baseline.png delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_1.txt delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_2.txt delete mode 100644 visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_3.txt diff --git a/.github/workflows/test_and_release.yml b/.github/workflows/test_and_release.yml index 016307d..9ecc950 100644 --- a/.github/workflows/test_and_release.yml +++ b/.github/workflows/test_and_release.yml @@ -56,20 +56,6 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install Chrome - run: | - sudo apt install google-chrome-stable - - - name: Check the console scripts interface - run: | - pip install seleniumbase - seleniumbase - sbase - - - name: Install chromedriver - run: | - seleniumbase install chromedriver - - name: Set Up Node uses: actions/setup-node@v4 with: @@ -91,11 +77,13 @@ jobs: run: | pip install . pip install -r tests/requirements.txt + # Install playwright requirements + playwright install # Run the tests with coverage so we get a coverage report too pip install coverage - # coverage run --source . -m pytest -s . + coverage run --source . -m pytest -s . # Print the coverage report - # coverage report -m + coverage report -m - name: Upload Coverage to Codecov uses: codecov/codecov-action@v3 diff --git a/examples/vue3/js_call.py b/examples/vue3/js_call.py index 7606a80..f1eaca7 100644 --- a/examples/vue3/js_call.py +++ b/examples/vue3/js_call.py @@ -1,5 +1,5 @@ from trame.app import get_server -from trame_client.widgets import client, html +from trame.widgets import client, html from trame_client.ui.html import DivLayout from trame_client.utils.testing import enable_testing diff --git a/tests/conftest.py b/tests/conftest.py index eb539e9..b74bfa9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,11 +6,9 @@ HELPER = FixtureHelper(ROOT_PATH) -@pytest.fixture() -def baseline_image(): - HELPER.remove_page_urls() - yield - HELPER.remove_page_urls() +@pytest.fixture +def ref_dir() -> Path: + return Path(__file__).parent / "refs" @pytest.fixture diff --git a/tests/refs/simple_count_1.yml b/tests/refs/simple_count_1.yml new file mode 100644 index 0000000..8288bb9 --- /dev/null +++ b/tests/refs/simple_count_1.yml @@ -0,0 +1,3 @@ +- document: + - text: "1" + - button "Add to count" \ No newline at end of file diff --git a/tests/refs/simple_count_5.yml b/tests/refs/simple_count_5.yml new file mode 100644 index 0000000..5b33ddc --- /dev/null +++ b/tests/refs/simple_count_5.yml @@ -0,0 +1,3 @@ +- document: + - text: "5" + - button "Add to count" \ No newline at end of file diff --git a/tests/refs/test_dynamic_template_final.yml b/tests/refs/test_dynamic_template_final.yml new file mode 100644 index 0000000..228f7a3 --- /dev/null +++ b/tests/refs/test_dynamic_template_final.yml @@ -0,0 +1,4 @@ +- document: + - text: Static text 6 count = 6 tts = 2 + - button "Update template" + - button "count++" \ No newline at end of file diff --git a/tests/refs/test_dynamic_template_initial.yml b/tests/refs/test_dynamic_template_initial.yml new file mode 100644 index 0000000..a4f560d --- /dev/null +++ b/tests/refs/test_dynamic_template_initial.yml @@ -0,0 +1,4 @@ +- document: + - text: Static text 2 count = 2 tts = 0 + - button "Update template" + - button "count++" \ No newline at end of file diff --git a/tests/requirements.txt b/tests/requirements.txt index 9f6c7d8..c6a2e2b 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,8 +1,8 @@ pytest pytest-asyncio -seleniumbase +pytest-playwright pixelmatch Pillow pytest-xprocess trame>=3.6 -trame-server>=3 \ No newline at end of file +trame-server>=3 diff --git a/tests/test_reactivity.py b/tests/test_reactivity.py index c7b2857..8f2483b 100644 --- a/tests/test_reactivity.py +++ b/tests/test_reactivity.py @@ -1,23 +1,30 @@ +from playwright.sync_api import expect import pytest -from seleniumbase import SB + +from trame_client.utils.testing import assert_snapshot_matches @pytest.mark.parametrize("server_path", ["examples/test/reactivity.py"]) -def test_reactivity(server, baseline_image): - with SB() as sb: - url = f"http://127.0.0.1:{server.port}/" - sb.open(url) - sb.check_window(name="simple_count_1", level=3) - sb.assert_exact_text("1", ".countValue") - assert server.get("count") == 1 - sb.click(".plusButton") - sb.assert_exact_text("2", ".countValue") - assert server.get("count") == 2 - sb.click(".plusButton") - sb.click(".plusButton") - sb.assert_exact_text("4", ".countValue") - assert server.get("count") == 4 - sb.click(".plusButton") - sb.assert_exact_text("5", ".countValue") - assert server.get("count") == 5 - sb.check_window(name="simple_count_5", level=3) +def test_reactivity(server, page, ref_dir): + url = f"http://127.0.0.1:{server.port}/" + page.goto(url) + + assert_snapshot_matches(page, ref_dir, "simple_count_1") + + plus_button = page.locator(".plusButton") + count_value = page.locator(".countValue") + + expect(count_value).to_have_text("1") + assert server.get("count") == 1 + plus_button.click() + expect(count_value).to_have_text("2") + assert server.get("count") == 2 + plus_button.click() + plus_button.click() + expect(count_value).to_have_text("4") + assert server.get("count") == 4 + plus_button.click() + expect(count_value).to_have_text("5") + assert server.get("count") == 5 + + assert_snapshot_matches(page, ref_dir, "simple_count_5") diff --git a/tests/test_vue23.py b/tests/test_vue23.py index 125cdc0..804e4b2 100644 --- a/tests/test_vue23.py +++ b/tests/test_vue23.py @@ -1,53 +1,55 @@ import pytest -from seleniumbase import SB -from trame_client.utils.testing import wait_for_ready + +from playwright.sync_api import expect +from trame_client.utils.testing import assert_snapshot_matches @pytest.mark.parametrize( "server_path", ["examples/vue2/dynamic_template.py"], ) -def test_dynamic_template(server, baseline_image): - with SB() as sb: - url = f"http://127.0.0.1:{server.port}/" - sb.open(url) - wait_for_ready(sb, 60) - sb.check_window(name="init", level=3) - sb.assert_exact_text("Static text 2", ".staticDiv") - sb.assert_exact_text("count = 2", ".countDiv") - sb.assert_exact_text("tts = 0", ".ttsDiv") - assert server.get("count") == 2 - sb.click(".plusBtn") - sb.click(".plusBtn") - sb.assert_exact_text("Static text 2", ".staticDiv") - assert server.get("count") == 4 - sb.assert_exact_text("count = 4", ".countDiv") - sb.assert_exact_text("tts = 0", ".ttsDiv") - sb.click(".updateBtn") - sb.click(".updateBtn") - sb.assert_exact_text("Static text 6", ".staticDiv") - assert server.get("count") == 6 - sb.assert_exact_text("count = 6", ".countDiv") - sb.assert_exact_text("tts = 2", ".ttsDiv") - sb.check_window(name="final", level=3) +def test_dynamic_template(server, page, ref_dir): + url = f"http://127.0.0.1:{server.port}/" + page.goto(url) + + assert_snapshot_matches(page, ref_dir, "test_dynamic_template_initial") + + expect(page.locator(".staticDiv")).to_have_text("Static text 2") + expect(page.locator(".countDiv")).to_have_text("count = 2") + expect(page.locator(".ttsDiv")).to_have_text("tts = 0") + assert server.get("count") == 2 + + page.locator(".plusBtn").click() + page.locator(".plusBtn").click() + expect(page.locator(".staticDiv")).to_have_text("Static text 2") + assert server.get("count") == 4 + expect(page.locator(".countDiv")).to_have_text("count = 4") + expect(page.locator(".ttsDiv")).to_have_text("tts = 0") + page.locator(".updateBtn").click() + page.locator(".updateBtn").click() + expect(page.locator(".staticDiv")).to_have_text("Static text 6") + assert server.get("count") == 6 + expect(page.locator(".countDiv")).to_have_text("count = 6") + expect(page.locator(".ttsDiv")).to_have_text("tts = 2") + + assert_snapshot_matches(page, ref_dir, "test_dynamic_template_final") @pytest.mark.parametrize( "server_path", ["examples/vue2/js_call.py", "examples/vue3/js_call.py"], ) -def test_js_call(server, baseline_image): - with SB() as sb: - url = f"http://127.0.0.1:{server.port}/" - sb.open(url) - wait_for_ready(sb, 60) - sb.assert_exact_text("Alert", ".jsAlert") - assert server.get("message") == "hello world" - sb.click(".alertMsg") - sb.assert_exact_text("hello world", ".jsAlert") - sb.click(".alertMe") - sb.assert_exact_text("Yes me", ".jsAlert") - sb.click(".swapMsg") - assert server.get("message") == "dlrow olleh" - sb.click(".alertMsg") - sb.assert_exact_text("dlrow olleh", ".jsAlert") +def test_js_call(server, page): + url = f"http://127.0.0.1:{server.port}/" + page.goto(url) + + expect(page.locator(".jsAlert")).to_have_text("Alert") + assert server.get("message") == "hello world" + page.locator(".alertMsg").click() + expect(page.locator(".jsAlert")).to_have_text("hello world") + page.locator(".alertMe").click() + expect(page.locator(".jsAlert")).to_have_text("Yes me") + page.locator(".swapMsg").click() + assert server.get("message") == "dlrow olleh" + page.locator(".alertMsg").click() + expect(page.locator(".jsAlert")).to_have_text("dlrow olleh") diff --git a/trame/__init__.py b/trame/__init__.py deleted file mode 100644 index 8db66d3..0000000 --- a/trame/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__path__ = __import__("pkgutil").extend_path(__path__, __name__) diff --git a/trame/widgets/__init__.py b/trame/widgets/__init__.py deleted file mode 100644 index 8db66d3..0000000 --- a/trame/widgets/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__path__ = __import__("pkgutil").extend_path(__path__, __name__) diff --git a/trame_client/utils/testing.py b/trame_client/utils/testing.py index 0c8a31e..24a7a77 100644 --- a/trame_client/utils/testing.py +++ b/trame_client/utils/testing.py @@ -5,6 +5,8 @@ from PIL import Image from pixelmatch.contrib.PIL import pixelmatch +from playwright.sync_api import expect, Page + # --------------------------------------------------------- # Pytest helpers @@ -84,56 +86,66 @@ class Starter(ProcessStarter): return Path(server_path).name, Starter, TrameServerMonitor -# --------------------------------------------------------- -# Seleniumbase helper functions -# --------------------------------------------------------- - - -def set_browser_size(sb, width=300, height=300): - delta_width = 0 - delta_height = 0 - agent = sb.get_user_agent() - if "Firefox" in agent: - delta_height = 85 - elif "Chrome" in agent: - delta_height = 0 - elif "Safari" in agent: - delta_height = 0 +def assert_images_match(img_test: Image, ref_path: Path, threshold=0.1): + img_ref = Image.open(ref_path) + img_diff = Image.new("RGBA", img_ref.size) + diff_path = ref_path.parent / f"diff_{ref_path.with_suffix('.png').name}" - sb.set_window_size(width + delta_width, height + delta_height) - wait_for_ready(sb) + mismatch = pixelmatch(img_ref, img_test, img_diff, threshold=threshold) + img_diff.save(diff_path) + assert mismatch < threshold -def baseline_comparison(sb, check_baseline_path, threshold=0.1): - baseline_test = Path(check_baseline_path) - baseline_refs = baseline_test.parent.glob("baseline_ref*.png") - baseline_diff = baseline_test.with_name("baseline_diff.png") +# --------------------------------------------------------- +# Playwright helpers +# --------------------------------------------------------- - img_test = Image.open(baseline_test) - min_mismatch = 1000000 - for baseline_ref in baseline_refs: - img_ref = Image.open(baseline_ref) - img_diff = Image.new("RGBA", img_ref.size) - baseline_diff = ( - baseline_ref.parent / f"baseline_diff{baseline_ref.name[12:-4]}.png" - ) +def assert_screenshot_matches( + page: Page, ref_dir: Path, name: str, threshold: float = 0.1 +): + img_dir = ref_dir / name + ref_images = list(img_dir.glob("ref*.png")) + if not ref_images: + print(f"No reference images exist in {img_dir}. Creating one...") + img_dir.mkdir(parents=True, exist_ok=True) + ref_img_path = img_dir / "ref1.png" + page.screenshot(path=ref_img_path) + return + + # Save the test image + test_img_path = img_dir / "test_image.png" + page.screenshot(path=test_img_path) + img_test = Image.open(test_img_path) + + # If there are reference images, find one that matches + # Only write out image diffs if none succeed + for ref_img_path in ref_images: + try: + # `expect(page).to_have_screenshot()` is not yet supported + # in Python playwright, even though it is available in + # JavaScript... :-\ + # Use our own comparison for now. + # expect(page).to_have_screenshot(threshold=threshold) + assert_images_match(img_test, ref_img_path, threshold) + except AssertionError: + # We'll just try the next one + continue + else: + # It matched. Return! + return - mismatch = pixelmatch(img_ref, img_test, img_diff, threshold=threshold) - img_diff.save(baseline_diff) - min_mismatch = min(min_mismatch, mismatch) + raise AssertionError(f"No reference images matched in {img_dir}") - sb.assert_true( - min_mismatch < threshold, - f"Baseline threshold {min_mismatch} < {threshold}", - ) +def assert_snapshot_matches(page: Page, ref_dir: Path, name: str): + html = page.locator("html") + ref_path = ref_dir / f"{name}.yml" + if not ref_path.exists(): + print(f"'{ref_path}' does not exist. Creating...") + with open(ref_path, "w") as wf: + wf.write(html.aria_snapshot()) + return -def wait_for_ready(sb, timeout=60): - for i in range(timeout): - print(f"wait_for_ready {i}") - if sb.is_element_present(".trame__loader"): - sb.sleep(1) - else: - print("Ready") - return + with open(ref_path, "r") as rf: + expect(html).to_match_aria_snapshot(rf.read()) diff --git a/visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/final/baseline.png b/visual_baseline/test_dynamic_template[examples/vue2/dynamic_template.py]/final/baseline.png deleted file mode 100644 index 4fddc80701d4cab579b2bb59c52cdc66dda571ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7525 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 diff --git a/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_1.txt b/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_1.txt deleted file mode 100644 index e883a01..0000000 --- a/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_1.txt +++ /dev/null @@ -1 +0,0 @@ -[["noscript"], ["strong"], ["div"], ["div"], ["div"], ["div"], ["div"], ["button"], ["button"]] \ No newline at end of file diff --git a/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_2.txt b/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_2.txt deleted file mode 100644 index 3d7c24b..0000000 --- a/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_2.txt +++ /dev/null @@ -1 +0,0 @@ -[["noscript", []], ["strong", []], ["div", ["data-v-app", "id"]], ["div", []], ["div", ["class"]], ["div", ["class"]], ["div", ["class"]], ["button", ["class"]], ["button", ["class"]]] \ No newline at end of file diff --git a/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_3.txt b/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_3.txt deleted file mode 100644 index f26ab46..0000000 --- a/visual_baseline/test_dynamic_template[examples/vue3/dynamic_template.py]/init/tags_level_3.txt +++ /dev/null @@ -1 +0,0 @@ -[["noscript", []], ["strong", []], ["div", [["data-v-app", ""], ["id", "app"]]], ["div", []], ["div", [["class", ["staticDiv"]]]], ["div", [["class", ["countDiv"]]]], ["div", [["class", ["ttsDiv"]]]], ["button", [["class", ["updateBtn"]]]], ["button", [["class", ["plusBtn"]]]]] \ No newline at end of file diff --git a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_1/baseline.png b/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_1/baseline.png deleted file mode 100644 index cd4077e494ae30ebb8826a989b37f13f05a721f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3062 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 diff --git a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_1.txt b/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_1.txt deleted file mode 100644 index 8e0872a..0000000 --- a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_1.txt +++ /dev/null @@ -1 +0,0 @@ -[["noscript"], ["strong"], ["div"], ["div"], ["button"]] \ No newline at end of file diff --git a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_2.txt b/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_2.txt deleted file mode 100644 index 10522e9..0000000 --- a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_2.txt +++ /dev/null @@ -1 +0,0 @@ -[["noscript", []], ["strong", []], ["div", []], ["div", ["class", "style"]], ["button", ["class"]]] \ No newline at end of file diff --git a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_3.txt b/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_3.txt deleted file mode 100644 index d824d23..0000000 --- a/visual_baseline/test_reactivity[examples/test/reactivity.py]/simple_count_5/tags_level_3.txt +++ /dev/null @@ -1 +0,0 @@ -[["noscript", []], ["strong", []], ["div", []], ["div", [["class", ["countValue"]], ["style", "padding: 20px; background: red;"]]], ["button", [["class", ["plusButton"]]]]] \ No newline at end of file