Trong bài mới này, chúng ta sẽ cùng nhau test extension
Giới thiệu
- Extension chỉ hoạt động trên Chrome / Chromium với một context xuyên suốt. Nếu bạn sử dụng các tính năng custom này, bạn có thể hỏng các tính năng của Playwright.
Load extension
- Code dưới đây load extension vào Chromium / Chrome nằm ở folder
./my-extension
const { chromium } = require('playwright');
(async () => {
const pathToExtension = require('path').join(__dirname, 'my-extension');
const userDataDir = '/tmp/test-user-data-dir';
const browserContext = await chromium.launchPersistentContext(userDataDir, {
headless: false,
args: [
`--disable-extensions-except=${pathToExtension}`,
`--load-extension=${pathToExtension}`
]
});
let [backgroundPage] = browserContext.backgroundPages();
if (!backgroundPage)
backgroundPage = await browserContext.waitForEvent('backgroundpage');
// Test the background page as you would any other page.
await browserContext.close();
})();
Test extension
-
Chiến lược test extension đơn giản như sau:
- Lấy ra extension ID
- Đi vào popup bằng đường dẫn:
chrome-extension://${extensionId}/popup.html
-
Viết fixture để lấy ra extension id:
import { test as base, chromium, type BrowserContext } from '@playwright/test';
import path from 'path';
export const test = base.extend<{
context: BrowserContext;
extensionId: string;
}>({
context: async ({ }, use) => {
const pathToExtension = path.join(__dirname, 'my-extension');
const context = await chromium.launchPersistentContext('', {
headless: false,
args: [
`--disable-extensions-except=${pathToExtension}`,
`--load-extension=${pathToExtension}`,
],
});
await use(context);
await context.close();
},
extensionId: async ({ context }, use) => {
/*
// for manifest v2:
let [background] = context.backgroundPages()
if (!background)
background = await context.waitForEvent('backgroundpage')
*/
// for manifest v3:
let [background] = context.serviceWorkers();
if (!background)
background = await context.waitForEvent('serviceworker');
const extensionId = background.url().split('/')[2];
await use(extensionId);
},
});
export const expect = test.expect;
- Truy cập vào popup page:
import { test, expect } from './fixtures';
test('example test', async ({ page }) => {
await page.goto('https://example.com');
await expect(page.locator('body')).toHaveText('Changed by my-extension');
});
test('popup page', async ({ page, extensionId }) => {
await page.goto(`chrome-extension://${extensionId}/popup.html`);
await expect(page.locator('body')).toHaveText('my-extension popup');
});
Headless mode
- Lưu ý là headless=new này không được official support bởi Playwright, nên có thể sẽ xảy ra lỗi.
- Mặc định thì Chrome headless mode không support extension.
- Tuy nhiên thì bạn có thể xử lý tình huống này bằng cách sử dụng mode headless=new
// ...
const pathToExtension = path.join(__dirname, 'my-extension');
const context = await chromium.launchPersistentContext('', {
headless: false,
args: [
`--headless=new`,
`--disable-extensions-except=${pathToExtension}`,
`--load-extension=${pathToExtension}`,
],
});
// ...
Trả lời