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.
```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")
```