Câu hỏi thường gặp

Trạng thái hỗ trợ trên nhiều trình duyệt là gì?

Tính năng hỗ trợ chính thức của Firefox đang trong giai đoạn thử nghiệm. Quá trình cộng tác liên tục với Mozilla nhằm hỗ trợ các trường hợp sử dụng kiểm thử từ đầu đến cuối phổ biến mà nhà phát triển muốn có mức độ phù hợp trên nhiều trình duyệt. Nhóm Puppeteer cần ý kiến đóng góp của người dùng để ổn định khả năng hỗ trợ của Firefox và chú ý đến các API bị thiếu.

Từ Puppeteer phiên bản 2.1.0 trở đi, bạn có thể chỉ định puppeteer.launch({product: 'firefox'}) để chạy các tập lệnh Puppeteer trong Firefox Nightly mà không cần bản vá
tuỳ chỉnh bổ sung. Mặc dù thử nghiệm cũ yêu cầu phải có một phiên bản vá lỗi của Firefox, nhưng phương pháp hiện tại hoạt động với Firefox "còn hàng".

Chúng tôi tiếp tục cộng tác với các nhà cung cấp trình duyệt khác để hỗ trợ Puppeteer cho các trình duyệt, chẳng hạn như Safari. Nỗ lực này bao gồm việc khám phá một tiêu chuẩn để thực thi các lệnh trên nhiều trình duyệt (thay vì dựa vào Giao thức DevTools không chuẩn mà Chrome sử dụng).

Mục tiêu và nguyên tắc của Puppeteer là gì?

Mục tiêu của dự án là:

  • Cung cấp một thư viện chính tắc, gọn gàng, làm nổi bật các tính năng của Giao thức công cụ cho nhà phát triển.
  • Cung cấp cách triển khai tham chiếu cho các thư viện kiểm thử tương tự. Cuối cùng, các khung khác này có thể sử dụng Puppeteer làm lớp nền tảng.
  • Tăng mức độ sử dụng tính năng kiểm thử trình duyệt tự động/không có giao diện người dùng.
  • Giúp thử nghiệm nội bộ các tính năng mới của Giao thức cho nhà phát triển...và phát hiện lỗi!
  • Tìm hiểu thêm về những vấn đề của thử nghiệm trình duyệt tự động và giúp bổ sung những khoảng trống đó.

Chúng tôi điều chỉnh các nguyên tắc Chromium để giúp chúng tôi thúc đẩy các quyết định về sản phẩm:

  • Tốc độ: Puppeteer có mức hao tổn hiệu suất gần như bằng không so với một trang tự động.
  • Bảo mật: Puppeteer hoạt động ngoài quy trình đối với Chromium, giúp đảm bảo an toàn khi tự động hoá các trang có thể độc hại.
  • Độ ổn định: Puppeteer không được trông không ổn định và không được rò rỉ bộ nhớ.
  • Tính đơn giản: Puppeteer cung cấp một API cấp cao dễ sử dụng, dễ hiểu và gỡ lỗi.

Puppeteer có thay thế Selenium/WebDriver không?

Không. Cả hai dự án đều có giá trị vì những lý do rất khác nhau:

  • Selenium/WebDriver tập trung vào việc tự động hoá trên nhiều trình duyệt; tuyên bố giá trị của Selenium/WebDriver là một API chuẩn duy nhất hoạt động trên tất cả các trình duyệt chính.
  • Puppeteer tập trung vào Chromium; tuyên bố giá trị của Chromium là nhiều khả năng hơn và độ tin cậy cao hơn.

