Trace Viewer Deep Dive
จบบทนี้แล้วคุณจะ...
- อธิบายว่า Trace เก็บข้อมูลอะไรบ้าง
- ตั้งค่า trace recording (on, retain-on-failure, on-first-retry)
- เปิดและใช้ Trace Viewer วิเคราะห์ปัญหา
- ใช้ traces ใน CI เพื่อ debug test ที่ fail บน server
Trace คือ "กล่องดำ" ของ test — บันทึกทุกสิ่งที่เกิดขึ้นระหว่าง test ทำงาน:
- Actions — ทุก click, fill, navigate พร้อม timestamp
- Screenshots — ภาพหน้าจอก่อนและหลังแต่ละ action
- Network — ทุก HTTP request/response (รวม headers, body)
- Console — ทุก console.log, error, warning
- Source — test code ที่รันพร้อม highlight บรรทัดปัจจุบัน
เทียบได้กับ DevTools แต่ย้อนเวลากลับไปดูได้
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
trace: 'retain-on-failure',
},
});
ค่าที่ใช้ได้:
| ค่า | พฤติกรรม | เหมาะกับ |
|---|---|---|
'off' |
ไม่บันทึก | production test ที่เสถียรมาก |
'on' |
บันทึกทุก test | debug ช่วง development |
'retain-on-failure' |
บันทึกทุกตัว เก็บเฉพาะ fail | ค่าแนะนำสำหรับทีม |
'on-first-retry' |
บันทึกเฉพาะ retry ครั้งแรก | CI ที่มี retry |
แนะนำ: ใช้ 'retain-on-failure' เป็น default — ไม่เปลืองพื้นที่แต่มี trace พร้อมเมื่อต้องการ
# เปิด trace จาก file
npx playwright show-trace test-results/auth-login/trace.zip
# หรือเปิดจาก HTML report — click ที่ test ที่ fail แล้วกด "Traces"
npx playwright show-report
Trace Viewer จะเปิดใน browser พร้อม UI ที่มี:
- Timeline — แถบเวลาด้านบน เลื่อนไปแต่ละ action ได้
- Actions panel — รายการ actions ทั้งหมดทางซ้าย
- Screenshot — ภาพหน้าจอตรงกลาง (ก่อน/หลัง action)
- Network tab — request/response ของ action ที่เลือก
- Console tab — console messages ณ เวลานั้น
- Source tab — test code ที่กำลังรัน
ขั้นตอนที่ 1: ดู Action ที่ Fail
เปิด trace → ดูรายการ actions ทางซ้าย → หา action ที่มีสัญลักษณ์ error (แดง)
ขั้นตอนที่ 2: ดู Screenshot ก่อน/หลัง
click ที่ action → ดู "Before" screenshot (หน้าจอก่อนทำ action) และ "After" screenshot → มักเห็นปัญหาทันที เช่น:
- element ไม่ปรากฏ
- ข้อความผิด
- modal บังอยู่
ขั้นตอนที่ 3: ตรวจ Network
click "Network" tab → ดูว่า API call ส่งไปถูก URL ไหม? response status เป็นอะไร? body มีข้อมูลถูกต้องไหม?
ขั้นตอนที่ 4: ตรวจ Console
click "Console" tab → ดู JavaScript errors ที่อาจทำให้ UI ไม่ทำงาน
// playwright.config.ts สำหรับ CI
import { defineConfig } from '@playwright/test';
export default defineConfig({
retries: process.env.CI ? 2 : 0,
use: {
trace: process.env.CI ? 'on-first-retry' : 'retain-on-failure',
},
});
ใน GitHub Actions — upload trace เป็น artifact:
- uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-traces
path: test-results/
retention-days: 7
จากนั้นดาวน์โหลด artifact → เปิดด้วย:
npx playwright show-trace path/to/trace.zip
หรือใช้ online viewer: https://trace.playwright.dev — ลาก trace.zip ไปวางได้เลย
// เปิด trace เฉพาะ test ที่ต้องการ debug
test('complex checkout flow', async ({ page, context }) => {
// เริ่ม trace
await context.tracing.start({ screenshots: true, snapshots: true });
await page.goto('/checkout');
// ... test steps ...
// หยุด trace และ save
await context.tracing.stop({ path: 'traces/checkout.zip' });
});
สถานการณ์: test นี้ fail:
test('user adds item to cart', async ({ page }) => {
await page.goto('/products');
await page.locator('[data-testid="product-1"]').click();
await page.locator('.add-to-cart').click();
await expect(page.locator('.cart-count')).toHaveText('1');
});
ข้อมูลจาก Trace Viewer:
| Action | Screenshot (Before) | Screenshot (After) | Network | Console |
|---|---|---|---|---|
| goto /products | — | สินค้า 3 รายการ | GET /api/products → 200 | — |
| click product-1 | หน้า list | หน้า product detail | GET /api/products/1 → 200 | — |
| click .add-to-cart | หน้า detail + ปุ่ม | ปุ่มเปลี่ยนเป็น "กำลังเพิ่ม..." | POST /api/cart → 401 Unauthorized | Error: "User not authenticated" |
| expect cart-count = '1' | .cart-count = '0' | TIMEOUT | — | — |
คำถาม:
- สาเหตุหลักของ failure คืออะไร?
- ข้อมูลจาก tab ไหนที่ช่วยวิเคราะห์ได้มากที่สุด?
- จะแก้ test นี้อย่างไร?
ดูคำตอบแนะนำ
สรุปคำตอบ
สาเหตุหลัก POST
/api/cartได้401 Unauthorizedแปลว่า user ยังไม่ได้ login ก่อนกด add to cart ดังนั้นสินค้าไม่ได้ถูกเพิ่มเข้า cart จริงTab ที่ช่วยวิเคราะห์มากที่สุด
- Network tab — เห็นชัดว่า request
POST /api/cartได้401 - Console tab — เห็น error
"User not authenticated"ช่วยยืนยันสาเหตุ - Screenshot — เห็นว่าปุ่มเปลี่ยนเป็น
"กำลังเพิ่ม..."แต่ไม่กลับสู่สถานะปกติ แปลว่า request ล้มเหลว
- Network tab — เห็นชัดว่า request
วิธีแก้ เพิ่ม login step ก่อน test หรือใช้
storageStateจาก authenticated session
test.beforeEach(async ({ page }) => {
// login ก่อนทุก test
await page.goto('/login');
await page.locator('#email').fill('[email protected]');
await page.locator('#password').fill('password');
await page.locator('button[type="submit"]').click();
await page.waitForURL('/products');
});
สิ่งที่ต้องจำ
- Trace = กล่องดำ ที่บันทึก actions, screenshots, network, console ทั้งหมด
'retain-on-failure'คือค่าแนะนำ — มี trace พร้อมใช้เมื่อ test fail- Trace Viewer มี timeline, screenshot ก่อน/หลัง, network, console — ครบในที่เดียว
- ใน CI ให้ upload traces เป็น artifact แล้วดาวน์โหลดมาวิเคราะห์
- https://trace.playwright.dev เปิด trace ออนไลน์ได้ ไม่ต้องติดตั้งอะไร