onClicked 觸發時才會做事。Extension.js 讓你能直接觸發這些處理函式 — 工具列動作與鍵盤快速鍵指令 — 讓你可以無頭執行它們,並對結果進行斷言。
這之所以可行,是因為 Extension.js 會在建置時擷取你的 chrome.action.onClicked 與 chrome.commands.onCommand 監聽器(開發期執行階段會在你的 background 程式碼之前載入),並在需要時重播它們。沒有視窗、沒有滑鼠、沒有 flaky 測試。
需要以
--allow-control 啟動的開發 session — 參見除錯總覽。觸發工具列動作
default_popup,這會將它開啟。如果沒有,就會重播 onClicked 監聽器:
觸發鍵盤指令
依名稱重播任何chrome.commands.onCommand 處理函式 — 快速鍵本身完全不會被按下:
唯一的注意事項:沒有使用者手勢
重播會呼叫你的處理函式,但它不是真正的使用者點擊,所以瀏覽器不會附帶使用者手勢。實際影響如下: Extension.js 會在這件事重要時告訴你:結果會回報gesture: false,並在你的 manifest 宣告了 activeTab 時加上 warning:
需要真正帶手勢的點擊?
真正的動作點擊會授予activeTab — 已在 Chrome 149 上確認。重播刻意不帶有該手勢(因此依賴 activeTab 的處理函式行為會不同)。在極少數真的需要手勢語意的情況下,使用 chrome-devtools-mcp 的 trigger_extension_action(僅限 Chromium),它會透過 Puppeteer 經由支援的 pipe transport 進行真實呼叫。
可以考慮與 Extension.js 並行使用:讓它負責真正帶手勢的瀏覽器驅動,Extension.js 則負責你日常會用到的、感知建置、跨瀏覽器、無頭的重播。
在 CI 中:斷言你的動作處理函式有執行
啟動 session、觸發動作、對副作用進行斷言 — 不需要瀏覽器 UI、不需要 Playwright。這就是一個 GitHub Actions job 的完整流程:smoke:open-action 檢查正是走相同路徑,它會觸發動作 以及 一個指令,再讀回 chrome.storage 來證明每個處理函式確實有執行。
完整 pipeline 請見 CI 範本。
跨瀏覽器
open action 與 open command 建構在瀏覽器內伴隨程式之上,因此能在 Chrome 與 Firefox 上執行 — 它們只觸及 addListener,沒有任何引擎專屬的程式碼,且兩個瀏覽器都已驗證。同一份 background.service_worker 原始碼也能在 Firefox 上運作:Extension.js 會在 Firefox 建置時把它轉換成 background.scripts 的 event page。(真實帶手勢的點擊僅限 Chromium,由 chrome-devtools-mcp 提供 — 見前述。)
下一步
- 除錯總覽 — 完整的控制介面。
- CI 範本 — 將此整合進 PR 檢核流程。
- 同時執行兩個 MCP server — 並列比較還原度與可攜性。

