Puppeteer là thư viện Node.js do Google phát triển, điều khiển trình duyệt Chrome hoặc Chromium qua giao thức DevTools, thường chạy ở chế độ không giao diện (headless). Trong n8n, bạn dùng node cộng đồng n8n-nodes-puppeteer khi cần mở trang web có JavaScript, chụp màn hình hoặc xuất PDF, những việc node HTTP Request không làm được.
Hướng dẫn dưới đây cài node trên n8n tự host chạy Docker, dựng workflow chụp màn hình và sửa lỗi thiếu Chromium bằng image tuỳ biến. Puppeteer là một trong các cách lấy dữ liệu web mà node AI Agent trong n8n có thể dùng; cách làm cơ bản có ở bài crawl dữ liệu website với n8n.
Puppeteer là gì?
Puppeteer là thư viện Node.js cung cấp API cấp cao để điều khiển Chrome hoặc Chromium thông qua giao thức DevTools. Công cụ này chủ yếu chạy ở chế độ headless (không hiện cửa sổ), nên tự động hoá được thao tác web trên máy chủ không có màn hình.
Nhờ điều khiển được trình duyệt thật, Puppeteer thường được dùng để chụp ảnh màn hình, tạo file PDF từ trang web, kiểm thử giao diện và lấy nội dung của trang chỉ hiện ra sau khi JavaScript chạy xong.
Khi nào nên kết hợp n8n và Puppeteer?
n8n và Puppeteer hợp nhau khi một bước trong workflow cần trình duyệt thật: trang dựng bằng React, Vue, Angular, cần bấm nút, cuộn trang hoặc cần ảnh chụp, PDF. Các bước còn lại (lọc, lưu, gửi thông báo) để n8n lo.
- Trang web động: node HTTP Request chỉ tải HTML ban đầu, còn trang Single Page Application (SPA) chỉ có nội dung sau khi JavaScript chạy. Puppeteer render xong trang rồi mới trả HTML.
- Thao tác người dùng: điền biểu mẫu trên hệ thống nội bộ của bạn, cuộn trang để tải thêm nội dung, bấm nút. Puppeteer điều khiển được từng thao tác chuột và bàn phím.
- Ảnh chụp và PDF: lưu ảnh trang báo cáo, xuất hoá đơn web ra PDF để gửi email hoặc lưu Google Drive.
- Phần còn lại cho n8n: lập lịch, xử lý lỗi, lưu Google Sheets, gửi Telegram mà không phải viết thêm mã.
Nếu trang có API chính thức hoặc HTML tĩnh, hãy dùng HTTP Request: nhẹ hơn nhiều so với mở một trình duyệt.
Cách cài node Puppeteer cho n8n?
Node Puppeteer là node cộng đồng n8n-nodes-puppeteer (kho mã trên GitHub, bản 1.5.0 trên npm ngày 23/10/2026). Node này chưa được n8n xác minh nên chỉ cài được trên n8n tự host, không cài được trên n8n Cloud (docs n8n).
Bước 1: Tại giao diện n8n, mở menu tài khoản ở góc dưới bên trái → Settings.

Bước 2: Chọn mục Community Nodes rồi nhấn nút Install.

Bước 3: Nhập tên gói: n8n-nodes-puppeteer, đánh dấu đồng ý với cảnh báo rủi ro khi cài mã chưa xác minh và nhấn Install.

Node cộng đồng chạy với quyền của n8n, nên chỉ cài gói bạn tin cậy và ghim phiên bản khi cài (ví dụ n8n-nodes-puppeteer@1.5.0). Sau khi cài xong, node Puppeteer xuất hiện trong danh sách node.
Cách tạo workflow chụp màn hình trang web bằng Puppeteer?
Workflow mẫu chỉ có hai node: Manual Trigger và Puppeteer với thao tác Get Screenshot. Ví dụ dưới đây chụp trang chủ Google; bạn thay bằng URL trang của mình.
Bước 1: Tạo Trigger
Kéo node Manual Trigger (When clicking ‘Execute workflow’) vào khung làm việc. Node này là nút khởi động thủ công để kiểm tra quy trình.
Bước 2: Cấu hình node Puppeteer
Tìm và kéo node Puppeteer nối vào sau Trigger, chọn thao tác Get Screenshot. Node có bốn thao tác: Get Page Content, Get PDF, Get Screenshot và Run Custom Script.

