Chrome 拡張機能
はじめに
注
拡張機能は、永続的なコンテキストで起動された場合にのみChromiumで動作します。一部のカスタムブラウザ引数はPlaywrightの機能を損なう可能性があるため、ご自身の責任でご使用ください。
Google ChromeとMicrosoft Edgeは、拡張機能をサイドロードするために必要なコマンドラインフラグを削除しました。そのため、PlaywrightにバンドルされているChromiumを使用してください。
以下のスニペットは、ソースが./my-extensionにあるManifest v3拡張機能のサービスワーカーを取得します。
ヘッドレスモードで拡張機能を実行できる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.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)
import asyncio
from playwright.async_api import async_playwright, Playwright
path_to_extension = "./my-extension"
user_data_dir = "/tmp/test-user-data-dir"
async def run(playwright: Playwright):
context = await 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 = await context.wait_for_event('serviceworker')
else:
service_worker = context.service_workers[0]
# Test the service worker as you would any other worker.
await context.close()
async def main():
async with async_playwright() as playwright:
await run(playwright)
asyncio.run(main())
テスト
テスト実行時に拡張機能をロードするには、テストフィクスチャを使用してコンテキストを設定できます。また、拡張機能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]:
# 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
次に、これらのフィクスチャをテストで使用します。
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")