puppeteer /puppeteer

JavaScript API for Chrome and Firefox

★ 95,816⑂ 9,594👁 1,186⑃ 8,072● 7,444▤ 722◈ 0
TypeScriptApache-2.0Created 2017-05-09pptr.dev
95,816
stars
+0
9,594
forks
1,186
watchers
8,072
prs
7,444
issues
722
releases
0
discussions

README

Puppeteer






 Puppeteer is a JavaScript library which provides a high-level API to control
 Chrome or Firefox over the
 DevTools Protocol or WebDriver BiDi.
 Puppeteer runs in the headless (no visible UI) by default

 Get started | API | FAQ | Contributing | Troubleshooting

 Installation

bash npm2yarn
npm i puppeteer  Downloads compatible Chrome during installation.
npm i puppeteer-core  Alternatively, install as a library, without downloading Chrome.


:::note

Modern package managers (including npm (see the RFC), pnpm, Yarn, Bun, and Deno) block dependency install scripts by default. If the install script is blocked, Puppeteer will not download the browser during installation, leading to runtime errors.

You can manually download the required browsers after installation by running:

bash npm2yarn
npx puppeteer browsers install


Alternatively, you can configure your package manager to allow the install script to run (for example, with npm, by adding "puppeteer" to "allowScripts" in your package.json).

:::

 MCP

Install chrome-devtools-mcp,
a Puppeteer-based MCP server for browser automation and debugging.

Puppeteer also supports the experimental WebMCP API.

 Example

ts
import puppeteer from 'puppeteer';
// Or import puppeteer from 'puppeteer-core';

// Launch the browser and open a new blank page.
const browser = await puppeteer.launch();
const page = await browser.newPage();

// Navigate the page to a URL.
await page.goto('https://developer.chrome.com/');

// Set the screen size.
await page.setViewport({width: 1080, height: 1024});

// Open the search menu using the keyboard.
await page.keyboard.press('/');

// Type into search box using accessible input name.
await page.locator('::-p-aria(Search)').fill('automate beyond recorder');

// Wait and click on first result.
await page.locator('.devsite-result-item-link').click();

// Locate the full title with a unique string.
const textSelector = await page
  .locator('::-p-text(Customize and automate)')
  .waitHandle();
const fullTitle = await textSelector?.evaluate(el = el.textContent);

// Print the full title.
console.log('The title of this blog post is "%s".', fullTitle);

await browser.close();

Top issues

Latest release

browsers: v3.2.6 browsers-v3.2.6 2026-10-22
3.2.6 (2026-10-22)


 🛠️ Fixes

 browsers: resolve redirects against the current URL (15540) (e21d806)

Snapshot: 2026-11-10T09:35:25Z · Data license Apache-2.0 · JSON