Tuy nhiên, bạn có thể sử dụng Puppeteer để chạy các thử nghiệm với Chromium, chẳng hạn như sử dụng jest-puppeteer do cộng đồng hướng tới. Mặc dù đây có thể không phải là giải pháp thử nghiệm duy nhất của bạn, nhưng nó có một số điểm tốt so với WebDriver:

  • Puppeteer yêu cầu không thiết lập và đi kèm với phiên bản Chromium hoạt động tốt nhất. Tốt hơn là bạn nên có một vài hoạt động kiểm thử chỉ chạy với Chromium thay vì hoàn toàn không có hoạt động kiểm thử nào.
  • Puppeteer có cấu trúc dựa trên sự kiện giúp loại bỏ nhiều khả năng không ổn định. Bạn không cần thực hiện các lệnh gọi "Sleep(1000)" xấu trong tập lệnh rối.
  • Theo mặc định, Puppeteer chạy không có giao diện người dùng nên có thể chạy nhanh. Puppeteer phiên bản 1.5.0 cũng hiển thị các ngữ cảnh trên trình duyệt, giúp bạn có thể thực thi thử nghiệm song song một cách hiệu quả.
  • Puppeteer làm rõ khi gỡ lỗi: lật bit "không có giao diện người dùng" thành false, thêm "slowMo" và bạn sẽ thấy hoạt động của trình duyệt. Thậm chí, bạn có thể mở Công cụ của Chrome cho nhà phát triển để kiểm tra môi trường kiểm thử.

Tại sao Puppeteer v.XXX không hoạt động với Chromium v.YYY?

Chúng ta xem Puppeteer là một thực thể không thể phân chia với Chromium. Mỗi phiên bản của Puppeteer bao gồm một phiên bản Chromium cụ thể – phiên bản duy nhất của Chromium đảm bảo hoạt động được.

Đây không phải là quy tắc ràng buộc giả tạo. Rất nhiều công việc trên Puppeteer thực sự diễn ra trong kho lưu trữ Chromium. Sau đây là một câu chuyện điển hình:

  1. Đã báo cáo lỗi Puppeteer
  2. Đây là vấn đề với giao thức Công cụ cho nhà phát triển, vì vậy, chúng tôi khắc phục vấn đề này trong Chromium
  3. Sau khi khắc phục được lỗi ngược dòng, chúng tôi đưa Chromium đã cập nhật vào Puppeteer

Tuy nhiên, thông thường, bạn nên sử dụng Puppeteer với Google Chrome chính thức thay vì Chromium. Để làm được điều này, bạn nên cài đặt phiên bản puppeteer-core tương ứng với phiên bản Chrome.

Ví dụ: để thúc đẩy Chrome 101 bằng puppeteer-core, hãy sử dụng thẻ npm chrome-101:

npm install puppeteer-core@chrome-101

Puppeteer sử dụng phiên bản Chromium nào?

Tìm phiên bản bằng một trong những cách sau:

  • Tìm mục chromium trong revisions.ts. Để tìm số phiên bản và số cam kết tương ứng của Chromium, hãy tìm bản sửa đổi có tiền tố r trong phần "Tìm bản phát hành" của OmahaProxy.
  • Hãy tìm bản đồ versionsPerRelease trong versions.js có chứa mục ánh xạ giữa phiên bản Chromium và phiên bản Puppeteer. Lưu ý: Tệp chỉ chứa các phiên bản Puppeteer mà Chromium được cập nhật. Không phải tất cả các phiên bản Puppeteer đều được liệt kê.

Puppeteer sử dụng phiên bản Firefox nào?

Do tính năng hỗ trợ Firefox đang trong giai đoạn thử nghiệm nên Puppeteer sẽ tải Firefox Nightly mới nhất xuống khi biến môi trường PUPPETEER_PRODUCT được đặt thành firefox. Đó cũng là lý do giá trị của firefox trong revisions.tslatest – Puppeteer không gắn liền với một phiên bản Firefox cụ thể nào.

Cách tìm nạp Firefox Nightly trong quá trình cài đặt Puppeteer:

PUPPETEER_PRODUCT=firefox npm i puppeteer
# or "yarn add puppeteer"

Thế nào là điều hướng?

Theo quan điểm của Puppeteer, "điều hướng" là bất cứ điều gì làm thay đổi URL của một trang. Ngoài hoạt động điều hướng thông thường mà trình duyệt truy cập mạng để tìm nạp tài liệu mới từ máy chủ web, còn bao gồm hoạt động sử dụng điều hướng neo và sử dụng API lịch sử.

Với định nghĩa này về "điều hướng", Puppeteer hoạt động liền mạch với các ứng dụng trang đơn.

Sự khác biệt giữa sự kiện nhập là "đáng tin cậy" và "không đáng tin cậy" là gì?

