UNPKG

19.6 kBMarkdownView Raw
1# Puppeteer
2
3<!-- [START badges] -->
4[![Linux Build Status](https://img.shields.io/travis/com/GoogleChrome/puppeteer/master.svg)](https://travis-ci.com/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) [![Build Status](https://api.cirrus-ci.com/github/GoogleChrome/puppeteer.svg)](https://cirrus-ci.com/github/GoogleChrome/puppeteer) [![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](https://github.com/GoogleChrome/puppeteer/blob/v1.17.0/docs/api.md) | [FAQ](#faq) | [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) | [Troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md)
10
11> Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). Puppeteer runs [headless](https://developers.google.com/web/updates/2017/04/headless-chrome) by default, but can be configured to run 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 (Single-Page Application) and generate pre-rendered content (i.e. "SSR" (Server-Side Rendering)).
20* Automate form submission, UI testing, keyboard input, etc.
21* 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.
22* Capture a [timeline trace](https://developers.google.com/web/tools/chrome-devtools/evaluate-performance/reference) of your site to help diagnose performance issues.
23* Test Chrome Extensions.
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 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/v1.17.0/docs/api.md#environment-variables).
41
42
43### puppeteer-core
44
45Since version 1.7.0 we publish the [`puppeteer-core`](https://www.npmjs.com/package/puppeteer-core) package,
46a version of Puppeteer that doesn't download Chromium by default.
47
48```bash
49npm i puppeteer-core
50# or "yarn add puppeteer-core"
51```
52
53`puppeteer-core` is intended to be a lightweight version of Puppeteer for launching an existing browser installation or for connecting to a remote one. Be sure that the version of puppeteer-core you install is compatible with the
54browser you intend to connect to.
55
56See [puppeteer vs puppeteer-core](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core).
57
58### Usage
59
60Note: 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.
61
62Puppeteer will be familiar to people using other browser testing frameworks. You create an instance
63of `Browser`, open pages, and then manipulate them with [Puppeteer's API](https://github.com/GoogleChrome/puppeteer/blob/v1.17.0/docs/api.md#).
64
65**Example** - navigating to https://example.com and saving a screenshot as *example.png*:
66
67Save file as **example.js**
68
69```js
70const puppeteer = require('puppeteer');
71
72(async () => {
73 const browser = await puppeteer.launch();
74 const page = await browser.newPage();
75 await page.goto('https://example.com');
76 await page.screenshot({path: 'example.png'});
77
78 await browser.close();
79})();
80```
81
82Execute script on the command line
83
84```bash
85node example.js
86```
87
88Puppeteer 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/v1.17.0/docs/api.md#pagesetviewportviewport).
89
90**Example** - create a PDF.
91
92Save file as **hn.js**
93
94```js
95const puppeteer = require('puppeteer');
96
97(async () => {
98 const browser = await puppeteer.launch();
99 const page = await browser.newPage();
100 await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
101 await page.pdf({path: 'hn.pdf', format: 'A4'});
102
103 await browser.close();
104})();
105```
106
107Execute script on the command line
108
109```bash
110node hn.js
111```
112
113See [`Page.pdf()`](https://github.com/GoogleChrome/puppeteer/blob/v1.17.0/docs/api.md#pagepdfoptions) for more information about creating pdfs.
114
115**Example** - evaluate script in the context of the page
116
117Save file as **get-dimensions.js**
118
119```js
120const puppeteer = require('puppeteer');
121
122(async () => {
123 const browser = await puppeteer.launch();
124 const page = await browser.newPage();
125 await page.goto('https://example.com');
126
127 // Get the "viewport" of the page, as reported by the page.
128 const dimensions = await page.evaluate(() => {
129 return {
130 width: document.documentElement.clientWidth,
131 height: document.documentElement.clientHeight,
132 deviceScaleFactor: window.devicePixelRatio
133 };
134 });
135
136 console.log('Dimensions:', dimensions);
137
138 await browser.close();
139})();
140```
141
142Execute script on the command line
143
144```bash
145node get-dimensions.js
146```
147
148See [`Page.evaluate()`](https://github.com/GoogleChrome/puppeteer/blob/v1.17.0/docs/api.md#pageevaluatepagefunction-args) for more information on `evaluate` and related methods like `evaluateOnNewDocument` and `exposeFunction`.
149
150<!-- [END getstarted] -->
151
152<!-- [START runtimesettings] -->
153## Default runtime settings
154
155**1. Uses Headless mode**
156
157Puppeteer 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/v1.17.0/docs/api.md#puppeteerlaunchoptions) when launching a browser:
158
159```js
160const browser = await puppeteer.launch({headless: false}); // default is true
161```
162
163**2. Runs a bundled version of Chromium**
164
165By default, Puppeteer downloads and uses a specific version of Chromium so its API
166is guaranteed to work out of the box. To use Puppeteer with a different version of Chrome or Chromium,
167pass in the executable's path when creating a `Browser` instance:
168
169```js
170const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});
171```
172
173See [`Puppeteer.launch()`](https://github.com/GoogleChrome/puppeteer/blob/v1.17.0/docs/api.md#puppeteerlaunchoptions) for more information.
174
175See [`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/+/master/docs/chromium_browser_vs_google_chrome.md) describes some differences for Linux users.
176
177**3. Creates a fresh user profile**
178
179Puppeteer creates its own Chromium user profile which it **cleans up on every run**.
180
181<!-- [END runtimesettings] -->
182
183## Resources
184
185- [API Documentation](https://github.com/GoogleChrome/puppeteer/blob/v1.17.0/docs/api.md)
186- [Examples](https://github.com/GoogleChrome/puppeteer/tree/master/examples/)
187- [Community list of Puppeteer resources](https://github.com/transitive-bullshit/awesome-puppeteer)
188
189
190<!-- [START debugging] -->
191
192## Debugging tips
193
1941. Turn off headless mode - sometimes it's useful to see what the browser is
195 displaying. Instead of launching in headless mode, launch a full version of
196 the browser using `headless: false`:
197
198 const browser = await puppeteer.launch({headless: false});
199
2002. Slow it down - the `slowMo` option slows down Puppeteer operations by the
201 specified amount of milliseconds. It's another way to help see what's going on.
202
203 const browser = await puppeteer.launch({
204 headless: false,
205 slowMo: 250 // slow down by 250ms
206 });
207
2083. Capture console output - You can listen for the `console` event.
209 This is also handy when debugging code in `page.evaluate()`:
210
211 page.on('console', msg => console.log('PAGE LOG:', msg.text()));
212
213 await page.evaluate(() => console.log(`url is ${location.href}`));
214
2154. Use debugger in application code browser
216
217 There are two execution context: node.js that is running test code, and the browser
218 running application code being tested. This lets you debug code in the
219 application code browser; ie code inside `evaluate()`.
220
221 - Use `{devtools: true}` when launching Puppeteer:
222
223 `const browser = await puppeteer.launch({devtools: true});`
224
225 - Change default test timeout:
226
227 jest: `jest.setTimeout(100000);`
228
229 jasmine: `jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000;`
230
231 mocha: `this.timeout(100000);` (don't forget to change test to use [function and not '=>'](https://stackoverflow.com/a/23492442))
232
233 - Add an evaluate statement with `debugger` inside / add `debugger` to an existing evaluate statement:
234
235 `await page.evaluate(() => {debugger;});`
236
237 The test will now stop executing in the above evaluate statement, and chromium will stop in debug mode.
238
2395. Use debugger in node.js
240
241 This will let you debug test code. For example, you can step over `await page.click()` in the node.js script and see the click happen in the application code browser.
242
243 Note that you won't be able to run `await page.click()` in
244 DevTools console due to this [Chromium bug](https://bugs.chromium.org/p/chromium/issues/detail?id=833928). So if
245 you want to try something out, you have to add it to your test file.
246
247 - Add `debugger;` to your test, eg:
248 ```
249 debugger;
250 await page.click('a[target=_blank]');
251 ```
252 - Set `headless` to `false`
253 - Run `node --inspect-brk`, eg `node --inspect-brk node_modules/.bin/jest tests`
254 - In Chrome open `chrome://inspect/#devices` and click `inspect`
255 - In the newly opened test browser, type `F8` to resume test execution
256 - Now your `debugger` will be hit and you can debug in the test browser
257
258
2596. Enable verbose logging - internal DevTools protocol traffic
260 will be logged via the [`debug`](https://github.com/visionmedia/debug) module under the `puppeteer` namespace.
261
262 # Basic verbose logging
263 env DEBUG="puppeteer:*" node script.js
264
265 # Protocol traffic can be rather noisy. This example filters out all Network domain messages
266 env DEBUG="puppeteer:*" env DEBUG_COLORS=true node script.js 2>&1 | grep -v '"Network'
267
2687. Debug your Puppeteer (node) code easily, using [ndb](https://github.com/GoogleChromeLabs/ndb)
269
270 - `npm install -g ndb` (or even better, use [npx](https://github.com/zkat/npx)!)
271
272 - add a `debugger` to your Puppeteer (node) code
273
274 - add `ndb` (or `npx ndb`) before your test command. For example:
275
276 `ndb jest` or `ndb mocha` (or `npx ndb jest` / `npx ndb mocha`)
277
278 - debug your test inside chromium like a boss!
279
280
281<!-- [END debugging] -->
282
283## Contributing to Puppeteer
284
285Check out [contributing guide](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md) to get an overview of Puppeteer development.
286
287<!-- [START faq] -->
288
289# FAQ
290
291#### Q: Who maintains Puppeteer?
292
293The Chrome DevTools team maintains the library, but we'd love your help and expertise on the project!
294See [Contributing](https://github.com/GoogleChrome/puppeteer/blob/master/CONTRIBUTING.md).
295
296#### Q: What are Puppeteer’s goals and principles?
297
298The goals of the project are:
299
300- Provide a slim, canonical library that highlights the capabilities of the [DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/).
301- Provide a reference implementation for similar testing libraries. Eventually, these other frameworks could adopt Puppeteer as their foundational layer.
302- Grow the adoption of headless/automated browser testing.
303- Help dogfood new DevTools Protocol features...and catch bugs!
304- Learn more about the pain points of automated browser testing and help fill those gaps.
305
306We adapt [Chromium principles](https://www.chromium.org/developers/core-principles) to help us drive product decisions:
307- **Speed**: Puppeteer has almost zero performance overhead over an automated page.
308- **Security**: Puppeteer operates off-process with respect to Chromium, making it safe to automate potentially malicious pages.
309- **Stability**: Puppeteer should not be flaky and should not leak memory.
310- **Simplicity**: Puppeteer provides a high-level API that’s easy to use, understand, and debug.
311
312#### Q: Is Puppeteer replacing Selenium/WebDriver?
313
314**No**. Both projects are valuable for very different reasons:
315- Selenium/WebDriver focuses on cross-browser automation; its value proposition is a single standard API that works across all major browsers.
316- Puppeteer focuses on Chromium; its value proposition is richer functionality and higher reliability.
317
318That said, you **can** use Puppeteer to run tests against Chromium, e.g. using the community-driven [jest-puppeteer](https://github.com/smooth-code/jest-puppeteer). While this probably shouldn’t be your only testing solution, it does have a few good points compared to WebDriver:
319
320- Puppeteer requires zero setup and comes bundled with the Chromium version it works best with, making it [very easy to start with](https://github.com/GoogleChrome/puppeteer/#getting-started). At the end of the day, it’s better to have a few tests running chromium-only, than no tests at all.
321- Puppeteer has event-driven architecture, which removes a lot of potential flakiness. There’s no need for evil “sleep(1000)” calls in puppeteer scripts.
322- Puppeteer runs headless by default, which makes it fast to run. Puppeteer v1.5.0 also exposes browser contexts, making it possible to efficiently parallelize test execution.
323- Puppeteer shines when it comes to debugging: flip the “headless” bit to false, add “slowMo”, and you’ll see what the browser is doing. You can even open Chrome DevTools to inspect the test environment.
324
325#### Q: Why doesn’t Puppeteer v.XXX work with Chromium v.YYY?
326
327We see Puppeteer as an **indivisible entity** with Chromium. Each version of Puppeteer bundles a specific version of Chromium – **the only** version it is guaranteed to work with.
328
329This is not an artificial constraint: A lot of work on Puppeteer is actually taking place in the Chromium repository. Here’s a typical story:
330- A Puppeteer bug is reported: https://github.com/GoogleChrome/puppeteer/issues/2709
331- It turned out this is an issue with the DevTools protocol, so we’re fixing it in Chromium: https://chromium-review.googlesource.com/c/chromium/src/+/1102154
332- Once the upstream fix is landed, we roll updated Chromium into Puppeteer: https://github.com/GoogleChrome/puppeteer/pull/2769
333
334However, oftentimes it is desirable to use Puppeteer with the official Google Chrome rather than Chromium. For this to work, you should install a `puppeteer-core` version that corresponds to the Chrome version.
335
336For example, in order to drive Chrome 71 with puppeteer-core, use `chrome-71` npm tag:
337```bash
338npm install puppeteer-core@chrome-71
339```
340
341#### Q: Which Chromium version does Puppeteer use?
342
343Look for `chromium_revision` in [package.json](https://github.com/GoogleChrome/puppeteer/blob/master/package.json).
344
345#### Q: What’s considered a “Navigation”?
346
347From Puppeteer’s standpoint, **“navigation” is anything that changes a page’s URL**.
348Aside from regular navigation where the browser hits the network to fetch a new document from the web server, this includes [anchor navigations](https://www.w3.org/TR/html5/single-page.html#scroll-to-fragid) and [History API](https://developer.mozilla.org/en-US/docs/Web/API/History_API) usage.
349
350With this definition of “navigation,” **Puppeteer works seamlessly with single-page applications.**
351
352#### Q: What’s the difference between a “trusted" and "untrusted" input event?
353
354In browsers, input events could be divided into two big groups: trusted vs. untrusted.
355
356- **Trusted events**: events generated by users interacting with the page, e.g. using a mouse or keyboard.
357- **Untrusted event**: events generated by Web APIs, e.g. `document.createEvent` or `element.click()` methods.
358
359Websites can distinguish between these two groups:
360- using an [`Event.isTrusted`](https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted) event flag
361- sniffing for accompanying events. For example, every trusted `'click'` event is preceded by `'mousedown'` and `'mouseup'` events.
362
363For automation purposes it’s important to generate trusted events. **All input events generated with Puppeteer are trusted and fire proper accompanying events.** If, for some reason, one needs an untrusted event, it’s always possible to hop into a page context with `page.evaluate` and generate a fake event:
364
365```js
366await page.evaluate(() => {
367 document.querySelector('button[type=submit]').click();
368});
369```
370
371#### Q: What features does Puppeteer not support?
372
373You 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:
374
375* 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/v1.17.0/docs/api.md#puppeteerlaunchoptions). You should only use this configuration if you need an official release of Chrome that supports these media formats.)
376* 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).
377
378#### Q: I am having trouble installing / running Puppeteer in my test environment. Where should I look for help?
379We have a [troubleshooting](https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md) guide for various operating systems that lists the required dependencies.
380
381#### Q: How do I try/test a prerelease version of Puppeteer?
382
383You can check out this repo or install the latest prerelease from npm:
384
385```bash
386npm i --save puppeteer@next
387```
388
389Please note that prerelease may be unstable and contain bugs.
390
391#### Q: I have more questions! Where do I ask?
392
393There are many ways to get help on Puppeteer:
394- [bugtracker](https://github.com/GoogleChrome/puppeteer/issues)
395- [stackoverflow](https://stackoverflow.com/questions/tagged/puppeteer)
396- [slack channel](https://join.slack.com/t/puppeteer/shared_invite/enQtMzU4MjIyMDA5NTM4LTM1OTdkNDhlM2Y4ZGUzZDdjYjM5ZWZlZGFiZjc4MTkyYTVlYzIzYjU5NDIyNzgyMmFiNDFjN2UzNWU0N2ZhZDc)
397
398Make sure to search these channels before posting your question.
399
400
401<!-- [END faq] -->