API | FAQ | Contributing
Puppeteer is a Node library which provides a high-level API to control headless Chrome over the DevTools Protocol. It can also be configured to use full (non-headless) Chrome.
Most things that you can do manually in the browser can be done using Puppeteer! Here are a few examples to get you started:
- Generate screenshots and PDFs of pages.
- Crawl a SPA and generate pre-rendered content (i.e. "SSR").
- Scrape content from websites.
- Automate form submission, UI testing, keyboard input, etc.
- Create an up-to-date, automated testing environment. Run your tests directly in the latest version of Chrome using the latest JavaScript and browser features.
- Capture a timeline trace of your site to help diagnose performance issues.
Note: Puppeteer requires at least Node v6.4.0, but the examples below use async/await which is only supported in Node v7.6.0 or greater
To use Puppeteer in your project, run:
yarn add puppeteer
# or "npm i puppeteer"
Note: When you install Puppeteer, it downloads a recent version of Chromium (~71Mb Mac, ~90Mb Linux, ~110Mb Win) that is guaranteed to work with the API.
Puppeteer will be familiar to people using other browser testing frameworks. You create an instance
of Browser
, open pages, and then manipulate them with Puppeteer's API.
Example - navigating to https://example.com and saving a screenshot as example.png:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'});
browser.close();
})();
Puppeteer sets an initial page size to 800px x 600px, which defines the screenshot size. The page size can be customized with Page.setViewport()
.
Example - create a PDF.
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle'});
await page.pdf({path: 'hn.pdf', format: 'A4'});
browser.close();
})();
See Page.pdf()
for more information about creating pdfs.
Example - evaluate script in the context of the page
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// Get the "viewport" of the page, as reported by the page.
const dimensions = await page.evaluate(() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio
};
});
console.log('Dimensions:', dimensions);
browser.close();
})();
See Page.evaluate()
for more information on evaluate
and related methods like evaluateOnNewDocument
and exposeFunction
.
1. Uses Headless mode
Puppeteer launches Chromium in headless mode. To launch a full version of Chromium, set the 'headless' option when launching a browser:
const browser = await puppeteer.launch({headless: false}); // default is true
2. Runs a bundled version of Chromium
By default, Puppeteer downloads and uses a specific version of Chromium so its API
is guaranteed to work out of the box. To use Puppeteer with a different version of Chrome,
pass in the executable's path when creating a Browser
instance:
const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
See Puppeteer.launch()
for more information.
3. Creates a fresh user profile
Puppeteer creates its own Chromium user profile which it cleans up on every run.
Explore the API documentation and examples to learn more.
-
Turn off headless mode - sometimes it's useful to see what the browser is displaying. Instead of launching in headless mode, launch a full version of Chrome using
headless: false
:const browser = await puppeteer.launch({headless: false});
-
Slow it down - the
slowMo
option slows down Puppeteer operations by the specified amount of milliseconds. It's another way to help see what's going on.const browser = await puppeteer.launch({ headless: false, slowMo: 250 // slow down by 250ms });
-
Capture console output - You can listen for the
console
event. This is also handy when debugging code inpage.evaluate()
:page.on('console', (...args) => console.log('PAGE LOG:', ...args)); await page.evaluate(() => console.log(`url is ${location.href}`));
-
Enable verbose logging - All public API calls and internal protocol traffic will be logged via the
debug
module.# Basic verbose logging env DEBUG="*" node script.js # Debug output can be enabled/disabled by namespace env DEBUG="*,-*:protocol" node script.js # everything BUT protocol messages env DEBUG="*:session" node script.js # protocol session messages (protocol messages to targets) env DEBUG="*:mouse,*:keyboard" node script.js # only Mouse and Keyboard API calls # Protocol traffic can be rather noisy. This example filters out all Network domain messages env DEBUG="*" env DEBUG_COLORS=true node script.js 2>&1 | grep -v '"Network'
Check out contributing guide to get an overview of Puppeteer development.