mrkeyoor.com_
Fri 16 Oct 19:46 UTC
Automationevaluationupdated 05 Oct 2026

puppeteer review

Puppeteer is a TypeScript and JavaScript library for controlling Chrome or Firefox from Node.js. It turns navigation, form input, screenshots, PDF creation, and page inspection into code through the DevTools Protocol or WebDriver BiDi.

+23stars / 7d
Verdict

Our Puppeteer run built in 68 seconds, then finished with 9 passing and 144 failing tests, so adopting it means validating your exact browser host instead of trusting a successful compile. Use it for Node.js jobs that need close control of Chrome and can pin the browser, cache, Linux packages, and sandbox setup. Choose Playwright for required WebKit coverage, or puppeteer-core when another service already owns the browser.

We ran it

Lab card: what happened when we ran puppeteerScreenshot of puppeteer (pptr.dev)
Install✓ · 77s124 packages · 768 MB
Build✓ · 68s
Tests✗ · 37s9 passed · 144 failed of 153 (mocha)
Known vulns140 critical · 5 high · 8 moderate · 1 low (npm audit)
Repo1561 files~106,440 lines of source · 8.4 MB · 14 CI workflows · tests dir

Answers from our run

Does puppeteer build from source?

Dependencies installed in 77 seconds (124 packages), and the build succeeded in 68 seconds. We cloned commit 2ff951c into a clean Debian container with 3 CPUs and no project-specific setup.

Do puppeteer's tests pass?

Not all of them: 9 of 153 passed and 144 failed when we ran the project's own test command (mocha). Some failures need services or credentials a bare container does not have.

Does puppeteer have known vulnerabilities in its dependencies?

npm audit flagged 14 known advisories in the dependency tree at the time of our run.

Who should not use puppeteer?

Teams that require Safari or WebKit coverage: Puppeteer's documented browser targets are Chrome and Firefox.

What are the alternatives to puppeteer?

Playwright, Selenium, Cypress. Our Puppeteer run built in 68 seconds, then finished with 9 passing and 144 failing tests, so adopting it means validating your exact browser host instead of trusting a successful compile.

Setup3/5Install and build passed, but 144 of 153 tests failed
Docs5/5Clear browser, cache, Linux dependency, and sandbox guidance
Community5/595,656 stars, an October 5 push, and active issue work
Maturity4/5Long release history, offset by our failed full test run

Discussed on

  1. hnPuppeteer Support for Firefox655 points
  2. hnPuppeteer: Headless Chrome Node API406 points
  3. hnPrototype: Puppeteer for Firefox335 points
  4. hnShow HN: Web scraping that just works with OpenFaaS with Puppeteer145 points
  5. hnShow HN: Getting started with Puppeteer and Chrome Headless for Web Scraping142 points

Who it’s for

Node.js teams automating Chrome for scraping, screenshots, PDFs, browser checks, or internal workflows.
Developers who want direct control over pages, browser contexts, requests, and DevTools behavior.
Services that connect to a managed remote browser through puppeteer-core.
Firefox users whose workflow fits Puppeteer's stated WebDriver BiDi support.

Who it’s NOT for

Teams that require Safari or WebKit coverage: Puppeteer's documented browser targets are Chrome and Firefox.
Python, Java, C#, or Ruby shops seeking a native client: Puppeteer's public API is built for JavaScript and TypeScript on Node.js.
Locked-down build systems that block install scripts and browser downloads without an approved cache: the README says that setup ends in a missing-Chrome runtime error.
Container platforms that will neither grant the official image SYS_ADMIN nor support a separately configured Chrome sandbox.
Release gates that require a clean full suite and zero high-severity advisories: our run had 144 failed tests and 5 high-severity audit findings.

Setup reality

Our fresh Debian sandbox installed commit 2ff951c in 77 seconds, pulling 124 packages and using 768 MB. The build passed in 68 seconds. The test step failed after 37 seconds: Mocha reported 9 passed and 144 failed out of 153, while npm audit found 14 known vulnerabilities, including 5 high severity.

Puppeteer itself needs no service credential. It does need a compatible browser, download access or a prefilled cache, and Node.js. Current docs require Node 22.12 or newer. If you manage Chrome yourself or connect to a remote browser, use puppeteer-core and provide an executable path or WebSocket endpoint. Proxy settings may also be needed for browser downloads.

Linux hosts need Chrome's system libraries, while Firefox extraction needs xz or bzip2. Package managers that block install scripts also block the automatic browser download. The official container includes Chrome and its dependencies, but its documented sandboxed invocation requires SYS_ADMIN; disabling Chrome's sandbox is strongly discouraged.

Puppeteer 25.12.0 controls Chrome and Firefox from Node

Puppeteer gives a Node.js program direct control of Chrome or Firefox. A script can open pages, use accessible selectors, type, click, inspect text, capture screenshots, create PDFs, intercept requests, and evaluate JavaScript in the page. The default launch is headless. Underneath, the library speaks the Chrome DevTools Protocol or WebDriver BiDi, so the API stays much more readable than the protocol messages it coordinates.

The practical center of gravity is Chrome. Version 25.12.0 requires Node 22.12 or newer, and the full puppeteer package downloads a compatible Chrome for Testing build. puppeteer-core leaves browser acquisition and configuration to you. That split is useful: install the full package for a self-contained worker, or use the core library when a remote browser service, system Chrome, or your own image already handles the executable.

