題干與適用場景
團隊要把瀏覽器端網路攔截從私有除錯協定遷移到 WebDriver BiDi。請說明工作階段建立、事件訂閱、攔截生命週期、並行隔離與失敗恢復如何設計。
面試官考察點
- 是否理解 BiDi 是 WebDriver 的雙向、事件驅動協定,仍處於 W3C Working Draft 階段。
- 是否能區分 session、context、intercept id、request id 和事件訂閱的職責。
- 是否按 URL pattern、phase、context 限定攔截,避免跨測試污染。
- 是否設計逾時、取消、斷線重連和敏感資料去識別,而不是只展示一段腳本。
回答前需要釐清的問題
- 測試需要觀察請求,還是要在 request/response 階段修改或阻斷?
- 執行環境、瀏覽器實作和驅動是否都支援所需 BiDi 模組?
- 每個測試是否獨占瀏覽器 context,攔截規則和事件日誌保存多久?
- 失敗時應恢復真實網路,還是讓測試立即失敗並保留診斷證據?
30 秒回答框架
我會為每個測試建立獨立 BiDi session 與 browsing context,先協商能力,再訂閱必要事件。攔截規則限定 URL、phase 和 context,收到 beforeRequestSent 等事件後按 request id 做一次性決策,放行、阻斷或提供模擬回應。所有規則有逾時和清理鉤子;斷線時停止測試並恢復瀏覽器,日誌只保存去識別後的中繼資料。生產流量不接入這套攔截器。
分步驟深入解答
1. 先確認協定與實作邊界
WebDriver BiDi 透過 WebSocket 提供雙向、事件驅動通訊;W3C 2026-06-01 版本仍是 Working Draft。客戶端應讀取驅動與瀏覽器能力,不能把草案欄位當成所有實作都穩定支援的契約。經典 WebDriver 的 HTTP 命令與 BiDi 事件可以共存,但要明確由哪個通道負責狀態。
2. 建立隔離的工作階段與上下文
測試啟動時建立 session,建立獨立 browsing context,並記錄 session、context 和測試 run id 的對應。每條攔截規則產生唯一 intercept id,規則只綁定所需 URL pattern、phase 和 context。測試結束按逆序取消訂閱、移除攔截並關閉 context,防止規則洩漏到下一個案例。
3. 設計事件與攔截決策
先用 session.subscribe 訂閱 network 事件,再根據事件攜帶的 request id 查找測試狀態。攔截命中後只能執行一次明確動作:繼續請求、阻斷,或在實作支援的階段提供回應。決策器要有冪等鍵和逾時;未知 request id、重複事件或不支援的 phase 進入可觀測錯誤路徑,而不是靜默放行。
4. 處理並行、斷線與安全
並行測試不得共享可變攔截表;每個 context 維護規則和事件緩衝區。WebSocket 斷線時停止繼續修改網路,標記測試為基礎設施失敗,保留去識別 URL、狀態和時間線後清理資源。請求標頭、Cookie、內文和權杖預設打碼。攔截器只在測試瀏覽器執行,憑證使用短期測試資料,禁止連接生產網域。
高品質示範回答
我會把 BiDi 當作協定邊界來設計,而不是把某個自動化函式庫的 route API 搬過來。每個測試建立獨立 session 和 browsing context,先讀取能力,再訂閱需要的 network 事件。攔截規則以唯一 id 管理,並限定 URL pattern、phase 和 context;事件按 request id 查找狀態,執行一次性的放行、阻斷或模擬回應。測試結束逆序取消訂閱、移除規則和關閉 context。所有動作都有逾時、冪等和診斷日誌;WebSocket 斷線直接標記基礎設施失敗並清理,不在不確定狀態下繼續改包。日誌去識別,測試瀏覽器與生產網路隔離,相容性差異透過能力矩陣明確管理。
常見錯誤
- 把 Working Draft 欄位當成所有瀏覽器和驅動的穩定 API。
- 只按 URL 全域攔截,沒有綁定 context、phase 和測試 run id。
- 未先訂閱事件,或把事件 id 與 intercept id、context id 混用。
- 斷線後繼續傳送修改請求,造成測試結果無法解釋。
- 測試結束不移除攔截規則,導致後續案例被污染。
- 把 Cookie、Authorization 或回應內文原樣寫入日誌。
- 在生產瀏覽器或真實使用者流量上啟用測試攔截器。
追問及應對
BiDi 與經典 WebDriver 如何共存?
經典 WebDriver 適合命令式控制,BiDi 適合持續事件和網路觀察。可以共用瀏覽器工作階段,但必須規定狀態來源與關閉順序,避免兩個通道同時修改同一上下文。
為什麼攔截規則需要 phase?
請求送出前、回應開始和回應完成時可取得的資料不同。按 phase 選擇能力,才能判斷哪些修改可行,並對不支援的階段提前失敗,而不是執行中猜測。
如何證明測試沒有跨案例污染?
為每個案例建立獨立 context 和 intercept id,結束時查詢並清空該 context 的規則,再執行隔離性檢查;同時記錄訂閱、取消和關閉事件,失敗時保留時間線。