Tutorial9 min read

What Is Puppeteer?

Short answer

Puppeteer is a free, open-source JavaScript library for Node.js that controls Chrome or Firefox through code: it opens pages, clicks, types, takes screenshots and PDFs, and reads the page after its scripts have run. It was created at Google, the Chrome Browser Automation team maintains it, and it is actively released: version 25.16.0 came out on 22 October 2026, the third release in nine days. You install it with npm i puppeteer, it runs the browser headless (without a window) by default, and developers use it for testing, automation and scraping JavaScript-heavy sites. When a Puppeteer scraper needs many IPs, ProxyField residential proxies plug in with one launch flag from $1.95/GB; start with the Easy Trial: 1 GB for $2.95.

residential IPs
412M+
from, traffic never expires
$1.95/GB
Easy Trial
1 GB for $2.95
On this page 11 sections
  1. Puppeteer in one paragraph
  2. What is Puppeteer used for?
  3. How does Puppeteer work?
  4. Is Puppeteer an official Google project, and is it still maintained?
  5. Puppeteer and Chrome: headless and headful
  6. Can you use Puppeteer from Python?
  7. Advantages and limits
  8. Is Puppeteer still relevant in 2026?
  9. Puppeteer for web scraping
  10. Puppeteer with a proxy
  11. What Is Puppeteer? FAQ

Puppeteer in one paragraph

Puppeteer's own documentation defines it as "a JavaScript library which provides a high-level API to control Chrome or Firefox over the DevTools Protocol or WebDriver BiDi" (pptr.dev). In plain words: instead of you clicking in a browser, a Node.js script does it, as fast as the page allows and as many times as you need. It is published under the Apache-2.0 license, so you can use it in commercial projects at no cost.

FactValue
What it isA Node.js library (JavaScript and TypeScript)
Who maintains itThe Chrome Browser Automation team at Google (FAQ)
Latest version25.16.0, 22 October 2026, bundling Chrome 156.0.8078.47 and Firefox 158.0.1 (GitHub releases)
BrowsersChrome (Chrome for Testing) and Firefox
ProtocolsChrome DevTools Protocol for Chrome; WebDriver BiDi for Firefox
Default modeHeadless (no visible window); headless: false shows the window
First versions0.9.0 in August 2017, 1.0 in January 2018 (npm version history)
LicenseApache-2.0
Installnpm i puppeteer (downloads a matching Chrome for Testing); npm i puppeteer-core (no browser download)

What is Puppeteer used for?

Developers use Puppeteer wherever a person would otherwise repeat the same steps in a browser. The official guide lists form submission, UI testing, performance traces, Chrome extension testing, screenshots and PDFs, and pre-rendering single-page apps (pptr.dev). In practice:

JobWhat Puppeteer does
End-to-end testingClicks through sign-up, checkout or search flows and checks the result, usually inside a runner such as Jest
Web scraping of JavaScript pagesLoads a page, waits for the content scripts render, and extracts text, links or prices from the live DOM
Screenshots and PDFsRenders a page to PNG or a print-ready PDF in one call; many invoice, report and preview services work this way
Performance checksRecords traces and load timings, the same data Chrome DevTools shows
Chrome extension testingLoads an unpacked extension into Chrome and drives its pages
Pre-rendering single-page appsSaves the HTML a React, Vue or Angular app builds, for crawlers or static hosting
Form filling and routine tasksLogs in to your own dashboards, downloads reports, checks that a page still works

Screenshot and PDF in a few lines:

JavaScript
// npm i puppeteer   ->   node capture.mjs
import puppeteer from 'puppeteer';

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png', fullPage: true });
await page.pdf({ path: 'example.pdf', format: 'A4' });   // PDF needs headless mode, the default
await browser.close();

How does Puppeteer work?

Puppeteer starts a browser process and talks to it over a protocol. For Chrome that is the Chrome DevTools Protocol (CDP), the same channel Chrome's developer tools use; for Firefox it is WebDriver BiDi, the W3C standard that is the default for automating Firefox (WebDriver BiDi guide). Your script calls methods such as page.goto() or page.click(), Puppeteer turns them into protocol messages, and the browser does the work.

Each Puppeteer release is bundled with a specific browser version, so the library and the browser always speak the same protocol version. Since v20.0.0 it downloads Chrome for Testing, a Chrome build made for automation, and since v23.0.0 it supports Firefox as well (supported browsers).

A minimal script:

JavaScript
// npm i puppeteer   ->   node title.mjs
import puppeteer from 'puppeteer';

const browser = await puppeteer.launch();            // headless Chrome
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
const title = await page.$eval('h1', el => el.textContent);
console.log(title);                                  // "Example Domain"
await browser.close();

Is Puppeteer an official Google project, and is it still maintained?

