介紹
注意
插件僅在以持久化上下文啟動的 Chrome/Chromium 瀏覽器中工作。請謹慎使用自定義瀏覽器參數,因為其中一些可能會破壞 Playwright 的功能。
以下是獲取位于?./my-extension
?的 Manifest v2 插件背景頁面句柄的代碼示例。
from playwright.sync_api import sync_playwright, Playwrightpath_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,headless=False,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]# Test the background page as you would any other page.context.close()with sync_playwright() as playwright:run(playwright)
測試
為了在運行測試時加載擴展,你可以使用測試夾具(fixture)來設置上下文。此外,你還可以動態地檢索擴展ID,并使用它來加載和測試例如彈出頁面等。
首先,添加將加載擴展的測試夾具(fixtures)。
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 contextcontext.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
然后在測試中使用
test_foo.py
from playwright.sync_api import expect, Pagedef 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")
無頭模式(Headless Mode)
警告
--headless=new
?模式并不是 Playwright 官方支持的功能,并且可能會導致意外的行為。
在 Playwright 中,Chrome 的默認無頭模式并不支持 Chrome 擴展。為了克服這一限制,你可以通過以下代碼以新的無頭模式運行 Chrome 的持久化上下文(persistent context):
conftest.py
path_to_extension = Path(__file__).parent.joinpath("my-extension")
context = playwright.chromium.launch_persistent_context("",headless=False,args=["--headless=new",f"--disable-extensions-except={path_to_extension}", # 禁用 Chrome 瀏覽器中的所有擴展,除了指定路徑({path_to_extension})下的擴展。f"--load-extension={path_to_extension}", # 指定 Chrome 瀏覽器啟動時應該加載的擴展的路徑],
)