Перейти к основному содержимому

Расширения Chrome

Введение

примечание

Расширения работают только в Chrome / Chromium, запущенном с постоянным контекстом. Используйте пользовательские аргументы браузера на свой страх и риск, так как некоторые из них могут нарушить функциональность Playwright.

Пример ниже извлекает background page расширения Manifest v2, исходный код которого находится в ./my-extension.

Обратите внимание на использование канала chromium, который позволяет запускать расширения в безголовом режиме. В качестве альтернативы, вы можете запустить браузер в режиме с интерфейсом.

from playwright.sync_api import sync_playwright, Playwright

path_to_extension = "./my-extension"
user_data_dir = "/tmp/test-user-data-dir"


def run(playwright: Playwright):
context = playwright.chromium.launch_persistent_context(
user_data_dir,
channel="chromium",
args=[
f"--disable-extensions-except={path_to_extension}",
f"--load-extension={path_to_extension}",
],
)
if len(context.background_pages) == 0:
background_page = context.wait_for_event('backgroundpage')
else:
background_page = context.background_pages[0]

# Тестируйте background page так же, как и любую другую страницу.
context.close()


with sync_playwright() as playwright:
run(playwright)

Тестирование

Чтобы расширение загружалось при запуске тестов, вы можете использовать тестовый фикстур для установки контекста. Вы также можете динамически получить id расширения и использовать его для загрузки и тестирования страницы всплывающего окна, например.

Обратите внимание на использование канала chromium, который позволяет запускать расширения в безголовом режиме. В качестве альтернативы, вы можете запустить браузер в режиме с интерфейсом.

Сначала добавьте фикстуры, которые загрузят расширение:

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(
"",
channel="chromium",
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]:
# для manifest v2:
# background = context.background_pages[0]
# if not background:
# background = context.wait_for_event("backgroundpage")

# для 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

Затем используйте эти фикстуры в тесте:

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