Trong bảng cấu hình, thiết lập như sau:
- Operation: Giữ nguyên Get Screenshot.
- URL: Nhập
https://www.google.com. - Property Name:
data(tên trường binary chứa ảnh). - Type: PNG (hoặc JPEG, WebP).
- Full Page: bật để cuộn và chụp toàn bộ chiều dài trang; tắt để chỉ chụp phần màn hình đầu tiên.

Bước 3: Thực thi và kiểm tra
Nhấn nút Execute step và xem kết quả ở khung Output bên phải.
- Tab JSON gần như trống vì ảnh là dữ liệu binary.
- Bấm tab Binary (cạnh tab JSON ở góc trên khung Output) sẽ thấy tệp ảnh.
- Bấm View để xem ảnh Puppeteer vừa chụp.


Vì sao node Puppeteer báo lỗi Could not find Chrome trên Docker?
Node Puppeteer báo lỗi Could not find Chrome vì image Docker chính thức của n8n dựa trên Alpine Linux rút gọn, không có Chromium và thư viện đồ hoạ đi kèm. Hay gặp ba thông báo:
- Could not find Chrome: không tìm thấy trình duyệt.
- Error loading shared library (libnss3.so, libatk…): thiếu thư viện hệ thống để khởi chạy trình duyệt.
- Operation not permitted: sandbox của Chrome xung đột với quyền trong container.

Bản cũ của bài này cài Chromium bằng docker exec … apk add. Cách đó không còn dùng được: theo tài liệu n8n (đọc 23/10/2026), image chính thức đã gỡ trình quản lý gói apk; và kể cả khi cài được, gói sẽ mất mỗi lần container được tạo lại (cập nhật n8n, đổi cấu hình). Cách bền là build image n8n riêng có sẵn Chromium.

Bước 1: Tạo Dockerfile có Chromium
Trong thư mục chứa docker-compose.yml của n8n, tạo file Dockerfile. Ba dòng COPY --from=alpine:3.22 khôi phục apk theo đúng cách tài liệu n8n hướng dẫn; dòng FROM ghim phiên bản n8n bạn đang chạy thay vì latest.
FROM docker.n8n.io/n8nio/n8n:2.44.6
USER root
# Khôi phục apk (image n8n đã gỡ apk)
COPY --from=alpine:3.22 /sbin/apk /sbin/apk
COPY --from=alpine:3.22 /lib/apk /lib/apk
COPY --from=alpine:3.22 /usr/lib/libapk* /usr/lib/
# Chromium, thư viện và font (có font Noto để hiển thị tiếng Việt)
RUN apk add --no-cache chromium nss freetype harfbuzz ca-certificates ttf-freefont font-noto
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
USER node
Cách dựng image tuỳ biến tương tự, dùng để cài FFmpeg, có ở bài FFmpeg là gì và cách tích hợp vào n8n.
Bước 2: Sửa docker-compose.yml để build image
Ở service n8n, thay dòng image: docker.n8n.io/n8nio/n8n bằng khối build, giữ nguyên volume và biến môi trường đang có:
services:
n8n:
build: .
image: n8n-puppeteer:2.44.6
# giữ nguyên ports, environment, volumes hiện có
Build và khởi động lại:
docker compose up -d --build
Node cộng đồng đã cài nằm trong thư mục dữ liệu /home/node/.n8n (volume), nên không mất khi đổi image. Mỗi lần cập nhật n8n, sửa số phiên bản ở dòng FROM rồi build lại; cách cập nhật có ở bài cập nhật n8n.
Bước 3: Khai báo Executable Path trong node
Image trên đã đặt biến PUPPETEER_EXECUTABLE_PATH, node sẽ tự dùng. Nếu muốn chỉ định riêng cho một node:
- Mở node Puppeteer, kéo xuống Options → Add Option.
- Chọn Executable Path.
- Nhập đường dẫn tuyệt đối:
/usr/bin/chromium-browser.

