Node.js API for Chrome
Go to file
dependabot[bot] 0ccef7a204
chore(deps): Bump yargs from 17.6.2 to 17.7.0 (#9697)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-17 06:15:30 +00:00
.devcontainer chore: create devcontainer.json (#9563) 2023-01-23 09:16:46 +00:00
.github chore: introduce @puppeteer/browsers with a fetch method implementation (#9647) 2023-02-13 11:49:50 +01:00
.husky chore: Improve CI (#8601) 2022-07-01 15:03:12 +02:00
.vscode chore: Add launch.template.json for debugging tests (#9599) 2023-02-02 09:01:57 +01:00
docker feat: use node18 as docker base image (#9456) 2023-01-02 11:00:16 +01:00
docs chore: release main (#9684) 2023-02-15 12:43:41 -08:00
examples docs: fix cross-browser.js example (#9291) 2022-11-17 13:26:08 +01:00
packages chore(deps): Bump yargs from 17.6.2 to 17.7.0 (#9697) 2023-02-17 06:15:30 +00:00
test chore: Add EsLint rule import/order (#9685) 2023-02-15 15:09:31 -08:00
test-d fix(puppeteer-core): avoid type instantiation errors (#9370) 2022-12-06 19:21:08 +01:00
tools chore: Add EsLint rule import/order (#9685) 2023-02-15 15:09:31 -08:00
website chore: Add EsLint rule import/order (#9685) 2023-02-15 15:09:31 -08:00
.editorconfig EditorConfig: 2 space indent (#195) 2017-08-03 09:50:08 -07:00
.eslintignore chore: Add launch.template.json for debugging tests (#9599) 2023-02-02 09:01:57 +01:00
.eslintplugin.js chore: add custom rule for formatting comments (#8777) 2022-08-12 14:15:26 +02:00
.eslintrc.js chore: Add EsLint rule import/order (#9685) 2023-02-15 15:09:31 -08:00
.eslintrc.types.cjs fix: remove unused imports (#8613) 2022-07-01 16:00:03 +02:00
.gitattributes chore(git): Fix line endings in text files (#4320) 2019-04-22 09:03:42 -07:00
.gitignore chore: Add launch.template.json for debugging tests (#9599) 2023-02-02 09:01:57 +01:00
.mocharc.cjs chore: support WebDriver BiDi browser instances (#8932) 2022-09-15 02:15:15 +02:00
.npmrc fix: move CI npm config out of .npmrc (#6901) 2021-02-17 18:52:22 +01:00
.prettierignore chore: Add launch.template.json for debugging tests (#9599) 2023-02-02 09:01:57 +01:00
.prettierrc.cjs docs: improve docs (#9179) 2022-10-28 08:49:28 +02:00
.release-please-manifest.json chore: release main (#9684) 2023-02-15 12:43:41 -08:00
commitlint.config.js chore: update commitlint.config.js (#9064) 2022-10-06 09:40:39 +02:00
LICENSE chore: use https URL for license info (#6279) 2020-08-10 10:35:07 +02:00
package-lock.json chore(deps): Bump yargs from 17.6.2 to 17.7.0 (#9697) 2023-02-17 06:15:30 +00:00
package.json chore: add a basic CLI for fetching the browsers (#9671) 2023-02-14 16:30:41 +01:00
README.md docs: fix typo in docs visible on main page (#9607) 2023-01-31 09:15:58 +00:00
release-please-config.json chore: update latest release sha (#9311) 2022-11-23 13:07:39 +01:00
SECURITY.md chore: Add a security policy (#9547) 2023-01-19 17:03:59 +01:00
tsconfig.base.json feat: separate puppeteer and puppeteer-core (#9023) 2022-10-05 14:17:03 +02:00
versions.js chore: release main (#9624) 2023-02-13 11:16:54 +01:00

Puppeteer

Build status npm puppeteer package

Guides | API | FAQ | Contributing | Troubleshooting

Puppeteer is a Node.js library which provides a high-level API to control Chrome/Chromium over the DevTools Protocol. Puppeteer runs in headless mode by default, but can be configured to run in full (non-headless) Chrome/Chromium.

What can I do?

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 (Single-Page Application) and generate pre-rendered content (i.e. "SSR" (Server-Side Rendering)).
  • Automate form submission, UI testing, keyboard input, etc.
  • Create an automated testing environment using the latest JavaScript and browser features.
  • Capture a timeline trace of your site to help diagnose performance issues.
  • Test Chrome Extensions.

Getting Started

Installation

To use Puppeteer in your project, run:

npm i puppeteer
# or `yarn add puppeteer`
# or `pnpm i puppeteer`

When you install Puppeteer, it automatically downloads a recent version of Chromium (~170MB macOS, ~282MB Linux, ~280MB Windows) that is guaranteed to work with Puppeteer. For a version of Puppeteer without installation, see puppeteer-core.

Configuration

Puppeteer uses several defaults that can be customized through configuration files.

For example, to change the default cache directory Puppeteer uses to install browsers, you can add a .puppeteerrc.cjs (or puppeteer.config.cjs) at the root of your application with the contents

const {join} = require('path');

/**
 * @type {import("puppeteer").Configuration}
 */
module.exports = {
  // Changes the cache location for Puppeteer.
  cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
};

After adding the configuration file, you will need to remove and reinstall puppeteer for it to take effect.

See the configuration guide for more information.

puppeteer-core

Every release since v1.7.0 we publish two packages:

puppeteer is a product for browser automation. When installed, it downloads a version of Chromium, which it then drives using puppeteer-core. Being an end-user product, puppeteer automates several workflows using reasonable defaults that can be customized.

puppeteer-core is a library to help drive anything that supports DevTools protocol. Being a library, puppeteer-core is fully driven through its programmatic interface implying no defaults are assumed and puppeteer-core will not download Chromium when installed.

You should use puppeteer-core if you are connecting to a remote browser or managing browsers yourself. If you are managing browsers yourself, you will need to call puppeteer.launch with an an explicit executablePath (or channel if it's installed in a standard location).

When using puppeteer-core, remember to change the import:

import puppeteer from 'puppeteer-core';

Usage

Puppeteer follows the latest maintenance LTS version of Node.

Puppeteer will be familiar to people using other browser testing frameworks. You launch/connect a browser, create some pages, and then manipulate them with Puppeteer's API.

For more in-depth usage, check our guides and examples.

Example

The following example searches developer.chrome.com for blog posts with text "automate beyond recorder", click on the first result and print the full title of the blog post.

import puppeteer from 'puppeteer';

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://developer.chrome.com/');

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

  // Type into search box
  await page.type('.search-box__input', 'automate beyond recorder');

  // Wait and click on first result
  const searchResultSelector = '.search-box__link';
  await page.waitForSelector(searchResultSelector);
  await page.click(searchResultSelector);

  // Locate the full title with a unique string
  const textSelector = await page.waitForSelector(
    'text/Customize and automate'
  );
  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();
})();

Default runtime settings

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 or Chromium, pass in the executable's path when creating a Browser instance:

const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});

You can also use Puppeteer with Firefox Nightly (experimental support). See Puppeteer.launch for more information.

See this article for a description of the differences between Chromium and Chrome. This article describes some differences for Linux users.

3. Creates a fresh user profile

Puppeteer creates its own browser user profile which it cleans up on every run.

Using Docker

See our Docker guide.

Using Chrome Extensions

See our Chrome extensions guide.

Resources

Contributing

Check out our contributing guide to get an overview of Puppeteer development.

FAQ

Our FAQ has migrated to our site.