Yes on both counts. Puppeteer was created at Google, and its FAQ states: "The Chrome Browser Automation team maintains the library." The docs site carries "Copyright © 2026 Google, Inc." (pptr.dev/faq). It is an open-source project on GitHub under Apache-2.0 that accepts outside contributions; Google sells no paid edition or support contract, and the FAQ does not describe it as a supported Google product. "Google Puppeteer" in search usually means this library.

It is actively maintained. The last three releases, from the GitHub releases page:

VersionDateBrowsers bundled (puppeteer-core)
25.16.022 October 2026Chrome 156.0.8078.47, Firefox 158.0.1
25.15.020 October 2026Chrome 155.0.8059.84
25.14.014 October 2026Chrome 155.0.8059.79, Firefox 158.0

The maintenance signals in the official docs:

  • Firefox support since v23.0.0, over WebDriver BiDi (FAQ).
  • Chrome for Testing downloaded by default since v20.0.0 (supported browsers).
  • CDP stays for Chrome: "We are not going to stop supporting automation of Chrome with CDP." (FAQ)
  • One browser per release: "Every Puppeteer release is tightly bundled with a specific browser release," so a new Chrome means a new Puppeteer version.

Puppeteer and Chrome: headless and headful

Puppeteer runs the browser headless by default: the browser renders pages fully, runs JavaScript and loads resources, but shows no window. Pass headless: false to watch it work, which helps while you write and debug a script. Since Chrome 132, Chrome's old headless implementation exists only as a separate program, chrome-headless-shell; Puppeteer uses it when you set headless: 'shell' (Chrome for Developers). The difference between the two headless modes is covered in what a headless browser is.

You can also point Puppeteer at a Chrome you installed yourself with executablePath, or connect to a running Chrome with puppeteer.connect(). The lighter puppeteer-core package does not download a browser at all, for setups that bring their own.

Can you use Puppeteer from Python?

Not directly: Puppeteer is a Node.js library, with no official Python package. Pyppeteer, an unofficial Python port, copied its API, but its README now says: "Attention: This repo is unmaintained and has been outside of minor changes for a long time. Please consider playwright-python as an alternative." (Pyppeteer on GitHub).

FeaturePuppeteerPyppeteer
LanguageJavaScript / TypeScript on Node.jsPython 3.8+ with asyncio
MaintainerGoogle's Chrome Browser Automation teamCommunity; README says unmaintained
Latest release25.16.0, 22 October 20262.0.0, 18 February 2024; PyPI status "3 - Alpha" (PyPI)
BrowsersChrome for Testing and Firefox, the version bundled per releaseChromium it downloads on first run
Selectorspage.$(), page.$$()page.querySelector(), page.querySelectorAll() (short forms J(), JJ()), because $ is not a valid Python name
Optionsan object: launch({ headless: true })a dict or keyword arguments: launch(headless=True)
evaluate()a function or an expressiona string; set force_expr=True if it misreads an expression

For browser automation from Python in 2026, use Playwright for Python or Selenium. The Playwright equivalent of the Puppeteer proxy setup below, with the same gateway:

Python
# pip install playwright && playwright install chromium
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://gate.proxyfield.io:7000",
        "username": "<login>-country-us-city-new_york",
        "password": "<password>",
    })
    page = browser.new_page()
    page.goto("https://api.ipify.org?format=json")
    print(page.inner_text("body"))   # the proxy's IP
    browser.close()

More in Playwright proxy setup, Puppeteer vs Playwright and Python web scraping.

Advantages and limits

Advantages:

  • Close to Chrome: new DevTools features usually reach Puppeteer first.
  • One install gives you a matching browser, so versions do not drift.
  • A small, readable API that covers pages, frames, network interception, cookies, downloads, screenshots and PDFs.
  • Free under Apache-2.0, with a large body of examples and answers online.

Limits:

  • Node.js only; no official Python, Java or .NET packages.
  • Chrome and Firefox only; no WebKit (Safari's engine).
  • No test runner of its own: you add Jest, Mocha or another runner.
  • A real browser per job: much more CPU, memory and traffic than an HTTP request.
  • Sites that limit requests per IP will block a busy Puppeteer script from one IP, as they would any client.

Is Puppeteer still relevant in 2026?

Yes. Puppeteer shipped three releases between 14 and 22 October 2026, supports Firefox since v23.0.0, and remains the reference automation library for Chrome. Playwright is common in new cross-browser test suites, because it covers three browser engines and four languages, but Puppeteer stays a sound choice for Chrome automation in Node.js. Alternatives and when they make sense: Puppeteer alternatives.

Puppeteer for web scraping

Puppeteer is worth its cost when a page builds its content with JavaScript, or when you must click, scroll or fill in a form before the data appears. Before you reach for it, open the browser's network tab: many pages load their data from a JSON request that a plain HTTP client can call directly, at a fraction of the traffic.

When you do scrape with it:

  • Wait for the element you need (page.waitForSelector() or a locator) instead of fixed sleeps.
  • Block images, fonts and media with request interception to cut load time and traffic.
  • Reuse one browser and open new pages or contexts, instead of launching a browser per URL.
  • Pace requests and respect the site's robots.txt and terms; scrape public data only (is web scraping legal).

A full tutorial is in web scraping with Puppeteer.

Puppeteer with a proxy

Puppeteer takes the proxy address in Chrome's --proxy-server launch flag and the credentials in page.authenticate():

JavaScript
const browser = await puppeteer.launch({ args: ['--proxy-server=http://gate.proxyfield.io:7000'] });
const page = await browser.newPage();
await page.authenticate({ username: '<login>-country-us-city-new_york', password: '<password>' });
await page.goto('https://api.ipify.org?format=json');   // prints the proxy's IP

<login>-country-us-city-new_york asks for an exit IP in New York. Region, session and session time go in the same username: -region-<region>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default), as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600; every part after the login is optional. With ProxyField each request can get a new IP, or a sticky session can keep one IP from 30 s to 36 h, over HTTP, HTTPS or SOCKS5. Rotation per page, one proxy per browser context, SOCKS5 and error fixes are in the Puppeteer proxy setup guide.

