TIÊU ĐỀ: Kiểm thử E2E với Playwright: 4 Quy tắc để không còn lỗi kiểm thử không ổn định

Table of Contents
Cái chết của sleep(5000)
Mọi kỹ sư giàu kinh nghiệm đều hiểu rõ nỗi đau của các bộ kiểm thử không ổn định trong các pipeline CI. 80% lỗi kiểm thử không phải là lỗi thực sự—chúng do điều kiện tranh chấp (race conditions), khung hình động chậm, và các lệnh time.sleep(5) hoặc cy.wait(3000) tùy tiện gây ra.
Microsoft Playwright về cơ bản đã khắc phục điều này. Bằng cách giao tiếp trực tiếp với các công cụ kết xuất trình duyệt thông qua Chrome DevTools Protocol (CDP) và luồng WebSocket, Playwright loại bỏ sự không ổn định với tính năng tự động chờ tích hợp, cách ly trình duyệt đa ngữ cảnh, và phân chia kiểm thử song song tự nhiên.
Trong hướng dẫn này, bạn sẽ nắm vững các mô hình tư duy, các phương pháp hay nhất về bộ định vị (locator), và các mẫu CI/CD cần thiết để xây dựng các bộ kiểm thử E2E cấp doanh nghiệp.
So sánh các Framework E2E: Playwright vs Cypress vs Selenium
| Tính năng | Playwright | Cypress | Selenium |
|---|---|---|---|
| Giao tiếp với trình duyệt | WebSocket / DevTools Protocol trực tiếp | Thực thi iframe trong trình duyệt | Trình bao bọc HTTP WebDriver REST |
| Công cụ tự động chờ | Tích hợp sẵn: Kiểm tra khả năng hiển thị, độ ổn định và các sự kiện trước khi thực hiện hành động | Một phần (thường yêu cầu cy.wait hoặc thử lại) | Thủ công (Thread.sleep hoặc Explicit Waits) |
| Đa tab & Đa miền | Hỗ trợ tự nhiên trên các nguồn gốc & nhiều tab/cửa sổ | Hạn chế ràng buộc nguồn gốc một miền | Được hỗ trợ với việc chuyển đổi cửa sổ phức tạp |
| Tốc độ thực thi & Workers | BrowserContexts cô lập không tốn chi phí trong song song | Một kiểm thử trên mỗi tiến trình runner | Các phiên bản trình duyệt đầy đủ nặng nề |
Quy trình khả năng thực thi tự động chờ
Tại sao Playwright không bao giờ cần sleep()? Trước khi thực hiện bất kỳ hành động nào (ví dụ: click, fill, hover), Playwright chạy một quá trình xác minh khả năng thực thi tự động gồm 6 bước:
3 Chế độ để tăng tốc quy trình làm việc của bạn
Chế độ UI của Playwright cung cấp cho bạn khả năng gỡ lỗi theo thời gian, chế độ xem, và chọn bộ định vị DOM trực quan theo thời gian thực:
# Launch interactive graphical test runner
npx playwright test --ui
Điểm nổi bật: Quay ngược qua các ảnh chụp DOM, kiểm tra các yêu cầu mạng theo từng bước, và kiểm thử các bộ định vị trực tiếp trong cây DOM.
Thực thi bộ kiểm thử của bạn trên Chromium, Firefox và WebKit đồng thời:
# Run tests in parallel with HTML reporting
npx playwright test --project=chromium --workers=4
npx playwright show-report
Điểm nổi bật: Tạo ra các dấu vết toàn diện, nhật ký console, thác nước mạng, và phát lại video cho các kiểm thử thất bại.
Ghi lại các hành động của người dùng trong một trình duyệt thực và tự động tạo mã TypeScript sạch:
# Record interactions and export test code
npx playwright codegen https://myapp.com
Điểm nổi bật: Tự động chọn các bộ định vị vai trò hướng người dùng bền vững (getByRole, getByLabel) thay vì các lớp CSS dễ vỡ.
Mẫu kiểm thử sản xuất: Luồng xác thực & giỏ hàng mạnh mẽ
import { test, expect } from "@playwright/test";
test.describe("E-Commerce Checkout Workflow", () => {
test.beforeEach(async ({ page }) => {
await page.goto("/store");
});
test("User can search, add item to cart, and reach payment screen", async ({ page }) => {
// 1. Resilient Locator: Target user-facing semantic role
const searchInput = page.getByRole("searchbox", { name: "Search products" });
await searchInput.fill("Mechanical Keyboard");
await page.keyboard.press("Enter");
// 2. Locate product card and click Add to Cart
const productCard = page.getByTestId("product-card").filter({ hasText: "Keychron K2" });
await expect(productCard).toBeVisible();
const addToCartButton = productCard.getByRole("button", { name: "Add to Cart" });
await addToCartButton.click();
// 3. Verify badge updates without manual wait
const cartBadge = page.getByRole("status", { name: "Cart items" });
await expect(cartBadge).toHaveText("1");
// 4. Navigate to checkout and confirm form presence
await page.getByRole("link", { name: "Proceed to Checkout" }).click();
await expect(page).toHaveURL(/.*\/checkout/);
const emailInput = page.getByLabel("Email address");
await expect(emailInput).toBeFocused();
});
});
4 Quy tắc cho các bộ E2E hoàn hảo
1. Ưu tiên các bộ định vị vai trò hướng người dùng
Tránh các bộ chọn CSS dễ vỡ như .btn-primary-2 hoặc #item > div:nth-child(3). Luôn sử dụng page.getByRole(), page.getByLabel(), hoặc page.getByText() phản ánh cách người dùng thực và trình đọc màn hình tương tác với trang.
2. Tận dụng chia sẻ xác thực BrowserContext
Đừng đăng nhập qua UI trong mỗi kiểm thử! Đăng nhập một lần trong thiết lập toàn cục, lưu trạng thái lưu trữ đã ký vào auth.json, và tái sử dụng trạng thái lưu trữ đã xác thực trên các worker kiểm thử song song.
3. Không bao giờ mã hóa cứng các lệnh Sleep
Thay thế mọi page.waitForTimeout(3000) bằng các xác nhận ưu tiên web như await expect(locator).toBeVisible() hoặc await page.waitForResponse().
4. Đính kèm Trace Viewer khi CI thất bại
Cấu hình trace: 'on-first-retry' trong playwright.config.ts. Khi một kiểm thử thất bại trong GitHub Actions, bạn sẽ nhận được một video đầy đủ, dòng thời gian hành động và gói ảnh chụp DOM để gỡ lỗi cục bộ.
Thẻ ghi nhớ thuật ngữ thiết yếu
BrowserContext
BrowserContext
Web-First Assertions
Web-First Assertions
Storage State
Storage State
Kiểm tra kiến thức tương tác
Các câu hỏi thường gặp
Có! Playwright hỗ trợ phân chia kiểm thử tự nhiên trong các nền tảng CI như GitHub Actions, cho phép bạn chia một bộ kiểm thử 30 phút thành 4 runner song song trong vòng chưa đầy 8 phút.
Playwright cho phép bạn chặn và giả lập bất kỳ yêu cầu HTTP/WebSocket nào trực tiếp bằng cách sử dụng các trình xử lý page.route() mà không cần máy chủ proxy bên ngoài.
Playwright cung cấp khả năng mô phỏng trình duyệt di động độ trung thực cao, mô phỏng kích thước khung nhìn thiết bị, cử chỉ chạm, tác nhân người dùng và tọa độ định vị GPS.
Bạn cũng có thể thích
Free In-Browser Developer Tools
Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.
Related Articles

Các lựa chọn thay thế Playwright tốt nhất cho tự động hóa doanh nghiệp
Playwright cực kỳ mạnh mẽ, nhưng các nhóm doanh nghiệp đôi khi cần các lựa chọn thay thế khi bộ công cụ của họ mở rộng quy mô. Chúng tôi so sánh các công cụ kiểm thử E2E hàng đầu cho năm 2026 dựa trên tích hợp CI/CD, hồi quy hình ảnh và các tính năng AI.
Read more
5 lựa chọn thay thế Playwright tốt nhất cho kiểm thử E2E vào năm 2026
So sánh toàn diện các lựa chọn thay thế Playwright hàng đầu cho kiểm thử end-to-end: Cypress, WebdriverIO, Selenium 4, Puppeteer và TestCafe.
Read more
Các lựa chọn thay thế Playwright hàng đầu năm 2026: So sánh Cypress, WebdriverIO, Vitest & Puppeteer
Hướng dẫn toàn diện về các lựa chọn thay thế Playwright hàng đầu năm 2026: so sánh Cypress, WebdriverIO, Vitest & Puppeteer với các ví dụ thực tế đã được kiểm chứng.
Read more