Trong trình duyệt, sự kiện nhập có thể được chia thành hai nhóm lớn: đáng tin cậy và không đáng tin cậy.

  • Sự kiện đáng tin cậy: các sự kiện do người dùng tương tác với trang, chẳng hạn như sử dụng chuột hoặc bàn phím.
  • Sự kiện không đáng tin cậy: các sự kiện do API web tạo ra, chẳng hạn như các phương thức document.createEvent hoặc element.click().

Các trang web có thể phân biệt hai nhóm này:

  • sử dụng cờ sự kiện Event.isTrusted
  • dựa trên các sự kiện đi kèm. Ví dụ: mọi sự kiện 'click' đáng tin cậy đều đứng sau các sự kiện 'mousedown''mouseup'.

Nhằm mục đích tự động hoá, việc tạo các sự kiện đáng tin cậy là rất quan trọng. Tất cả các sự kiện đầu vào được tạo bằng Puppeteer đều đáng tin cậy và kích hoạt các sự kiện đi kèm phù hợp.

Nếu vì lý do nào đó, nếu cần một sự kiện không đáng tin cậy, người dùng luôn có thể chuyển đến ngữ cảnh trang bằng page.evaluate và tạo một sự kiện giả:

await page.evaluate(() => {
  document.querySelector('button[type=submit]').click();
});

Puppeteer không hỗ trợ những tính năng nào?

Bạn có thể nhận thấy Puppeteer không hoạt động như mong đợi khi kiểm soát các trang kết hợp âm thanh và video. Ví dụ: không thể phát video và ảnh chụp màn hình.) Có 2 lý do dẫn đến trường hợp này:

  • Puppeteer đi kèm với Chromium (không phải Chrome). Vì vậy, theo mặc định, Chrome sẽ kế thừa tất cả các giới hạn liên quan đến nội dung nghe nhìn của Chromium. Điều này có nghĩa là Puppeteer không hỗ trợ các định dạng được cấp phép như AAC hoặc H.264.
    • Bạn có thể buộc Puppeteer sử dụng phiên bản Chrome được cài đặt riêng thay vì Chromium với tuỳ chọn executablePath thành puppeteer.launch. Bạn chỉ nên sử dụng cấu hình này nếu cần một bản phát hành Chrome chính thức có hỗ trợ các định dạng nội dung đa phương tiện này.
  • Vì Puppeteer (trong mọi cấu hình) điều khiển phiên bản Chromium hoặc Chrome dành cho máy tính nên các tính năng chỉ được phiên bản Chrome dành cho thiết bị di động hỗ trợ sẽ không được hỗ trợ. Điều này có nghĩa là Puppeteer không hỗ trợ Phát trực tuyến dựa trên HTTP (HLS).

Tôi gặp sự cố khi cài đặt / chạy Puppeteer trong môi trường thử nghiệm của mình. Tôi nên tìm sự trợ giúp ở đâu?

Chúng tôi có hướng dẫn khắc phục sự cố cho nhiều hệ điều hành, trong đó liệt kê các phần phụ thuộc bắt buộc.

Chromium được tải xuống mỗi npm ci lần chạy. Làm cách nào để tôi lưu tệp tải xuống vào bộ nhớ đệm?

Đường dẫn tải xuống mặc định là node_modules/puppeteer/.local-chromium. Tuy nhiên, bạn có thể thay đổi đường dẫn đó bằng biến môi trường PUPPETEER_DOWNLOAD_PATH.

Puppeteer sử dụng biến đó để phân giải vị trí thực thi Chromium trong quá trình khởi chạy, vì vậy, bạn không cần chỉ định PUPPETEER_EXECUTABLE_PATH.

Ví dụ: để giữ lại tệp tải xuống Chromium trong ~/.npm/chromium:

export PUPPETEER_DOWNLOAD_PATH=~/.npm/chromium
npm ci

# by default the Chromium executable path is inferred
# from the download path
npm test

# a new run of npm ci will check for the existence of
# Chromium in ~/.npm/chromium
npm ci

Tôi có câu hỏi khác! Tôi có thể hỏi ở đâu?

Có nhiều cách để yêu cầu trợ giúp về Puppeteer:

Hãy nhớ tìm kiếm các kênh này trước khi đăng câu hỏi của bạn.