跳轉到

4.2 截圖與影片:失敗證據保存#

為什麼要截圖?#

測試在 CI 上失敗了,但你不在現場、看不到畫面。截圖與影片就是失敗的證據——打開圖片就知道當時頁面長什麼樣。

設定檔的預設行為#

// playwright.config.ts
use: {
  screenshot: "only-on-failure",   // 失敗時自動截圖
  video: "retain-on-failure",      // 失敗時保留影片
  trace: "retain-on-failure",      // 失敗時保留 trace
},

失敗的證據會存到 test-results/ 目錄。

screenshot 的選項#

值 行為
"off" 不截圖(預設)
"on" 每個測試都截圖
"only-on-failure" 只在失敗時截圖(最常用)

手動截圖#

// 頁面截圖
await page.screenshot({ path: "screenshot.png" });

// 只截某個元素
await page.getByRole("form").screenshot({ path: "form.png" });

// 整頁(含捲動範圍)
await page.screenshot({ path: "full.png", fullPage: true });

視覺比對測試(Snapshot Testing)#

驗證「畫面長得跟上次一樣」,適合偵測非預期的 UI 變化:

test("首頁不應該有非預期的視覺變化", async ({ page }) => {
  await page.goto("https://my-site.com");
  await expect(page).toHaveScreenshot();   // 第一次跑會建立基準圖,之後自動比對
});

基準圖不符時會失敗,並輸出差異圖。更新基準圖:

npx playwright test --update-snapshots

⚠️ 注意:視覺比對測試很敏感(字型渲染不同就會失敗),跨機器比對要設定 maxDiffPixels 或用 Docker 統一環境。關鍵元件(如 logo、價格區塊)比對整頁更實用。

錄影的選項#

值 行為
"off" 不錄影
"on" 每個測試都錄
"retain-on-failure" 失敗才保留影片(最常用)

分工建議#

需求 用什麼
CI 失敗後看當時畫面 screenshot: "only-on-failure"
看操作過程 video: "retain-on-failure" 或 Trace Viewer
偵測非預期 UI 變化 toHaveScreenshot() 視覺比對

心法:失敗要留證據。CI 上的失敗你看不到畫面,截圖、影片、trace 三選一至少開一個(推薦全開 retain-on-failure)。