UNPKG

12.2 kBMarkdownView Raw
1# Puppeteer
2
3<!-- [START badges] -->
4[![Linux Build Status](https://img.shields.io/travis/GoogleChrome/puppeteer/master.svg)](https://travis-ci.org/GoogleChrome/puppeteer) [![Windows Build Status](https://img.shields.io/appveyor/ci/aslushnikov/puppeteer/master.svg?logo=appveyor)](https://ci.appveyor.com/project/aslushnikov/puppeteer/branch/master) [![NPM puppeteer package](https://img.shields.io/npm/v/puppeteer.svg)](https://npmjs.org/package/puppeteer)
5<!-- [END badges] -->
6
7<img src="https://user-images.githubusercontent.com/10379601/29446482-04f7036a-841f-11e7-9872-91d1fc2ea683.png" height="200" align="right">
8
9###### [API](docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md)
10
11> Puppeteer is a Node library which provides a high-level API to control [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). It can also be configured to use full (non-headless) Chrome or Chromium.
12
13<!-- [START usecases] -->
14###### What can I do?
15
16Most things that you can do manually in the browser can be done using Puppeteer! Here are a few examples to get you started:
17
18* Generate screenshots and PDFs of pages.
19* Crawl a SPA and generate pre-rendered content (i.e. "SSR").
20* Scrape content from websites.
21* Automate form submission, UI testing, keyboard input, etc.
22* 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.
23* Capture a [timeline trace](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/reference) of your site to help diagnose performance issues.
24<!-- [END usecases] -->
25
26Give it a spin: https://try-puppeteer.appspot.com/
27
28<!-- [START getstarted] -->
29## Getting Started
30
31### Installation
32
33To use Puppeteer in your project, run:
34
35```bash
36npm i --save puppeteer
37# or "yarn add puppeteer"
38```
39
40Note: When you install Puppeteer, it downloads a recent version of Chromium (~170Mb Mac, ~282Mb Linux, ~280Mb Win) that is guaranteed to work with the API. To skip the download, see [Environment variables](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#environment-variables).
41
42### Usage
43
44Caution: 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.
45
46Puppeteer will be familiar to people using other browser testing frameworks. You create an instance
47of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#).
48
49**Example** - navigating to https://example.com and saving a screenshot as *example.png*:
50
51```js
52const puppeteer = require('puppeteer');
53
54(async () => {
55 const browser = await puppeteer.launch();
56 const page = await browser.newPage();
57 await page.goto('https://example.com');
58 await page.screenshot({path: 'example.png'});
59
60 await browser.close();
61})();
62```
63
64Puppeteer sets an initial page size to 800px x 600px, which defines the screenshot size. The page size can be customized with [`Page.setViewport()`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagesetviewportviewport).
65
66**Example** - create a PDF.
67
68```js
69const puppeteer = require('puppeteer');
70
71(async () => {
72 const browser = await puppeteer.launch();
73 const page = await browser.newPage();
74 await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
75 await page.pdf({path: 'hn.pdf', format: 'A4'});
76
77 await browser.close();
78})();
79```
80
81See [`Page.pdf()`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions) for more information about creating pdfs.
82
83**Example** - evaluate script in the context of the page
84
85```js
86const puppeteer = require('puppeteer');
87
88(async () => {
89 const browser = await puppeteer.launch();
90 const page = await browser.newPage();
91 await page.goto('https://example.com');
92
93 // Get the "viewport" of the page, as reported by the page.
94 const dimensions = await page.evaluate(() => {
95 return {
96 width: document.documentElement.clientWidth,
97 height: document.documentElement.clientHeight,
98 deviceScaleFactor: window.devicePixelRatio
99 };
100 });
101
102 console.log('Dimensions:', dimensions);
103
104 await browser.close();
105})();
106```
107
108See [`Page.evaluate()`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`.
109
110<!-- [END getstarted] -->
111
112<!-- [START runtimesettings] -->
113## Default runtime settings
114
115**1. Uses Headless mode**
116
117Puppeteer launches Chromium in [headless mode](https://developers.google.com/web/updates/2017/04/headless-chrome). To launch a full version of Chromium, set the ['headless' option](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions) when launching a browser:
118
119```js
120const browser = await puppeteer.launch({headless: false}); // default is true
121```
122
123**2. Runs a bundled version of Chromium**
124
125By default, Puppeteer downloads and uses a specific version of Chromium so its API
126is guaranteed to work out of the box. To use Puppeteer with a different version of Chrome or Chromium,
127pass in the executable's path when creating a `Browser` instance:
128
129```js
130const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
131```
132
133See [`Puppeteer.launch()`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions) for more information.
134
135See [`this article`](https://www.howtogeek.com/202825/what%E2%80%99s-the-difference-between-chromium-and-chrome/) for a description of the differences between Chromium and Chrome. [`This article`](https://chromium.googlesource.com/chromium/src/+/lkcr/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users.
136
137**3. Creates a fresh user profile**
138
139Puppeteer creates its own Chromium user profile which it **cleans up on every run**.
140
141<!-- [END runtimesettings] -->
142
143## API Documentation
144
145Explore the [API documentation](docs/api.md) and [examples](https://github.com/GoogleChrome/puppeteer/tree/master/examples/) to learn more.
146
147<!-- [START debugging] -->
148
149## Debugging tips
150
1511. Turn off headless mode - sometimes it's useful to see what the browser is
152 displaying. Instead of launching in headless mode, launch a full version of
153 the browser using `headless: false`:
154
155 const browser = await puppeteer.launch({headless: false});
156
1572. Slow it down - the `slowMo` option slows down Puppeteer operations by the
158 specified amount of milliseconds. It's another way to help see what's going on.
159
160 const browser = await puppeteer.launch({
161 headless: false,
162 slowMo: 250 // slow down by 250ms
163 });
164
1653. Capture console output - You can listen for the `console` event.
166 This is also handy when debugging code in `page.evaluate()`:
167
168 page.on('console', msg => console.log('PAGE LOG:', msg.text()));
169
170 await page.evaluate(() => console.log(`url is ${location.href}`));
171
172 await page.evaluate(() => console.log(`url is ${location.href}`));
173
1744. Enable verbose logging - All public API calls and internal protocol traffic
175 will be logged via the [`debug`](https://github.com/visionmedia/debug) module under the `puppeteer` namespace.
176
177 # Basic verbose logging
178 env DEBUG="puppeteer:*" node script.js
179
180 # Debug output can be enabled/disabled by namespace
181 env DEBUG="puppeteer:*,-puppeteer:protocol" node script.js # everything BUT protocol messages
182 env DEBUG="puppeteer:session" node script.js # protocol session messages (protocol messages to targets)
183 env DEBUG="puppeteer:mouse,puppeteer:keyboard" node script.js # only Mouse and Keyboard API calls
184
185 # Protocol traffic can be rather noisy. This example filters out all Network domain messages
186 env DEBUG="puppeteer:*" env DEBUG_COLORS=true node script.js 2>&1 | grep -v '"Network'
187
188<!-- [END debugging] -->
189
190## Contributing to Puppeteer
191
192Check out [contributing guide](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) to get an overview of Puppeteer development.
193
194<!-- [START faq] -->
195
196# FAQ
197
198#### Q: Which Chromium version does Puppeteer use?
199
200Look for `chromium_revision` in [package.json](https://github.com/GoogleChrome/puppeteer/blob/master/package.json).
201
202Puppeteer bundles Chromium to ensure that the latest features it uses are guaranteed to be available. As the DevTools protocol and browser improve over time, Puppeteer will be updated to depend on newer versions of Chromium.
203
204#### Q: What is the difference between Puppeteer, Selenium / WebDriver, and PhantomJS?
205
206Selenium / WebDriver is a well-established cross-browser API that is useful for testing cross-browser support.
207
208Puppeteer works only with Chromium or Chrome. However, many teams only run unit tests with a single browser (e.g. PhantomJS). In non-testing use cases, Puppeteer provides a powerful but simple API because it's only targeting one browser that enables you to rapidly develop automation scripts.
209
210Puppeteer bundles the latest versions of Chromium.
211
212#### Q: Who maintains Puppeteer?
213
214The Chrome DevTools team maintains the library, but we'd love your help and expertise on the project!
215See [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md).
216
217#### Q: Why is the Chrome team building Puppeteer?
218
219The goals of the project are simple:
220
221- Provide a slim, canonical library that highlights the capabilities of the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/).
222- Provide a reference implementation for similar testing libraries. Eventually, these other frameworks could adopt Puppeteer as their foundational layer.
223- Grow the adoption of headless/automated browser testing.
224- Help dogfood new DevTools Protocol features...and catch bugs!
225- Learn more about the pain points of automated browser testing and help fill those gaps.
226
227#### Q: How does Puppeteer compare with other headless Chrome projects?
228
229The past few months have brought [several new libraries for automating headless Chrome](https://medium.com/@kensoh/chromeless-chrominator-chromy-navalia-lambdium-ghostjs-autogcd-ef34bcd26907). As the team authoring the underlying DevTools Protocol, we're excited to witness and support this flourishing ecosystem.
230
231We've reached out to a number of these projects to see if there are opportunities for collaboration, and we're happy to do what we can to help.
232
233#### Q: What features does Puppeteer not support?
234
235You may find that Puppeteer does not behave as expected when controlling pages that incorporate audio and video. (For example, [video playback/screenshots is likely to fail](https://github.com/GoogleChrome/puppeteer/issues/291).) There are two reasons for this:
236
237* Puppeteer is bundled with Chromium--not Chrome--and so by default, it inherits all of [Chromium's media-related limitations](https://www.chromium.org/audio-video). This means that Puppeteer does not support licensed formats such as AAC or H.264. (However, it is possible to force Puppeteer to use a separately-installed version Chrome instead of Chromium via the [`executablePath` option to `puppeteer.launch`](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.)
238* Since Puppeteer (in all configurations) controls a desktop version of Chromium/Chrome, features that are only supported by the mobile version of Chrome are not supported. This means that Puppeteer [does not support HTTP Live Streaming (HLS)](https://caniuse.com/#feat=http-live-streaming).
239
240#### Q: I am having trouble installing / running Puppeteer in my test environment?
241We have a [troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) guide for various operating systems that lists the required dependencies.
242
243<!-- [END faq] -->