端對端測試包括建構擴充功能套件,並載入至瀏覽器。測試工具會與瀏覽器通訊,自動執行互動並測試使用者會經歷的相同流程。支援端對端測試的程式庫通常會提供控制瀏覽器、模擬使用者輸入內容,以及觀察任何開啟網頁目前狀態的方法。
如需教學課程,請參閱「使用 Puppeteer 測試 Chrome 擴充功能」一文;如要瞭解如何編寫 Chrome 擴充功能的單元測試,請參閱「單元測試」一文。
使用瀏覽器測試程式庫
多種測試程式庫都支援擴充功能。
| 媒體庫 | 指引 |
|---|---|
| 操偶師 / 劇作家 | 請參閱 Chrome 擴充功能 (Puppeteer / Playwright)。 |
| 硒 | 使用 ChromeOptions 物件載入擴充功能。詳情請參閱這個頁面。 |
| WebDriverIO | 請參閱「網頁擴充功能測試」。 |
在 Headless Chrome 中執行測試
在自動化工作流程中執行測試時,通常需要在沒有螢幕的機器上載入擴充功能。Chrome 的全新無頭模式可讓 Chrome 在這類無人環境中執行。使用 --headless=new 標記啟動 Chrome (無頭模式目前預設為「舊版」,不支援載入擴充功能)。視您選擇的自動化工具而定,系統可能會自動新增旗標。
設定擴充功能 ID
在測試中,通常會需要固定的擴充功能 ID。這樣就能輕鬆完成許多常見工作,例如在需要通訊的伺服器上將擴充功能來源加入允許清單,或在測試中開啟擴充功能頁面。請按照「維持一致的擴充功能 ID」一文中的步驟操作。
測試擴充功能頁面
您可以使用對應的網址存取擴充功能頁面,例如 chrome-extension://<id>/index.html。使用所選自動化工具提供的正常導覽方法,前往這些網址。
測試擴充功能彈出式視窗
使用部分程式庫時,您或許可以透過 action.openPopup() API 開啟彈出式視窗,然後取得新內容的參照。舉例來說,Puppeteer 的 Chrome 擴充功能指南就說明瞭如何執行這項操作。
如果無法在所選程式庫中執行這項操作,請在新分頁中開啟彈出式視窗的網址。如果彈出式視窗使用中的分頁,請考慮實作覆寫,將分頁 ID 明確傳遞至彈出式視窗。例如:
const URL_PARAMS = new URLSearchParams(window.location.search);
async function getActiveTab() {
// Open popup.html?tab=5 to use tab ID 5, etc.
if (URL_PARAMS.has("tab")) {
return await chrome.tabs.get(parseInt(URL_PARAMS.get("tab")));
}
const tabs = await chrome.tabs.query({
active: true,
currentWindow: true
});
return tabs[0];
}
檢查擴充功能狀態
如要避免在變更擴充功能的內部行為時發生測試失敗情形,一般來說,最佳做法是在整合測試中避免存取內部狀態。請改為根據使用者可見的內容進行測試。不過,有時您可能希望直接從擴充功能存取資料。在這種情況下,請考慮在擴充功能頁面的環境中執行程式碼。
在 Puppeteer 中:
const workerTarget = await browser.waitForTarget(
target => target.type() === 'service_worker'
);
const worker = await workerTarget.worker();
const value = await worker.evaluate(() => {
chrome.storage.local.get('foo');
});
在 Selenium 中:
// Selenium doesn't allow us to access the service worker, so we need to open an extension page where we can execute the code
await driver.get('chrome-extension://<id>/popup.html');
await driver.executeAsyncScript(
'const callback = arguments[arguments.length - 1];' +
'chrome.storage.local.get(\'foo\').then(callback);'
);
測試服務工作人員終止作業
如要瞭解如何測試 Service Worker 終止作業,請參閱「使用 Puppeteer 測試 Service Worker 終止作業」。我們也提供 Puppeteer 和 Selenium 的範例。
請注意,使用某些測試架構時,服務工作人員可能不會像正常使用時一樣自動終止。Selenium 就是如此。這項功能會依附 ChromeDriver,將偵錯工具附加至所有服務工作人員,防止他們停止運作。