Skip to main content

Chrome 扩展程序

介绍

🌐 Introduction

note

扩展程序只有在使用持久上下文启动时才能在 Chromium 中工作。自行使用自定义浏览器参数需谨慎,因为某些参数可能会破坏 Playwright 的功能。

🌐 Extensions only work in Chromium when launched with a persistent context. Use custom browser args at your own risk, as some of them may break Playwright functionality.

Google Chrome 和 Microsoft Edge 移除了侧载扩展所需的命令行标志,因此请使用随 Playwright 打包的 Chromium。:::

🌐 Google Chrome and Microsoft Edge removed the command-line flags needed to side-load extensions, so use Chromium that comes bundled with Playwright.

下面的代码片段检索位于 ./my-extensionManifest v3 扩展的 服务工作进程

🌐 The snippet below retrieves the service worker of a Manifest v3 extension whose source is located in ./my-extension.

注意使用 chromium 通道,这允许以无头模式运行扩展程序。或者,你也可以以有头模式启动浏览器。

🌐 Note the use of the chromium channel that allows to run extensions in headless mode. Alternatively, you can launch the browser in headed mode.

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.service_workers) == 0:
service_worker = context.wait_for_event('serviceworker')
else:
service_worker = context.service_workers[0]

# Test the service worker as you would any other worker.
context.close()


with sync_playwright() as playwright:
run(playwright)

测试

🌐 Testing

在运行测试时要加载扩展程序,可以使用测试夹具来设置上下文。你也可以动态获取扩展 ID,并使用它来加载并测试弹出页面,例如。

🌐 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 to load and test the popup page for example.

注意使用 chromium 通道,这允许以无头模式运行扩展程序。或者,你也可以以有头模式启动浏览器。

🌐 Note the use of the chromium channel that allows to run extensions in headless mode. Alternatively, you can launch the browser in headed mode.

首先,添加将加载扩展的装置:

🌐 First, add fixtures that will load the extension:

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]:
# for manifest v3:
service_worker = context.service_workers[0]
if not service_worker:
service_worker = context.wait_for_event("serviceworker")

extension_id = service_worker.url.split("/")[2]
yield extension_id

然后在测试中使用这些装置:

🌐 Then use these fixtures in a test:

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