Playwright 無頭瀏覽器停滯報告:代理瀏覽器工作程序為何需要主動存活探測

彩色瀏覽器透過網際網路中繼節點傳送逐漸中斷的狀態路徑與成功的主動探測路徑

2026 年 9 月 12 日提交的一則 Playwright 問題報告描述了一種間歇性容器 CI 現象:context.newPage()page.goto() 長時間無法結束,而 browser.isConnected() 仍回傳 true。報告者使用長期執行的 Bun 程序、Playwright 1.61.1 與 Chromium headless shell 1228;同一程序直接請求相同服務時仍取得 HTTP 200。

該問題最後以「不計畫處理」關閉,並未確認是 Playwright 缺陷,也沒有最小重現,更沒有證據顯示代理是原因。它真正帶來的營運訊號很明確:傳輸層仍顯示連線,不等於瀏覽器工作程序還能建立頁面、執行腳本或完成導覽。

報告說明了什麼,又沒有說明什麼

報告者表示,該現象在一項長期執行的 CI 負載中約有 30% 的觸發率,並檢查過記憶體壓力、CPU 與 I/O 限流、PID 耗盡、共享記憶體不足、共享使用者目錄、高風險啟動參數與明顯崩潰等常見因素。這些只是該環境的除錯記錄,不能視為所有環境的通用排除結論。

由於根因未獲確認,團隊不應把相似症狀直接歸責於特定版本或供應商。較穩健的做法,是把它視為一種故障模式,在自己的受控環境內主動偵測。

內部來源說明:Microsoft Playwright 問題「context.newPage() and page.goto never settle while browser.isConnected() stays true (headless_shell 1228, container CI)」,提交於 2026 年 9 月 12 日;以「不計畫處理」關閉。

「已連線」只是第一層狀態

正式環境的瀏覽器工作程序至少應區分以下健康狀態:

  • 程序存活:作業系統程序仍存在且未退出。
  • 控制通道連線:自動化用戶端仍持有控制連線。
  • 執行環境有回應:既有頁面或環境能在限定時間內執行無副作用運算式。
  • 頁面建立有回應:能建立並關閉一次性頁面。
  • 導覽有回應:能在限定時間內開啟自有測試端點。
  • 代理路徑健康:預期路線上的 DNS、隧道、TLS 與 HTTP 階段均成功。

把這些狀態壓縮成一個布林值會造成錯誤信心。佇列可能持續把新任務交給「仍連線但已無法前進」的工作程序,使局部故障演變成大量積壓。

建立有界探測階梯

先執行成本最低的檢查,任一階段失敗就停止。依序確認程序身分與控制連線,使用短時限執行無副作用運算式;工作程序閒置時,再建立並關閉一次性頁面;最後開啟由團隊擁有的輕量端點,驗證一次性挑戰值。

每一步都必須採用單調時鐘與獨立時限。即使瀏覽器函式庫內部的 Promise 永遠不結束,呼叫端的計時器仍必須終止等待。記錄失敗階段、耗時、瀏覽器建置編號、函式庫版本、容器識別碼與代理路線 ID,但不要記錄代理密碼、工作階段 Cookie 或含客戶資料的頁面內容。

探測端點應位於瀏覽器工作程序之外,同時屬於獲准測試範圍。主機側請求成功只能證明網路的一部分;瀏覽器透過代理完成探測,才更接近真實應用路徑。

復原時避免重試風暴

探測逾時後,立即停止向該工作程序分派新任務,並將其標記為可疑。只允許已確認具備冪等性的工作在短暫寬限期內完成,接著回收瀏覽器程序;若終止動作也卡住,則交由容器監督程序處理。

限制並行替換數量。全量同步重啟會同時衝擊代理閘道、驗證服務與目標網站。應按瀏覽器建置與路線池設定斷路器,並使用隨機退避。保留第一次逾時作為主要結果,不可用自動重試成功掩蓋原始故障。

導覽逾時還有「完成狀態不明」的風險:目標端可能已收到請求,只是用戶端沒有取得最終事件。涉及狀態變更時,應使用冪等鍵,或先查詢狀態再決定是否重播。

分離瀏覽器健康與代理健康

針對自有端點執行四組對照:

  1. 主機不經代理請求。
  2. 主機經代理請求。
  3. 瀏覽器不經代理導覽。
  4. 瀏覽器經代理導覽。

這個矩陣可區分瀏覽器執行環境停滯,以及 DNS、代理隧道、TLS、來源站或容器網路故障。在工具允許時,分別記錄解析、連線、隧道、TLS、首位元組與完成耗時。HTTP 協商問題可搭配代理 ALPN 協商稽核排查。

如果重新連線開始倍增,請採用代理重試風暴預防指南中的並行與斷路控制;相鄰的連線重設現象可參考Playwright keep-alive ECONNRESET 報告

上線檢查清單

  • 每個非同步瀏覽器呼叫都有呼叫端掌控的時限。
  • 健康檢查分別涵蓋執行環境回應、頁面建立與受控導覽。
  • 直連與代理路徑獨立量測。
  • 可疑工作程序先停止接單,再回收。
  • 替換速率與重試並行數均設上限。
  • 狀態變更流程具備冪等或狀態核驗機制。
  • 日誌不含憑證、Cookie 與敏感頁面資料。
  • 記錄建置、函式庫、映像檔與路線識別碼以便比較。

常見問題

browser.isConnected 回傳 true 是否代表瀏覽器健康?

不是。它只代表用戶端仍認為控制連線存在,無法證明執行環境仍可建立頁面、執行任務或完成導覽。

這份報告是否證明 Playwright 1.61.1 有缺陷?

不能。問題以「不計畫處理」關閉,沒有確認根因或最小重現。必須在自己的建置與環境中驗證。

工作程序卡住後是否應立即更換代理重試?

不應自動這樣做。先判斷原操作是否可能已到達目標端,為狀態變更請求提供冪等保護,並限制替換與重試速率。

合規說明

瀏覽器自動化與代理只能用於自有或明確獲准測試的系統。請遵守存取控制、網站條款、資料保護義務與速率限制。存活監控用於提升可靠性,不得用於繞過限制。