docs(python): add extension testing guide with fixtures (#15486)

This commit is contained in:
Max Schmitt 2022-07-08 13:40:49 +02:00 committed by GitHub
parent 6d030e666e
commit 349c9e884c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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. 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 ```ts
import { test as base, expect, chromium, BrowserContext } from "@playwright/test"; import { test as base, expect, BrowserContext } from "@playwright/test";
import path from "path"; import path from "path";
export const test = base.extend<{ export const test = base.extend<{
context: BrowserContext; context: BrowserContext;
extensionId: string; extensionId: string;
}>({ }>({
context: async ({ browserName }, use) => { context: async ({ }, use) => {
const browserTypes = { chromium };
const pathToExtension = path.join(__dirname, "my-extension"); const pathToExtension = path.join(__dirname, "my-extension");
const context = await browserTypes[browserName].launchPersistentContext("", { const context = await chromium.launchPersistentContext("", {
headless: false, headless: false,
args: [ args: [
`--disable-extensions-except=${pathToExtension}`, `--disable-extensions-except=${pathToExtension}`,
@ -148,3 +147,58 @@ test("popup page", async ({ page, extensionId }) => {
await expect(page.locator("body")).toHaveText("my-extension popup"); 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")
```