Browser contexts provide separate cookies and local storage inside one browser process. Puppeteer can also attach to a browser over its WebSocket endpoint, then disconnect without closing the pages. Those details make it suitable for screenshot services, crawlers, document generation, and diagnostic tools. They do not make the target browser portable. The README names Chrome and Firefox, leaving Safari and WebKit automation to another project.

What happened when we ran it

Our sandbox installed commit 2ff951c in 77 seconds, adding 124 packages and occupying 768 MB on disk. The repository itself contained 1,561 files, about 106,440 lines of source, and used 8.4 MB when checked out. Its build completed successfully in 68 seconds on 3 CPUs with 8 GB of RAM, Node 22, no secrets, and no elevated privileges.

The test command failed after 37 seconds. Mocha reported 9 passed and 144 failed out of 153 tests. The log tail repeatedly showed 9 passing while failure totals ranged from 113 to 145 across its final groups, with pending counts also changing. That output establishes a badly failing suite in our fresh Debian container, but it does not identify one common cause. Assigning every failure to missing browser libraries would go beyond the evidence.

Npm audit found 14 known vulnerabilities: 5 high, 8 moderate, and 1 low, with none rated critical. The repository has 14 CI workflow files, a tests directory, and npm workspaces, but no Dockerfile at the repository root. Those are maintenance signals, not a substitute for a green local run. Before merging Puppeteer into a release gate, repeat the suite in the same base image and sandbox policy your workers will use.

Chrome download depends on an allowed install script

The convenient package depends on an install script to fetch Chrome. Puppeteer's README now warns that npm, pnpm, Yarn, Bun, and Deno can block dependency scripts. If that happens, package installation may appear complete even though launch later fails because Chrome is absent. The documented repair is npx puppeteer browsers install, or an explicit package-manager rule that permits Puppeteer's script.

Caching also needs a deliberate home. Since v19.0.0, browsers go under the user's Puppeteer cache by default. A build that packs the application and moves it elsewhere can leave that cache behind. Configuration can relocate it, but changing download settings requires running the browser install again. puppeteer-core ignores Puppeteer's configuration files and environment variables, so callers managing their own browser must pass the executable or connection details in code.

No API account is required for local use. Network-restricted builders still need an approved route to the browser archive, a prepared cache, or an image that already contains the right binary. HTTP proxy settings exist for download and runtime traffic, and proxy support for downloads calls for an optional package. That is ordinary deployment work, yet it sits outside the short npm i puppeteer line most developers meet first.

Linux launch needs browser libraries and a working sandbox

Current requirements name Debian, Ubuntu, openSUSE, and Fedora for Chrome, with separate system-package lists for Debian and RPM families. Firefox downloads need xz or bzip2 on Linux. Puppeteer's troubleshooting guide tells operators to check linked Chrome libraries when launch fails, and it strongly discourages the common --no-sandbox escape hatch.

The official container solves the browser-and-library pairing, but its documented sandboxed command adds the SYS_ADMIN capability and an init process. Some production platforms will reject that capability. In those environments, you need a sandbox design that matches the platform instead of copying a local launch flag. The absence of a root Dockerfile in our checkout does not mean there is no official image; the project keeps container material under its docker directory and publishes images through GitHub Container Registry.

An October 5 push coexists with issue 15509

GitHub recorded 95,656 stars, 278 combined issues and pull requests, and a push on October 5, 2026. Puppeteer v25.12.0 shipped on September 23, the same day as the repository's latest browsers package release. That cadence and 14 workflow files point to an actively maintained project. The size of the queue also reflects how many browser versions, protocols, operating systems, and timing-sensitive behaviors the maintainers have to follow.

Open issue 15509 is a useful warning for production automation. Its reproducible case says request interception can leave fetches from dedicated workers paused indefinitely in Puppeteer 25.12.0. A browser script can compile, start, and still hang only when a particular worker and network path meets the wrong event order. Pin Puppeteer with its browser build, exercise your own interception and worker flows, and keep timeouts around navigation.

Puppeteer remains the direct choice when a Node.js service mainly needs Chrome and the team is willing to own its runtime. Our 68-second build says the code can compile cleanly in a plain container; the 144 failed tests say that result is only the start of qualification. If you need a broad browser matrix or cannot shape the host around browser sandbox requirements, choose a tool whose supported targets fit that constraint from day one.

Alternatives

ProjectWhat it isPick it when
Playwright gh↗A browser automation and testing library with Chromium, Firefox, and WebKit coverage.pick this instead when one test suite must cover Chromium, Firefox, and WebKit.
Selenium gh↗The established WebDriver project with clients for several programming languages.pick this instead when browser automation must fit a non-Node stack or a WebDriver-based grid.
Cypress gh↗A browser-focused testing runner with an interactive development workflow.pick this instead when application test authoring and debugging matter more than general browser scripting.

Sources

  1. Puppeteer README
  2. Puppeteer installation guide
  3. Puppeteer system requirements
  4. Puppeteer Docker guide
  5. Puppeteer issue 15509
  6. Puppeteer v25.12.0 release

More automation reviews

supersidian · genspark-claw · orc-claude-plugin · tiktok-views-bot · Ydisks-Xianyu-Helper · jev-gui-delegate · the whole board →