From 349c9e884ce9e8776b31bd73416de9ff24182107 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Fri, 8 Jul 2022 13:40:49 +0200 Subject: [PATCH] docs(python): add extension testing guide with fixtures (#15486) --- docs/src/chrome-extensions-js-python.md | 64 +++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/docs/src/chrome-extensions-js-python.md b/docs/src/chrome-extensions-js-python.md index 8515ff7b7d..322053d1fc 100644 --- a/docs/src/chrome-extensions-js-python.md +++ b/docs/src/chrome-extensions-js-python.md @@ -99,18 +99,17 @@ with sync_playwright() as playwright: To have the extension loaded when running tests you can use a test fixture to set the context. You can also dynamically retrieve the extension id and use it that to load and test the popup page for example. -```typescript -import { test as base, expect, chromium, BrowserContext } from "@playwright/test"; +```ts +import { test as base, expect, BrowserContext } from "@playwright/test"; import path from "path"; export const test = base.extend<{ context: BrowserContext; extensionId: string; }>({ - context: async ({ browserName }, use) => { - const browserTypes = { chromium }; + context: async ({ }, use) => { const pathToExtension = path.join(__dirname, "my-extension"); - const context = await browserTypes[browserName].launchPersistentContext("", { + const context = await chromium.launchPersistentContext("", { headless: false, args: [ `--disable-extensions-except=${pathToExtension}`, @@ -148,3 +147,58 @@ test("popup page", async ({ page, extensionId }) => { await expect(page.locator("body")).toHaveText("my-extension popup"); }); ``` + +```py +# conftest.py +from typing import Generator +from pathlib import Path +from playwright.sync_api import Playwright, BrowserContext +import pytest + + +@pytest.fixture() +def context(playwright: Playwright) -> Generator[BrowserContext, None, None]: + path_to_extension = Path(__file__).parent.joinpath("my-extension") + context = playwright.chromium.launch_persistent_context( + "", + headless=False, + args=[ + f"--disable-extensions-except={path_to_extension}", + f"--load-extension={path_to_extension}", + ], + ) + yield context + context.close() + + +@pytest.fixture() +def extension_id(context) -> Generator[str, None, None]: + # for manifest v2: + # background = context.background_pages[0] + # if not background: + # background = context.wait_for_event("backgroundpage") + + # for manifest v3: + background = context.service_workers[0] + if not background: + background = context.wait_for_event("serviceworker") + + extension_id = background.url.split("/")[2] + yield extension_id + +``` + +```py +# test_foo.py +from playwright.sync_api import expect, Page + + +def test_example_test(page: Page) -> None: + page.goto("https://example.com") + expect(page.locator("body")).to_contain_text("Changed by my-extension") + + +def test_popup_page(page: Page, extension_id: str) -> None: + page.goto(f"chrome-extension://{extension_id}/popup.html") + expect(page.locator("body")).to_have_text("my-extension popup") +``` \ No newline at end of file