Playwright 1.63 測試鎖:讓並行代理與地區 QA 更安全
Playwright 1.63 於 2026 年 9 月 4 日發布,新增命名測試鎖。宣告相同鎖的測試不會同時執行,即使位於不同檔案、worker 或 project;無關測試仍可並行。對使用代理的瀏覽器 QA 而言,這為無法安全並行修改的稀缺或有狀態資源提供更精確的控制。

測試鎖不會自動讓代理流量正確。它的價值是避免為少數共享資源而把整個 project 設為 serial。團隊仍須準確界定資源邊界、確保每個測試可獨立重複,並保留足夠證據來區分資源爭用與網路故障。
公開來源說明:Microsoft Playwright「Playwright v1.63.0」,發布於 2026 年 9 月 4 日;Microsoft Playwright「Parallelism — Test locks」,查閱於 2026 年 9 月 10 日。
為什麼共享代理測試會互相干擾
並行瀏覽器工作通常較有效率,但以下資源可能含有共享可變狀態:
- 用於驗證連續性的同一黏性工作階段識別碼;
- 會被修改地區、幣別或同意狀態的同一測試帳號;
- 有嚴格並行上限的閘道或允許清單來源;
- 共用的測試手機號碼、信箱或購物籃;
- 會改變目標全域設定的管理 fixture;
- 只能獨占寫入單一檔案的證據收集器。
如果沒有協調,兩個個別正確的測試也會污染彼此。一個 worker 輪換工作階段,另一個卻在驗證黏性;一個 project 將帳號切到加拿大,另一個正在斷言德國價格。最後故障可能被錯誤歸因於代理池。
新測試鎖保證什麼
Playwright 測試可以宣告一個或多個鎖,test.describe() 也能將鎖套用到整個群組。執行器會在測試開始前取得全部所需鎖,並在測試結束後釋放。
import { test, expect } from '@playwright/test';
test('validate a sticky session', {
lock: ['proxy-session:qa-a', 'account:market-check'],
}, async ({ page }) => {
await page.goto(process.env.AUTHORIZED_TEST_URL!);
await expect(page.getByTestId('market')).toHaveText('CA');
});
鎖名應代表邏輯資源,不可包含憑證、客戶資料或真實代理端點。使用穩定的匿名 ID,既方便報告關聯,又不會揭露秘密。
精確選擇加鎖邊界
只鎖住真正不能共享的最小資源。
| 資源 | 可選鎖粒度 | 不應加鎖的情況 |
|---|---|---|
| 黏性代理工作階段 | 一個工作階段租約 | 每個測試都有獨立租約 |
| 在地化測試帳號 | 一個帳號或租戶 | 狀態唯讀或每次重設 |
| 受限閘道 | 一個明確容量桶 | 並行已安全分區 |
| 目標 fixture | 一筆可變記錄 | 測試使用不同記錄 |
| 證據寫入器 | 一個獨占輸出 | 每個測試有獨立路徑 |
避免使用 proxy 這類全域鎖名。它會讓無關地區、產品和帳號全部序列化,既拖慢套件,也掩蓋真實並行缺陷。較好的鍵應描述實際衝突域,例如匿名工作階段租約或測試租戶。
測試鎖不等於隔離
鎖只控制是否重疊,不會重設狀態。每個測試仍需使用乾淨的瀏覽器 context、明確代理設定、有限逾時和確定性清理。如果測試留下工作階段、Cookie、帳號設定或伺服器記錄,下一位鎖持有者仍會繼承問題。
當流程使用儲存狀態時,可結合Playwright OPFS 與代理狀態隔離評估。測量黏性路由時,可重用住宅代理工作階段黏性測試的驗收指標。
實施步驟
- 盤點共享資源:找出會修改同一帳號、工作階段、地區 fixture 或獨占輸出的測試,確認這是真正共享,而不是 fixture 設計不當。
- 建立單測基線:加鎖前逐一執行,記錄路由、地區、匿名出口指紋、帳號狀態、耗時與內容斷言。單獨執行也失敗的問題不是並行問題。
- 重現衝突:固定輸入並行執行相關測試,同時保存瀏覽器 trace 與去識別代理端觀測,證明哪個重疊操作改變結果。
- 加入窄鎖:只讓共享同一衝突域的測試使用相同穩定鍵。單一測試需要多項資源時,明確列出全部鎖。
- 測量結果:比較失敗率、排隊時間、總套件耗時和無關測試吞吐。目標是消除指定衝突,同時保留其他並行能力。
- 驗證異常退出:在受控環境強制斷言失敗、逾時與 worker 重新啟動,確認後續測試仍能取得資源,清理也能恢復帳號、工作階段與產物狀態。
注意檔案執行模式
Playwright 並行文件說明,在 default 與 serial 檔案模式下,同一檔案的測試會依序一起執行;某個測試宣告的鎖可能因此在整個檔案執行期間被持有。若鎖看起來比預期更嚴格,應先檢查檔案組織。
如果只有一個測試需要獨占代理租約,把無關測試放在同一檔案可能意外擴大臨界區。應按真實資源所有權組織測試,而不是廣泛加入鎖。
建議保留的證據
每個加鎖測試可記錄:測試 ID、project、worker、匿名鎖 ID、等待毫秒、資源租約 ID、代理路由 ID、預期地區、匿名出口指紋、前後帳號狀態、結果類別、清理結果與總耗時。
禁止記錄代理密碼、驗證標頭、Cookie、Token、完整個人資料或目標秘密。匿名資源租約與路由 ID 通常已足夠定位爭用。
如何解讀失敗
- 加窄鎖後失敗消失:較可能是共享資源爭用,不代表代理品質一定差;仍要重複執行並驗證重設確定性。
- 單獨執行仍失敗:檢查代理設定、DNS、TLS、目標回應與斷言,鎖沒有處理真正問題層。
- 排隊時間激增:鎖範圍可能過大、資源容量不足,或測試在無關準備與報告階段仍持有鎖。
- 序列化後仍出現錯誤地區:檢查租約分配、工作階段語意、重新導向和內容驗證;互斥不能保證供應商選擇正確出口。
- 後續測試繼承狀態:清理或 fixture 隔離不完整;不再重疊並不等於資源已乾淨。
上線檢查清單
- [ ] CI 已固定並驗證 Playwright 1.63。
- [ ] 每個鎖都映射到有文件的衝突域。
- [ ] 鎖名不含憑證或客戶資料。
- [ ] 並行診斷前,測試能單獨通過。
- [ ] 無鎖時可穩定重現衝突。
- [ ] 不同地區與帳號仍維持並行。
- [ ] 每個測試都會重設 context 與帳號狀態。
- [ ] 逾時和 worker 重新啟動後資源可再次取得。
- [ ] 已監控鎖等待時間與總套件耗時。
- [ ] 路由、出口地區與內容證據分開保存。
- [ ] 強制代理失敗時關閉,不會靜默直連。
- [ ] 仍遵守供應商與目標並行限制。
常見問題
所有代理測試都應使用同一個全域鎖嗎?
不應。這會失去有效並行覆蓋,並可能掩蓋容量或工作階段分區缺陷。只鎖住無法安全拆分的資源。
測試鎖會在供應商端保留一個代理 IP 嗎?
不會。它只協調使用相同鎖名的 Playwright 測試。供應商的出口分配、工作階段租約與並行限制是另一套控制。
測試鎖可以取代每個測試一個瀏覽器 context 嗎?
不能。鎖不會隔離 Cookie、快取、本機儲存、OPFS、Service Worker 或目標帳號狀態。
一個測試能同時持有工作階段鎖和帳號鎖嗎?
可以。Playwright 1.63 支援多個鎖,但只有確實需要兩項共享資源時才這樣做,並維持一致的資源命名規則。
合規說明
瀏覽器自動化與代理只能用於合法且已獲授權的測試、市場研究、廣告驗證和資料蒐集。遵守目標條款、robots 指令、同意要求、隱私法規、速率限制及供應商政策。測試鎖是協調工具,不能成為超出供應商並行額度或目標允許頻率的理由,也不得用於規避偵測、帳號濫用、繞過購買限制或存取控制。