Puppeteer cho fresher: Test web headless không cần framework nặng

5 tháng trước · 12 phút đọc
Puppeteer là gì và tại sao fresher nên học trước?
Mình nhớ lần đầu được giao nhiệm vụ "test tự động" khi mới vào nghề. Mở Selenium lên, cài driver, cấu hình... mất cả buổi sáng vẫn chưa chạy được dòng đầu tiên. Rồi một đồng nghiệp bảo: "Thử Puppeteer đi, 5 phút là chạy được."
Puppeteer là thư viện Node.js cho phép điều khiển trình duyệt Chrome/Chromium bằng code. Bạn có thể dùng nó để:
- Mở trang web, click nút, điền form
- Chụp screenshot hoặc xuất PDF
- Scrape dữ liệu từ trang web
- Kiểm tra luồng người dùng tự động (automation test)
Headless nghĩa là chạy Chrome không có giao diện hiển thị - như Chrome ẩn hình vẫn duyệt web bình thường. Tốc độ nhanh hơn, không chiếm màn hình, chạy được trên server.
Puppeteer điều khiển Chrome ngầm, không cần bạn nhìn thấy gì
Tại sao phù hợp với fresher? Ba lý do đơn giản:
Một: Cài đặt 1 lệnh, không cần driver riêng như Selenium. Puppeteer tự đi kèm Chromium.
Hai: Cú pháp JavaScript thuần, không có abstraction layer phức tạp. Bạn đọc code là hiểu code đang làm gì.
Ba: Cộng đồng lớn. Gặp lỗi Google là ra ngay.
Trong danh sách top công cụ automation testing được cộng đồng QA toàn cầu đánh giá cao của State of Testing 2024-2025, Puppeteer vẫn giữ vị trí top các công cụ automation phổ biến nhất - đặc biệt với team nhỏ và dự án cần bắt đầu nhanh.
Cài đặt Puppeteer trong 3 phút
Bạn cần Node.js phiên bản 18 trở lên. Kiểm tra bằng lệnh:
Nếu chưa có Node.js, tải tại nodejs.org. Sau đó tạo thư mục project:
Cài Puppeteer:
Lần đầu cài sẽ mất 1-2 phút vì Puppeteer tự tải Chromium
Gói puppeteer (~170MB) tự tải Chromium về máy. Nếu đường truyền chậm hoặc bạn đã có Chrome, dùng puppeteer-core (nhẹ hơn, nhưng cần chỉ đường dẫn tới Chrome thủ công).
Sau khi cài xong, tạo file test.js với nội dung đơn giản nhất có thể:
Chạy thử:
Nếu thấy file result.png xuất hiện trong thư mục - chúc mừng, bạn đã chạy Puppeteer thành công.
Một lỗi hay gặp ở bước này: Error: Failed to launch the browser process. Nguyên nhân thường là thiếu thư viện hệ thống (Linux) hoặc sandbox bị chặn. Fix bằng cách thêm option:
Thấy khó ở bước này thì bình thường - mình cũng mất 20 phút mày mò lần đầu. Cứ copy lỗi paste vào Google là ra cách fix ngay.
Scrape dữ liệu web: Ví dụ thực tế với trang tin tức
Scraping là lấy dữ liệu từ trang web bằng code - thay vì tay bạn copy từng cái, Puppeteer làm thay. Dưới đây mình hướng dẫn scrape danh sách tiêu đề bài viết từ một trang tin tức.
Trước khi code, cần biết CSS selector để chỉ cho Puppeteer biết "lấy phần tử này". Mở trang web, bấm chuột phải vào tiêu đề, chọn Inspect để xem HTML. Ví dụ thấy <h2 class="article-title">, selector sẽ là .article-title.
Inspect Element giúp tìm đúng selector - bước quan trọng nhất khi scrape
Hàm page.evaluate() là điểm đặc biệt của Puppeteer. Code bên trong hàm này chạy trong ngữ cảnh trình duyệt - bạn có thể dùng document, window, các DOM API bình thường. Code bên ngoài chạy trong Node.js. Hai vùng này tách biệt hoàn toàn.
Lưu ý về scraping: Luôn kiểm tra robots.txt của trang web và điều khoản dịch vụ trước khi scrape. Dùng delay giữa các request để không làm quá tải server. Scrape cho mục đích học tập hoặc dữ liệu cá nhân thì ổn, nhưng cần cẩn thận khi dùng thương mại.
Template script test e-commerce Việt Nam
Mình hay dùng Puppeteer để kiểm tra luồng mua hàng - thứ mà nếu lỗi sẽ thiệt hại trực tiếp về doanh thu. Dưới đây là template kiểm tra 3 điểm quan trọng nhất của một trang e-commerce:
- Trang sản phẩm load được và hiển thị đúng giá
- Nút "Thêm vào giỏ hàng" hoạt động
- Giỏ hàng cập nhật đúng số lượng
Tải template đầy đủ tại đây: Template test e-commerce với Puppeteer
Chụp screenshot khi lỗi là thói quen tốt - tiết kiệm nhiều thời gian debug
Có một điểm mình thấy nhiều fresher hay bỏ qua: luôn chụp screenshot khi test fail. Trong block catch, thêm page.screenshot() ngay. Bug không dễ reproduce - ảnh chụp lúc lỗi xảy ra giúp bạn và dev hiểu được vấn đề mà không cần reproduce lại.
Ngoài ra, đặt headless: false khi đang viết script mới. Bạn sẽ thấy Chrome tự mở, tự click - dễ phát hiện script sai chỗ nào. Khi script chạy ổn rồi, chuyển về true để chạy background.
Puppeteer vs Selenium: Chọn cái nào khi mới bắt đầu?
Câu hỏi này mình nghe rất nhiều. Câu trả lời ngắn: Bắt đầu với Puppeteer, học Selenium sau khi đi làm.
Lý do:
| Tiêu chí | Puppeteer | Selenium |
|---|---|---|
| Cài đặt | 1 lệnh npm | Cài driver riêng, cấu hình nhiều bước |
| Tốc độ học | 1-2 ngày chạy được | 3-5 ngày mới ổn định |
| Hỗ trợ browser | Chủ yếu Chrome/Chromium | Multi-browser (Chrome, Firefox, Safari...) |
| Dùng trong team | Phổ biến ở startup, team JS | Phổ biến ở enterprise, Java/.NET team |
| Phù hợp học | Rất phù hợp fresher | Phù hợp khi đã có nền tảng |
Selenium mạnh hơn khi cần test đa trình duyệt hoặc làm việc trong môi trường Java/.NET. Nhưng với fresher học tự động hóa lần đầu, overhead cài đặt và cấu hình Selenium thường khiến nhiều bạn nản trước khi viết được dòng code đầu tiên.
Puppeteer và Selenium phù hợp cho các giai đoạn khác nhau trong career
Playwright - anh em ruột của Puppeteer do cùng team Microsoft phát triển - hiện đang nổi lên như một lựa chọn mạnh hơn về multi-browser. 67% growth in adoption since 2024 (Browserbase) cho thấy Playwright đang tăng trưởng nhanh. Nhưng cú pháp Playwright và Puppeteer rất giống nhau, nên học Puppeteer xong chuyển Playwright rất dễ.
Nếu bạn đang học JavaScript cơ bản, mình gợi ý ghé qua khóa Lập Trình JavaScript Cơ Bản trước - miễn phí, cover đủ async/await và Promise mà Puppeteer dùng nhiều.
Các kỹ thuật Puppeteer hay dùng khi test thực tế
Viết được script chạy là một chuyện. Viết script chạy ổn định qua nhiều lần là chuyện khác. Đây là 4 kỹ thuật mình dùng mỗi ngày:
1. Chờ đúng cách - không dùng setTimeout
Nhiều người mới hay làm:
Làm đúng:
2. Screenshot theo tên file có timestamp
Lưu theo timestamp giúp bạn không bị ghi đè file cũ, dễ tìm ảnh lỗi tương ứng với lần chạy nào.
3. Test trên màn hình mobile
4. Chặn request không cần thiết để test nhanh hơn
Chặn ảnh và font có thể giúp script chạy nhanh hơn đáng kể
Mình từng chạy test kiểm tra giá 50 sản phẩm mà không chặn resource, mất 4 phút. Sau khi chặn ảnh và font, còn khoảng 50 giây. Cùng kết quả, nhanh hơn 5 lần.
Nếu bạn đang học Node.js để hiểu sâu hơn về môi trường chạy Puppeteer, khóa Node & ExpressJS của F8 cover tốt phần này - cũng miễn phí.
Bước tiếp theo sau khi thành thạo Puppeteer cơ bản
Bạn đã biết cài Puppeteer, scrape dữ liệu, và test luồng mua hàng. Bước tiếp theo làm gì?
Tích hợp vào CI/CD pipeline. Chạy test tự động mỗi khi có code mới push lên - GitHub Actions hỗ trợ tốt. Script Puppeteer của bạn sẽ chạy như một bước trong pipeline, báo lỗi ngay nếu có gì đó sai.
Kết hợp với Jest để có báo cáo test đẹp hơn. Puppeteer thuần chỉ log ra console. Dùng kèm Jest hoặc Mocha sẽ có report tổng hợp pass/fail, tiện trình bày với team.
Học Playwright sau khi quen Puppeteer. Như đã nói, cú pháp tương đồng nhưng Playwright hỗ trợ thêm Firefox và Safari. Chromium (Chrome, Edge), Firefox, WebKit (Safari) (TestDino Blog)
Lộ trình automation testing từ Puppeteer lên Playwright và CI/CD
Download checklist kiểm tra trước khi đưa script Puppeteer vào production tại đây: Tải checklist Puppeteer production-ready
Testing không khó. Khó là giữ thói quen viết test case tỉ mỉ, không bỏ qua edge case, không chạy test cho xong. Mình tin nếu bạn đọc đến đây, bạn đã hiểu: automation test không phải làm cho có, mà là bảo vệ sản phẩm khỏi lỗi.
Test kỹ 1 lần tốt hơn fix lỗi nhiều lần sau production. Script Puppeteer viết hôm nay có thể cứu cả team khỏi một sự cố nghiêm trọng ngày mai. Bắt đầu từ trang sản phẩm đơn giản nhất bạn đang test - chuyển nó thành script tự động hóa. Xong comment bên dưới cho mình biết nhé!
