mrkeyoor.com_
Tue 01 Sept 17:44 UTC
Automationevaluationupdated 25 Aug 2026

puppeteer review

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

+34stars / 7d
Verdict

Puppeteer is an excellent fit for Node.js code that needs direct, scriptable control of Chrome, with Firefox available where its support fits the task. The API is mature and the documentation is unusually practical about browser downloads and Linux problems. Use puppeteer-core when you already manage browsers; otherwise accept that the convenient package brings a large runtime and needs deployment-specific checks.

We ran it

Lab card: what happened when we ran puppeteerScreenshot of puppeteer (pptr.dev)
Install✓ · 54s124 packages · 785 MB
Build✓ · 62s
Tests✗ · 24s9 passed · 143 failed of 152 (mocha)
Known vulns170 critical · 6 high · 9 moderate · 2 low (npm audit)
Repo1542 files~103,526 lines of source · 9.1 MB · 13 CI workflows · tests dir

Answers from our run

Does puppeteer build from source?

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

Do puppeteer's tests pass?

Not all of them: 9 of 152 passed and 143 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 17 known advisories in the dependency tree at the time of our run.

Who should not use puppeteer?

Teams requiring WebKit coverage: Puppeteer's stated browser targets are Chrome and Firefox, while Playwright also supports WebKit.

What are the alternatives to puppeteer?

Playwright, Selenium, Cypress. Puppeteer is an excellent fit for Node.

Setup3/5Fast install and build, but browser setup and tests need attention
Docs5/5Strong API, configuration, system, and troubleshooting guides
Community5/5Current releases and active issue and pull-request work
Maturity5/5Established browser API with active Chrome and Firefox work

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 developers automating Chrome or Firefox from scripts, services, or test tools.
Teams generating screenshots or PDFs from pages they control.
Engineers debugging browser behavior through the DevTools Protocol.
Projects that want a lower-level browser API and will build their own test structure around it.

Who it’s NOT for

Teams requiring WebKit coverage: Puppeteer's stated browser targets are Chrome and Firefox, while Playwright also supports WebKit.
Small deployments that cannot absorb a browser download: our install occupied 785 MB, though puppeteer-core avoids downloading Chrome.
Locked-down package-manager setups that cannot allow install scripts or run a separate browser-install command: the README warns that blocking the script leaves the browser unavailable at runtime.
Linux arm64 deployments expecting the default downloaded Chrome binary to work: Puppeteer's troubleshooting guide says Chrome does not currently provide that binary.
Teams expecting a clean source checkout to pass tests without browser-specific setup: our run ended with 143 failures out of 152 tests.

Setup reality

At commit cb650f6, our fresh Debian sandbox had 3 CPUs and 8 GB of RAM. npm installed 124 packages in 54 seconds and used 785 MB on disk. The build succeeded in 62 seconds. Tests failed with exit 1 after 24 seconds: Mocha reported 9 passed and 143 failed out of 152. npm audit found 17 known vulnerabilities: 6 high, 9 moderate, 2 low, and none critical.

The normal puppeteer package downloads a compatible Chrome during installation. puppeteer-core skips that download but requires you to supply and configure a browser. Package managers that block install scripts need an allow-list entry or a manual npx puppeteer browsers install. No account or API credential is required for local browser control.

Browser automation inherits the browser's operating-system needs. Linux hosts need Chrome's shared libraries and a working sandbox plan; containers need enough memory and process capacity. The current documentation requires Node 22.12 or newer. Firefox downloads also need an unpacking utility on Linux.

Browser control without a testing framework attached

Puppeteer gives Node.js code a high-level way to drive Chrome or Firefox. A script can launch a browser, open pages, find elements, type, click, inspect network and console activity, take screenshots, create PDFs, and evaluate JavaScript inside a page. Chrome uses the DevTools Protocol, while Firefox support can use WebDriver BiDi. Headless mode is the default.

That scope is wider than end-to-end testing. Teams use browser automation for document rendering, site monitoring, scraping where permitted, debugging, and repeatable administrative tasks. Puppeteer supplies the browser controls, locators, events, and protocol access. It does not force every script into a full test-runner structure, which is useful when the output is an image, file, or extracted value rather than a pass or fail.

The tradeoff is that you own more orchestration. Retries, fixtures, assertions, parallel workers, reports, and cleanup belong to your application or another package. Playwright is usually the better first comparison when the main job is a cross-browser test suite. Puppeteer is strongest when direct Chrome control is the product requirement.

The easy install includes a browser

npm i puppeteer downloads a compatible Chrome during installation. This removes a common source of version mismatch and makes the first local script simple. The browser is stored in a cache, so teams can share it across project installs when their environment preserves that directory. Firefox can be configured too, but Chrome is the default download.