Bước 4: Tham số sandbox (Launch Arguments)
Trong container, Chrome thường không tạo được sandbox. Node n8n-nodes-puppeteer tự thêm các tham số cho container khi phát hiện đang chạy trong Docker (tuỳ chọn Add Container Arguments). Nếu vẫn lỗi Operation not permitted, thêm thủ công ở Options → Launch Arguments:
--no-sandbox
--disable-setuid-sandbox
--disable-dev-shm-usage

Lưu ý bảo mật: --no-sandbox tắt lớp cách ly của Chrome. Chỉ dùng trong container, chỉ mở trang bạn tin cậy, không chạy n8n bằng quyền root. Muốn tách hẳn rủi ro, chạy trình duyệt ở container riêng và nối qua tuỳ chọn Browser WebSocket Endpoint của node.
Dùng Puppeteer với n8n thế nào cho đúng quy định?
Puppeteer chỉ nên tự động hoá website bạn có quyền: trang của chính bạn, hệ thống nội bộ, hoặc trang cho phép truy cập tự động trong điều khoản. Đây là nguyên tắc tham khảo, không phải tư vấn pháp lý.
- Tôn trọng robots.txt và điều khoản: trang cấm thu thập tự động, yêu cầu đăng nhập hoặc hiện CAPTCHA là tín hiệu không nên chạy bot. Không dùng plugin giả lập người dùng để lách cơ chế chống bot.
- Giới hạn tốc độ: thêm node Wait giữa các lần mở trang, không mở hàng loạt tab cùng lúc trên một site.
- Không tạo tài khoản hay gửi biểu mẫu hàng loạt trên dịch vụ của người khác: dễ vi phạm điều khoản và bị coi là spam.
- Dữ liệu cá nhân: không thu thập họ tên, email, số điện thoại của người khác để làm danh sách liên hệ (Nghị định 13/2023/NĐ-CP, Luật Bảo vệ dữ liệu cá nhân số 91/2025/QH15).
Node cộng đồng và Chromium cần n8n tự host. Nếu chưa có máy chủ, xem VPS n8n là gì và khi nào cần.
Muốn chạy n8n 24/7 mà không tự cài? VPS n8n của Tino cài sẵn n8n trên VPS NVMe đặt tại Việt Nam; bạn vẫn có quyền root để cấu hình. Xem cấu hình và giá trên trang sản phẩm.
Những câu hỏi thường gặp
Khi nào nên dùng Puppeteer thay vì node HTTP Request thông thường?
Dùng Puppeteer khi nội dung chỉ hiện sau khi JavaScript chạy (trang React, Vue, Angular), hoặc khi cần cuộn trang, bấm nút, chụp màn hình, xuất PDF. Trang tĩnh hoặc có API thì dùng HTTP Request vì nhanh và nhẹ hơn nhiều.
Làm thế nào để lấy chính xác một đoạn văn bản hoặc giá trị cụ thể trên trang web?
Lấy HTML bằng thao tác Get Page Content rồi tách bằng node HTML (Extract HTML Content) với CSS Selector. Selector lấy bằng cách bấm chuột phải vào phần tử trong Chrome, chọn Inspect, rồi Copy selector.
Puppeteer có thể tự động điền form hoặc nhập dữ liệu vào ô tìm kiếm không?
Có, qua thao tác Run Custom Script với các lệnh như $page.type() và $page.click(). Hãy dùng cho biểu mẫu trên hệ thống của bạn, ví dụ nhập số liệu vào trang quản trị nội bộ không có API.
Làm sao để xử lý các trang web tải nội dung theo dạng "Cuộn vô tận" (Infinite Scroll)?
Dùng Run Custom Script: cuộn xuống cuối trang bằng $page.evaluate(), chờ nội dung mới tải, lặp lại số lần giới hạn rồi mới lấy HTML. Đặt giới hạn số lần cuộn để workflow không chạy mãi.
Chạy Puppeteer trong n8n có tốn nhiều tài nguyên không?
Có. Mỗi lần mở Chromium dùng thêm hàng trăm MB RAM, nên máy chủ nhỏ dễ hết bộ nhớ khi nhiều workflow chạy cùng lúc. Giới hạn số lần chạy đồng thời, đóng trình duyệt sau mỗi lần dùng, hoặc tách trình duyệt ra container riêng.