ProxyField residential proxies cost $2.95/GB for 1 GB and fall to $1.95/GB from 1,000 GB, with no subscription; the traffic never expires, and all purchases are final. Start with residential proxies and the Easy Trial: 1 GB for $2.95.

What Is Puppeteer? FAQ

What is Puppeteer?

ProxyField's Puppeteer guides start from this: Puppeteer (version 25.16.0, 22 October 2026) is a free Node.js library that controls Chrome or Firefox from JavaScript code, headless by default. It opens pages, clicks, types, reads the rendered page and saves screenshots or PDFs, and Google's Chrome Browser Automation team maintains it.

What do developers typically use Puppeteer for?

Mostly for end-to-end testing, scraping pages that build their content with JavaScript, and rendering pages to screenshots or PDFs. The official guide also names performance traces, Chrome extension testing and pre-rendering single-page apps, and many teams use it to automate routine browser tasks.

Is Puppeteer an official Google project, and is it still actively maintained?

Yes. Its FAQ says the Chrome Browser Automation team at Google maintains it, and the docs carry a Google copyright; it is open source under Apache-2.0, with no paid edition. It is actively released: 25.14.0, 25.15.0 and 25.16.0 came out on 14, 20 and 22 October 2026, each bundling a newer Chrome.

Is Puppeteer made by Google?

Yes. Puppeteer was created at Google, and the Chrome Browser Automation team maintains it, as its FAQ states. It accepts contributions from outside Google on GitHub.

How does Puppeteer work?

It starts a browser and sends it commands over a protocol: the Chrome DevTools Protocol for Chrome, WebDriver BiDi for Firefox. Your script calls methods such as page.goto() and page.click(), and Puppeteer turns them into protocol messages the browser executes.

Can I use Puppeteer from Python, and how does Pyppeteer compare to the original Node.js library?

Not directly: Puppeteer is a Node.js library. Pyppeteer is an unofficial Python port whose last release, 2.0.0, came out on 18 February 2024, and its README says it is unmaintained and recommends Playwright for Python. For new Python projects, use Playwright for Python or Selenium.

What is the difference between Pyppeteer and Puppeteer?

Puppeteer is the official Node.js library; Pyppeteer copied its API into Python with asyncio. Method names differ where Python cannot follow JavaScript: page.$() becomes page.querySelector() (or J()), and options can be keyword arguments such as launch(headless=True).

Is Puppeteer still relevant?

Yes. It shipped three releases in October 2026 alone, supports Firefox since v23.0.0 and remains the reference automation library for Chrome. Playwright is more common in new cross-browser test suites, but Puppeteer is a sound choice for Chrome automation in Node.js.

What are the advantages of Puppeteer?

It is close to Chrome, so new DevTools features reach it early, and each install comes with a matching browser. The API is small and covers network interception, cookies, downloads, screenshots and PDFs, and it is free under Apache-2.0.

Is Puppeteer a framework?

No, it is a library: it gives you browser control, not a test runner, assertions or a project structure. Teams that test with Puppeteer add a runner such as Jest or Mocha around it.

Show 2 more questionsShow fewer questions

Can Puppeteer be used in Chrome?

Yes. Chrome is Puppeteer's default browser: npm i puppeteer downloads a matching Chrome for Testing (Chrome 156.0.8078.47 with version 25.16.0), and Puppeteer drives it over the Chrome DevTools Protocol, headless unless you pass headless: false. It can also drive Firefox, over WebDriver BiDi.

Is Puppeteer free to use?

Yes. Puppeteer is open source under the Apache-2.0 license, which allows commercial use, and there is no paid edition. What you pay for at scale is the servers that run the browsers and, for scraping, the proxy traffic.

Easy Trial: 1 GB for $2.95.

Try for the price of 1 GB, no subscription, traffic never expires.