That convenience has a physical cost. Our lab install occupied 785 MB even though the repository checkout itself was only 9.1 MB. Containers, serverless bundles, and short-lived CI workers may care more about that difference than a developer laptop does. The puppeteer-core package leaves the browser out, but then the application must provide an executable path and manage compatibility itself.

Modern package managers add another wrinkle. The README warns that npm configurations, pnpm, Yarn, Bun, and Deno may block dependency install scripts. If Puppeteer's script does not run, no browser is downloaded and the error appears later when the application launches. Projects must allow the script or run npx puppeteer browsers install explicitly. This belongs in CI and deployment instructions, not in tribal knowledge.

What happened when we ran it

We cloned commit cb650f6 into an unprivileged Debian container with 3 CPUs, 8 GB of RAM, no secrets, and the lab's Node 22 image. The monorepo checkout contained 1,542 files and roughly 103,526 lines of source, occupying 9.1 MB. npm installed 124 packages in 54 seconds and left 785 MB on disk. The build succeeded in 62 seconds.

The test step failed after 24 seconds with exit code 1. Mocha's measured result was 9 passed and 143 failed out of 152. The captured tail repeats summary lines from several attempts, with changing pending and failure totals, and finishes at 9 passing, 143 failing. It contains no named failing test or error message. We cannot tell from that tail whether the failures came from missing browser services, container restrictions, source behavior, or some other condition.

npm audit reported 17 known vulnerabilities in the installed dependency tree: 6 high, 9 moderate, 2 low, and zero critical. That is a review item, not proof that Puppeteer's public API is exploitable. A production team should inspect the full audit paths, decide which packages reach its runtime, and retest the pinned version. The repository also has 13 CI workflow files, a tests directory, and npm workspaces, but no Dockerfile.

The lab result is mixed in a useful way. Installation and compilation were quick, while the test command was nowhere near green in the plain container. Contributors should follow the project's documented setup and CI paths before treating a local failure as a regression. Application teams should run a smaller smoke test that launches their exact browser image, loads a page, and exercises the features they depend on.

Deployment has browser-shaped problems

Puppeteer code may be small, but Chrome is a native desktop application running on a server. Linux needs the required shared libraries. The Chrome sandbox needs permissions that fit the host or container. Memory limits and process limits matter when several pages or browsers run together. The troubleshooting guide includes checks for missing libraries and dedicated sections for Windows, Linux, containers, and sandbox configuration.

Architecture can stop a deployment outright. The guide says default Chrome downloads do not work on Linux arm64 because Chrome does not currently provide those binaries. Firefox downloads on Linux require xz or bzip2 for unpacking. Current system requirements list Node 22.12 or newer, so older Node applications need an upgrade or a compatible Puppeteer release.

These are manageable constraints when they are tested in the target image. They become painful when a team assumes that a successful npm install proves the browser will launch. Pin the package, preserve or prebuild the browser cache, keep sandboxing enabled where possible, and close pages and browsers even after exceptions.

Mature project, specific browser coverage

The repository was pushed on August 24, 2026, and issues and pull requests were updated that day. GitHub reports 261 open issues and pull requests combined. Recent work includes mouse-state behavior, browser events, dependency updates, and Chrome or Firefox test coverage. The latest release endpoint points to browsers 3.2.1, published August 17, with fixes for executable-path validation, Windows launch behavior, and partially downloaded browser folders.

Puppeteer's browser scope is deliberate: Chrome and Firefox. It does not claim WebKit support. Choose Playwright when Safari-like engine coverage is required, Selenium when WebDriver grids or non-JavaScript language bindings drive the decision, and Cypress when the interactive application-testing workflow is the attraction.

For Chrome automation in Node.js, Puppeteer remains an easy recommendation with one condition: treat the browser as part of your infrastructure. The library API is the pleasant portion. Browser binaries, caches, native dependencies, sandbox rules, and process cleanup decide whether the same script stays reliable after it leaves a laptop.

Alternatives

ProjectWhat it isPick it when
Playwright gh↗A browser automation and testing toolkit for Chromium, Firefox, and WebKit.pick this instead when cross-browser tests, WebKit, and an integrated test runner are central requirements.
Selenium gh↗The long-running WebDriver project with bindings for several programming languages.pick this instead when language choice, browser-grid infrastructure, or WebDriver compatibility matters most.
Cypress gh↗A browser testing framework with an interactive runner and application-focused tooling.pick this instead when front-end test authoring and an interactive debugging workflow matter more than a general browser API.

What people are saying

  1. [github-trending] puppeteer/puppeteer

Sources

  1. Puppeteer README
  2. Puppeteer repository facts and activity
  3. Puppeteer system requirements
  4. Puppeteer troubleshooting
  5. Puppeteer configuration
  6. Browsers 3.2.1 release

More automation reviews

rclone · lego · OpenCLI · web-access · Karabiner-Elements · WiiUDownloader · the whole board →