2017-06-13 07:28:29 +00:00
# Puppeteer API
2017-06-27 19:15:21 +00:00
##### Table of Contents
2017-07-07 16:36:45 +00:00
<!-- toc -->
- [class: Browser ](#class-browser )
* [new Browser([options])](#new-browseroptions)
* [browser.close() ](#browserclose )
2017-07-12 00:01:58 +00:00
* [browser.closePage(page) ](#browserclosepagepage )
2017-07-07 16:36:45 +00:00
* [browser.newPage() ](#browsernewpage )
2017-07-12 15:01:21 +00:00
* [browser.stderr ](#browserstderr )
* [browser.stdout ](#browserstdout )
2017-07-14 05:52:02 +00:00
* [browser.version() ](#browserversion )
2017-07-07 16:36:45 +00:00
- [class: Page ](#class-page )
2017-07-18 03:38:11 +00:00
* [event: 'console' ](#event-console )
2017-07-14 20:03:21 +00:00
* [event: 'dialog' ](#event-dialog )
* [event: 'frameattached' ](#event-frameattached )
* [event: 'framedetached' ](#event-framedetached )
* [event: 'framenavigated' ](#event-framenavigated )
* [event: 'load' ](#event-load )
* [event: 'pageerror' ](#event-pageerror )
* [event: 'request' ](#event-request )
* [event: 'requestfailed' ](#event-requestfailed )
* [event: 'requestfinished' ](#event-requestfinished )
* [event: 'response' ](#event-response )
2017-07-18 01:56:56 +00:00
* [page.$(selector, pageFunction, ...args) ](#pageselector-pagefunction-args )
* [page.$$(selector, pageFunction, ...args) ](#pageselector-pagefunction-args )
2017-07-07 16:36:45 +00:00
* [page.addScriptTag(url) ](#pageaddscripttagurl )
2017-07-12 00:01:58 +00:00
* [page.click(selector) ](#pageclickselector )
2017-07-07 16:36:45 +00:00
* [page.close() ](#pageclose )
2017-07-18 01:13:04 +00:00
* [page.emulate(name, options) ](#pageemulatename-options )
* [page.emulatedDevices() ](#pageemulateddevices )
2017-07-14 20:51:22 +00:00
* [page.evaluate(pageFunction, ...args) ](#pageevaluatepagefunction-args )
* [page.evaluateOnInitialized(pageFunction, ...args) ](#pageevaluateoninitializedpagefunction-args )
2017-07-12 00:01:58 +00:00
* [page.focus(selector) ](#pagefocusselector )
2017-07-07 16:36:45 +00:00
* [page.frames() ](#pageframes )
2017-07-07 17:34:35 +00:00
* [page.httpHeaders() ](#pagehttpheaders )
2017-07-07 16:36:45 +00:00
* [page.injectFile(filePath) ](#pageinjectfilefilepath )
2017-07-18 01:49:52 +00:00
* [page.keyboard ](#pagekeyboard )
2017-07-07 16:36:45 +00:00
* [page.mainFrame() ](#pagemainframe )
2017-07-10 22:09:52 +00:00
* [page.navigate(url, options) ](#pagenavigateurl-options )
2017-07-17 09:06:52 +00:00
* [page.pdf(options) ](#pagepdfoptions )
2017-07-07 16:36:45 +00:00
* [page.plainText() ](#pageplaintext )
2017-07-18 01:13:04 +00:00
* [page.reload() ](#pagereload )
2017-07-07 16:36:45 +00:00
* [page.screenshot([options])](#pagescreenshotoptions)
* [page.setContent(html) ](#pagesetcontenthtml )
* [page.setHTTPHeaders(headers) ](#pagesethttpheadersheaders )
* [page.setInPageCallback(name, callback) ](#pagesetinpagecallbackname-callback )
2017-07-12 00:01:58 +00:00
* [page.setRequestInterceptor(interceptor) ](#pagesetrequestinterceptorinterceptor )
2017-07-07 16:36:45 +00:00
* [page.setUserAgent(userAgent) ](#pagesetuseragentuseragent )
2017-07-18 01:13:04 +00:00
* [page.setViewport(viewport) ](#pagesetviewportviewport )
2017-07-07 16:36:45 +00:00
* [page.title() ](#pagetitle )
2017-07-12 00:01:58 +00:00
* [page.type(text) ](#pagetypetext )
2017-07-10 18:21:46 +00:00
* [page.uploadFile(selector, ...filePaths) ](#pageuploadfileselector-filepaths )
2017-07-07 16:36:45 +00:00
* [page.url() ](#pageurl )
* [page.userAgent() ](#pageuseragent )
2017-07-18 01:13:04 +00:00
* [page.viewport() ](#pageviewport )
2017-07-07 22:39:02 +00:00
* [page.waitFor(selector) ](#pagewaitforselector )
2017-07-18 01:49:52 +00:00
- [class: Keyboard ](#class-keyboard )
* [keyboard.hold(key[, options])](#keyboardholdkey-options)
* [keyboard.modifiers() ](#keyboardmodifiers )
* [keyboard.press(key[, options])](#keyboardpresskey-options)
* [keyboard.release(key) ](#keyboardreleasekey )
* [keyboard.sendCharacter(char) ](#keyboardsendcharacterchar )
* [keyboard.type(text) ](#keyboardtypetext )
2017-07-07 16:36:45 +00:00
- [class: Dialog ](#class-dialog )
2017-07-12 00:01:58 +00:00
* [dialog.accept([promptText])](#dialogacceptprompttext)
2017-07-07 16:36:45 +00:00
* [dialog.dismiss() ](#dialogdismiss )
* [dialog.message() ](#dialogmessage )
2017-07-12 15:01:21 +00:00
* [dialog.type ](#dialogtype )
2017-07-07 16:36:45 +00:00
- [class: Frame ](#class-frame )
2017-07-18 01:56:56 +00:00
* [frame.$(selector, pageFunction, ...args) ](#frameselector-pagefunction-args )
* [frame.$$(selector, pageFunction, ...args) ](#frameselector-pagefunction-args )
2017-07-07 16:36:45 +00:00
* [frame.childFrames() ](#framechildframes )
2017-07-14 20:51:22 +00:00
* [frame.evaluate(pageFunction, ...args) ](#frameevaluatepagefunction-args )
2017-07-07 16:36:45 +00:00
* [frame.isDetached() ](#frameisdetached )
* [frame.isMainFrame() ](#frameismainframe )
* [frame.name() ](#framename )
* [frame.parentFrame() ](#frameparentframe )
* [frame.url() ](#frameurl )
2017-07-07 22:39:02 +00:00
* [frame.waitFor(selector) ](#framewaitforselector )
2017-07-07 16:36:45 +00:00
- [class: Request ](#class-request )
2017-07-12 15:01:21 +00:00
* [request.headers ](#requestheaders )
* [request.method ](#requestmethod )
2017-07-14 05:52:02 +00:00
* [request.response() ](#requestresponse )
2017-07-12 15:01:21 +00:00
* [request.url ](#requesturl )
2017-07-07 17:34:35 +00:00
- [class: Response ](#class-response )
2017-07-12 15:01:21 +00:00
* [response.headers ](#responseheaders )
* [response.ok ](#responseok )
2017-07-14 05:52:02 +00:00
* [response.request() ](#responserequest )
2017-07-12 15:01:21 +00:00
* [response.status ](#responsestatus )
* [response.statusText ](#responsestatustext )
* [response.url ](#responseurl )
2017-07-07 17:34:35 +00:00
- [class: InterceptedRequest ](#class-interceptedrequest )
* [interceptedRequest.abort() ](#interceptedrequestabort )
* [interceptedRequest.continue() ](#interceptedrequestcontinue )
2017-07-14 05:52:02 +00:00
* [interceptedRequest.headers ](#interceptedrequestheaders )
2017-07-07 17:34:35 +00:00
* [interceptedRequest.isHandled() ](#interceptedrequestishandled )
2017-07-14 05:52:02 +00:00
* [interceptedRequest.method ](#interceptedrequestmethod )
* [interceptedRequest.postData ](#interceptedrequestpostdata )
* [interceptedRequest.url ](#interceptedrequesturl )
2017-07-07 17:34:35 +00:00
- [class: Headers ](#class-headers )
2017-07-12 00:01:58 +00:00
* [headers.append(name, value) ](#headersappendname-value )
* [headers.delete(name) ](#headersdeletename )
2017-07-07 17:34:35 +00:00
* [headers.entries() ](#headersentries )
2017-07-12 00:01:58 +00:00
* [headers.get(name) ](#headersgetname )
* [headers.has(name) ](#headershasname )
2017-07-07 17:34:35 +00:00
* [headers.keys() ](#headerskeys )
2017-07-12 00:01:58 +00:00
* [headers.set(name, value) ](#headerssetname-value )
2017-07-07 17:34:35 +00:00
* [headers.values() ](#headersvalues )
- [class: Body ](#class-body )
* [body.arrayBuffer() ](#bodyarraybuffer )
2017-07-14 06:11:39 +00:00
* [body.bodyUsed ](#bodybodyused )
2017-07-07 17:34:35 +00:00
* [body.buffer() ](#bodybuffer )
* [body.json() ](#bodyjson )
* [body.text() ](#bodytext )
2017-07-07 16:36:45 +00:00
<!-- tocstop -->
2017-06-13 07:28:29 +00:00
### class: Browser
Browser manages a browser instance, creating it with a predefined
settings, opening and closing pages. Instantiating Browser class does
not necessarily result in launching browser; the instance will be launched when the need will arise.
2017-07-13 22:54:37 +00:00
A typical scenario of using [Browser] is opening a new page and navigating it to a desired URL:
```js
const {Browser} = require('puppeteer');
const browser = new Browser();
browser.newPage().then(async page => {
await page.navigate('https://example.com');
browser.close();
})
```
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
#### new Browser([options])
2017-06-21 18:17:35 +00:00
- `options` < [Object]> Set of configurable options to set on the browser. Can have the following fields:
- `headless` < [boolean]> Wether to run chromium in headless mode. Defaults to `true` .
- `executablePath` < [string]> Path to a chromium executable to run instead of bundled chromium.
- `args` < [Array]< [string]>> Additional arguments to pass to the chromium instance. List of chromium flags could be found [here ](http://peter.sh/experiments/chromium-command-line-switches/ ).
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### browser.close()
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
Closes browser with all the pages (if any were opened). The browser object itself is considered to be disposed and could not be used anymore.
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
#### browser.closePage(page)
- `page` < [Page]> A page to be closed.
- returns: < [Promise]> Promise which resolves when the page is closed.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
This is an alias for the `page.close()` method.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
#### browser.newPage()
- returns: < [Promise]< [Page]>> Promise which resolves to a new [Page] object.
2017-06-13 07:28:29 +00:00
2017-07-12 15:01:21 +00:00
#### browser.stderr
- < [stream.Readable]>
A Readable Stream that represents the browser process's stderr.
2017-07-13 22:54:37 +00:00
For example, `stderr` could be piped into `process.stderr` :
```js
const {Browser} = require('puppeteer');
const browser = new Browser();
browser.stderr.pipe(process.stderr);
browser.version().then(version => {
console.log(version);
browser.close();
});
```
2017-07-12 15:01:21 +00:00
#### browser.stdout
- < [stream.Readable]>
A Readable Stream that represents the browser process's stdout.
2017-07-13 22:54:37 +00:00
For example, `stdout` could be piped into `process.stdout` :
```js
const {Browser} = require('puppeteer');
const browser = new Browser();
browser.stdout.pipe(process.stdout);
browser.version().then(version => {
console.log(version);
browser.close();
});
```
2017-07-12 15:01:21 +00:00
2017-07-14 05:52:02 +00:00
#### browser.version()
2017-07-13 22:54:37 +00:00
- returns: < [Promise]< [string]>> String describing browser version. For headless chromium, this is similar to `HeadlessChrome/61.0.3153.0` . For non-headless, this is `Chrome/61.0.3153.0` .
> **NOTE** the format of browser.version() is not fixed and might change with future releases of the library.
2017-07-14 05:52:02 +00:00
2017-06-13 07:28:29 +00:00
### class: Page
2017-07-13 22:54:37 +00:00
Page provides methods to interact with browser page. Page could be thought about as a browser tab, so one [Browser] instance might have multiple [Page] instances.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
An example of creating a page, navigating it to a URL and saving screenshot as `screenshot.png` :
```js
const {Browser} = require('puppeteer');
const browser = new Browser();
2017-07-18 01:49:52 +00:00
browser.newPage().then(async page =>
2017-07-13 22:54:37 +00:00
await page.navigate('https://example.com');
await page.screenshot({path: 'screenshot.png'});
browser.close();
2017-06-13 07:28:29 +00:00
});
```
2017-07-18 03:38:11 +00:00
#### event: 'console'
2017-07-14 20:03:21 +00:00
- < [string]>
2017-07-18 03:38:11 +00:00
Emitted when a page calls one of console API methods, e.g. `console.log` or `console.dir` .
If multiple arguments are passed over to the console API call, these arguments are dispatched in an event.
An example of handling `console` event:
```js
page.on('console', (...args) => {
for (let i =0; i < args.length ; + + i )
console.log(`${i}: ${args[i]}`);
});
page.evaluate(() => console.log(5, 'hello', {foo: 'bar'}));
```
2017-07-14 20:03:21 +00:00
#### event: 'dialog'
- < [Dialog]>
Emitted when a javascript dialog, such as `alert` , `prompt` , `confirm` or `beforeunload` , gets opened on the page. Puppeteer can take action to the dialog via dialog's [accept ](#dialogacceptprompttext ) or [dismiss ](#dialogdismiss ) methods.
#### event: 'frameattached'
- < [Frame]>
Emitted when a frame gets attached.
#### event: 'framedetached'
- < [Frame]>
Emitted when a frame gets detached.
#### event: 'framenavigated'
- < [Frame]>
Emitted when a frame committed navigation.
#### event: 'load'
Emitted when a page's `load` event was dispatched.
#### event: 'pageerror'
- < [string]>
Emitted when an unhandled exception happens on the page. The only argument of the event holds the exception message.
#### event: 'request'
- < [Request]>
Emitted when a page issues a request. The [request] object is a read-only object. In order to intercept and mutate requests, see [page.setRequestInterceptor ](#pagesetrequestinterceptorinterceptor )
#### event: 'requestfailed'
- < [Request]>
Emitted when a request is failed.
#### event: 'requestfinished'
- < [Request]>
Emitted when a request is successfully finished.
#### event: 'response'
- < [Response]>
Emitted when a [response] is received.
2017-06-13 07:28:29 +00:00
2017-07-18 01:56:56 +00:00
#### page.$(selector, pageFunction, ...args)
- `selector` < [string]> A selector to be matched in the page
- `pageFunction` < [function]\([Element]\)> Function to be evaluated in-page with first element matching `selector`
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
- returns: < [Promise]< [Object]>> Promise which resolves to function return value.
Example:
```js
const outerhtml = await page.$('#box', e => e.outerHTML);
```
Shortcut for [page.mainFrame().$(selector, pageFunction, ...args) ](#pageselector-fun-args ).
#### page.$$(selector, pageFunction, ...args)
- `selector` < [string]> A selector to be matched in the page
- `pageFunction` < [function]\([Element]\)> Function to be evaluated in-page for every matching element.
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
- returns: < [Promise]< [Array]< [Object]>>> Promise which resolves to array of function return values.
Example:
```js
const headings = await page.$$('h1,h2,h3,h4', el => el.textContent);
for (const heading of headings) console.log(heading);
```
Shortcut for [page.mainFrame().$$(selector, pageFunction, ...args) ](#pageselector-fun-args ).
2017-07-13 22:54:37 +00:00
#### page.addScriptTag(url)
2017-06-21 18:17:35 +00:00
- `url` < [string]> Url of a script to be added
- returns: < [Promise]> Promise which resolves as the script gets added and loads.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
Adds a `<script></script>` tag to the page with the desired url. Alternatively, javascript could be injected to the page via `page.injectFile` method.
2017-07-12 00:01:58 +00:00
#### page.click(selector)
2017-07-13 22:54:37 +00:00
- `selector` < [string]> A query selector to search for element to click. If there are multiple elements satisfying the selector, the first will be clicked.
- returns: < [Promise]> Promise which resolves when the element matching `selector` is successfully clicked. Promise gets rejected if there's no element matching `selector` .
2017-07-07 17:34:35 +00:00
2017-06-27 19:15:21 +00:00
#### page.close()
- returns: < [Promise]> Returns promise which resolves when page gets closed.
2017-06-13 07:28:29 +00:00
2017-07-18 01:13:04 +00:00
#### page.emulate(name, options)
- `name` < [string]> A name of the device to be emulated. Get the full list of emulated devices via `page.emulatedDevices()` .
- `options` < [Object]> Emulation parameters which might have the following properties:
- `landscape` < [boolean]> Emulates device in the landscape mode, defaults to `false` .
- returns: < [Promise]> Returns promise which resolves when device is emulated. Can reload the page if switching between mobile and desktop devices.
#### page.emulatedDevices()
- returns: < [Array]< [String]>> Returns array of device names that can be used with `page.emulate()` .
2017-07-14 20:51:22 +00:00
#### page.evaluate(pageFunction, ...args)
- `pageFunction` < [function]> Function to be evaluated in browser context
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
2017-06-27 19:15:21 +00:00
- returns: < [Promise]< [Object]>> Promise which resolves to function return value
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
This is a shortcut for [page.mainFrame().evaluate() ](#frameevaluatefun-args ) method.
2017-06-13 07:28:29 +00:00
2017-07-14 20:51:22 +00:00
#### page.evaluateOnInitialized(pageFunction, ...args)
- `pageFunction` < [function]> Function to be evaluated in browser context
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
2017-06-27 19:15:21 +00:00
- returns: < [Promise]< [Object]>> Promise which resolves to function
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
`page.evaluateOnInitialized` adds a function which would run on every page navigation before any page's javascript. This is useful to amend javascript environment, e.g. to seed [Math.random ](https://github.com/GoogleChrome/puppeteer/blob/master/examples/unrandomize.js )
2017-07-12 00:01:58 +00:00
#### page.focus(selector)
- `selector` < [string]> A query selector of element to focus. If there are multiple elements satisfying the selector, the first will be focused.
2017-07-13 22:54:37 +00:00
- returns: < [Promise]> Promise which resolves when the element matching `selector` is successfully focused. Promise gets rejected if there's no element matching `selector` .
2017-07-07 17:34:35 +00:00
#### page.frames()
2017-07-13 22:54:37 +00:00
- returns: < [Array]< [Frame]>> An array of all frames attached to the page.
2017-07-07 17:34:35 +00:00
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
#### page.httpHeaders()
- returns: < [Object]> Key-value set of additional http headers which will be sent with every request.
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.injectFile(filePath)
2017-07-11 15:57:26 +00:00
- `filePath` < [string]> Path to the javascript file to be injected into page.
2017-06-27 19:15:21 +00:00
- returns: < [Promise]> Promise which resolves when file gets successfully evaluated in page.
2017-06-13 07:28:29 +00:00
2017-07-18 01:49:52 +00:00
#### page.keyboard
- returns: < [Keyboard]>
2017-06-27 19:15:21 +00:00
#### page.mainFrame()
2017-07-13 22:54:37 +00:00
- returns: < [Frame]> returns page's main frame.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
Page is guaranteed to have a main frame which persists during navigations.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
#### page.navigate(url, options)
2017-06-21 18:17:35 +00:00
- `url` < [string]> URL to navigate page to
2017-07-10 22:09:52 +00:00
- `options` < [Object]> Navigation parameters which might have the following properties:
- `maxTime` < [number]> Maximum navigation time in milliseconds, defaults to 30 seconds.
2017-07-14 20:59:36 +00:00
- `waitUntil` < [string]> When to consider navigation succeeded, defaults to `load` . Could be either:
2017-07-10 22:09:52 +00:00
- `load` - consider navigation to be finished when the `load` event is fired.
- `networkidle` - consider navigation to be finished when the network activity stays "idle" for at least `networkIdleTimeout` ms.
2017-07-14 20:59:36 +00:00
- `networkIdleInflight` < [number]> Maximum amount of inflight requests which are considered "idle". Takes effect only with `waitUntil: 'networkidle'` parameter.
- `networkIdleTimeout` < [number]> A timeout to wait before completing navigation. Takes effect only with `waitUntil: 'networkidle'` parameter.
2017-07-10 22:09:52 +00:00
- returns: < [Promise]< [Response]>> Promise which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect.
The `page.navigate` will throw an error if:
- there's an SSL error (e.g. in case of self-signed certificates).
- target URL is invalid.
- the `maxTime` is exceeded during navigation.
2017-06-13 07:28:29 +00:00
2017-07-17 09:06:52 +00:00
#### page.pdf(options)
- `options` < [Object]> Options object which might have the following properties:
- `path` < [string]> The file path to save the PDF to.
- `scale` < [number]> Scale of the webpage rendering. Defaults to `1` .
- `displayHeaderFooter` < [boolean]> Display header and footer. Defaults to `false` .
- `printBackground` < [boolean]> Print background graphics. Defaults to `false` .
- `landscape` < [boolean]> Paper orientation. Defaults to `false` .
- `pageRanges` < [string]> Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means print all pages.
- `format` < [string]> Paper format. If set, takes priority over `width` or `height` options. Defaults to 'Letter'.
- `width` < [string]> Paper width, accepts values labeled with units.
- `height` < [string]> Paper height, accepts values labeled with units.
- `margin` < [Object]> Paper margins, defaults to none.
- `top` < [string]> Top margin, accepts values labeled with units.
- `right` < [string]> Right margin, accepts values labeled with units.
- `bottom` < [string]> Bottom margin, accepts values labeled with units.
- `left` < [string]> Left margin, accepts values labeled with units.
- returns: < [Promise]< [Buffer]>> Promise which resolves with PDF buffer.
The `width` , `height` , and `margin` options accept values labeled with units. Unlabeled values are treated as pixels.
A few examples:
- `page.pdf({width: 100})` - prints with width set to 100 pixels
- `page.pdf({width: '100px'})` - prints with width set to 100 pixels
- `page.pdf({width: '10cm'})` - prints with width set to 10 centimeters.
All possible units are:
- `px` - pixel
- `in` - inch
- `cm` - centimeter
- `mm` - millimeter
The `format` options are:
- `Letter` : 8.5in x 11in
- `Legal` : 8.5in x 14in
- `Tabloid` : 11in x 17in
- `Ledger` : 17in x 11in
- `A0` : 33.1in x 46.8in
- `A1` : 23.4in x 33.1in
- `A2` : 16.5in x 23.4in
- `A3` : 11.7in x 16.5in
- `A4` : 8.27in x 11.7in
- `A5` : 5.83in x 8.27in
2017-06-27 19:15:21 +00:00
#### page.plainText()
- returns: < [Promise]< [string]>> Returns page's inner text.
2017-06-13 07:28:29 +00:00
2017-07-18 01:13:04 +00:00
#### page.reload()
- returns: < [Promise]< [Response]>> Promise which resolves to the main resource response. In case of multiple redirects, the navigation will resolve with the response of the last redirect.
2017-06-19 22:01:14 +00:00
#### page.screenshot([options])
2017-06-21 18:17:35 +00:00
- `options` < [Object]> Options object which might have the following properties:
- `path` < [string]> The file path to save the image to. The screenshot type will be inferred from file extension.
2017-07-17 09:06:52 +00:00
- `type` < [string]> Specify screenshot type, could be either `jpeg` or `png` . Defaults to 'png'.
- `quality` < [number]> The quality of the image, between 0-100. Not applicable to `png` images.
- `fullPage` < [boolean]> When true, takes a screenshot of the full scrollable page. Defaults to `false` .
2017-06-21 18:17:35 +00:00
- `clip` < [Object]> An object which specifies clipping region of the page. Should have the following fields:
- `x` < [number]> x-coordinate of top-left corner of clip area
- `y` < [number]> y-coordinate of top-left corner of clip area
- `width` < [number]> width of clipping area
- `height` < [number]> height of clipping area
- returns: < [Promise]< [Buffer]>> Promise which resolves to buffer with captured screenshot
2017-06-13 07:28:29 +00:00
2017-06-27 19:15:21 +00:00
#### page.setContent(html)
- `html` < [string]> HTML markup to assign to the page.
- returns: < [Promise]> Promise which resolves when the content is successfully assigned.
2017-06-13 07:28:29 +00:00
2017-06-29 06:09:28 +00:00
#### page.setHTTPHeaders(headers)
2017-06-27 19:15:21 +00:00
- `headers` < [Object]> Key-value set of additional http headers to be sent with every request.
- returns: < [Promise]> Promise which resolves when additional headers are installed
#### page.setInPageCallback(name, callback)
2017-07-11 15:57:26 +00:00
- `name` < [string]> Name of the callback to be assigned on window object
2017-07-13 22:54:37 +00:00
- `callback` < [function]> Callback function which will be called in puppeteer's context.
2017-06-27 19:15:21 +00:00
- returns: < [Promise]> Promise which resolves when callback is successfully initialized
2017-07-18 01:49:52 +00:00
The in-page callback allows page to asynchronously reach back to the Puppeteer.
2017-07-13 22:54:37 +00:00
An example of a page showing amount of CPU's:
```js
const os = require('os');
const {Browser} = require('puppeteer');
const browser = new Browser();
browser.newPage().then(async page =>
await page.setInPageCallback('getCPUCount', () => os.cpus().length);
await page.evaluate(async () => {
alert(await window.getCPUCount());
});
browser.close();
});
```
2017-07-12 00:01:58 +00:00
#### page.setRequestInterceptor(interceptor)
- `interceptor` < [function]> Callback function which accepts a single argument of type < [InterceptedRequest]>.
2017-07-13 22:54:37 +00:00
- returns: < [Promise]> Promise which resolves when request interceptor is successfully installed on the page.
After the request interceptor is installed on the page, every request will be reported to the interceptor. The [InterceptedRequest] could be modified and then either continued via the `continue()` method, or aborted via the `abort()` method.
En example of a naive request interceptor which aborts all image requests:
```js
const {Browser} = require('puppeteer');
const browser = new Browser();
browser.newPage().then(async page =>
await page.setRequestInterceptor(interceptedRequest => {
if (interceptedRequest.url.endsWith('.png') || interceptedRequest.url.endsWith('.jpg'))
interceptedRequest.abort();
else
interceptedRequest.continue();
});
await page.navigate('https://example.com');
browser.close();
});
```
2017-06-27 19:15:21 +00:00
2017-06-29 06:09:28 +00:00
#### page.setUserAgent(userAgent)
2017-06-27 19:15:21 +00:00
- `userAgent` < [string]> Specific user agent to use in this page
- returns: < [Promise]> Promise which resolves when the user agent is set.
2017-07-18 01:13:04 +00:00
#### page.setViewport(viewport)
- `viewport` < [Object]> An object with two fields:
2017-06-27 19:15:21 +00:00
- `width` < [number]> Specify page's width in pixels.
- `height` < [number]> Specify page's height in pixels.
- returns: < [Promise]> Promise which resolves when the dimensions are updated.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
The page's viewport size defines page's dimensions, observable from page via `window.innerWidth / window.innerHeight` . The viewport size defines a size of page
screenshot (unless a `fullPage` option is given).
In case of multiple pages in one browser, each page can have its own viewport size.
2017-06-13 07:28:29 +00:00
2017-07-13 22:54:37 +00:00
#### page.title()
2017-06-21 18:17:35 +00:00
- returns: < [Promise]< [string]>> Returns page's title.
2017-06-13 07:28:29 +00:00
2017-07-12 00:01:58 +00:00
#### page.type(text)
- `text` < [string]> A text to type into a focused element.
2017-07-13 22:54:37 +00:00
- returns: < [Promise]> Promise which resolves when the text has been successfully typed.
2017-06-13 07:28:29 +00:00
2017-07-10 18:21:46 +00:00
#### page.uploadFile(selector, ...filePaths)
- `selector` < [string]> A query selector to a file input
- `...filePaths` < [string]> Sets the value of the file input these paths
- returns: < [Promise]> Promise which resolves when the value is set.
2017-06-27 19:15:21 +00:00
#### page.url()
2017-07-14 21:05:27 +00:00
- returns: < [string]> Current page url.
This is a shortcut for [page.mainFrame().url() ](#frameurl )
2017-06-27 19:15:21 +00:00
2017-06-29 06:09:28 +00:00
#### page.userAgent()
- returns: < [string]> Returns user agent.
2017-06-27 19:15:21 +00:00
2017-07-18 01:13:04 +00:00
#### page.viewport()
2017-06-27 19:15:21 +00:00
- returns: < [Object]> An object with two fields:
- `width` < [number]> Page's width in pixels.
- `height` < [number]> Page's height in pixels.
2017-07-07 22:39:02 +00:00
2017-07-13 22:54:37 +00:00
#### page.waitFor(selector)
2017-07-11 15:57:26 +00:00
- `selector` < [string]> A query selector to wait for on the page.
2017-07-13 22:54:37 +00:00
- returns: < [Promise]> Promise which resolves when the element matching `selector` appears in the page.
2017-07-11 15:57:26 +00:00
2017-07-07 22:39:02 +00:00
Shortcut for [page.mainFrame().waitFor(selector) ](#framewaitforselector ).
2017-06-27 19:15:21 +00:00
2017-07-18 01:49:52 +00:00
### class: Keyboard
Keyboard provides an api for managing a virtual keyboard. The high level api is [`keyboard.type` ](#keyboardtypetext ), which takes raw characters and generates proper keydown, keypress/input, and keyup events on your page.
For finer control, you can use press, release, and sendCharacter to manually fire events as if they were generated from a real keyboard.
An example of holding down `Shift` in order to select and delete some text:
```js
page.keyboard.type('Hello World!');
page.keyboard.press('ArrowLeft');
page.keyboard.hold('Shift');
for (let i = 0; i = 0; i < ' World'.length; i++)
page.keyboard.press('ArrowLeft');
page.keyboard.release('Shift');
page.keyboard.press('Backspace');
// Result text will end up saying 'Hello!'
```
#### keyboard.hold(key[, options])
- `key` < [string]> Name of key to press, such as `ArrowLeft` . See [KeyboardEvent.key ](https://www.w3.org/TR/uievents-key/ )
- `options` < [Object]>
- `text` < [string]> If specified, generates an input event with this text.
- returns: < [Promise]>
Dispatches a `keydown` event.
This will not send input events unless `text` is specified.
If `key` is a modifier key, `Shift` , `Meta` , `Control` , or `Alt` , subsequent key presses will be sent with that modifier active. To release the modifier key, use [`keyboard.release` ](#keyboardreleasekey ).
#### keyboard.modifiers()
- returns: < [Object]>
- `Shift` < [boolean]>
- `Meta` < [boolean]>
- `Control` < [boolean]>
- `Alt` < [boolean]>
Returns which modifier keys are currently active. Use [`keyboard.hold` ](#keyboardholdkey ) to activate a modifier key.
#### keyboard.press(key[, options])
- `key` < [string]> Name of key to press, such as `ArrowLeft` . See [KeyboardEvent.key ](https://www.w3.org/TR/uievents-key/ )
- `options` < [Object]>
- `text` < [string]> If specified, generates an input event with this text.
- returns: < [Promise]>
Shortcut for [`keyboard.hold` ](#keyboardholdkey ) and [`keyboard.release` ](#keyboardreleasekey ).
#### keyboard.release(key)
- `key` < [string]> Name of key to release, such as `ArrowLeft` . See [KeyboardEvent.key ](https://www.w3.org/TR/uievents-key/ )
- returns: < [Promise]>
Dispatches a `keyup` event.
#### keyboard.sendCharacter(char)
- `char` < [string]> Character to send into the page.
- returns: < [Promise]>
Dispatches a `keypress` and `input` event. This does not send a `keydown` or `keyup` event.
```js
page.keyboard.sendCharacter('嗨');
```
#### keyboard.type(text)
- `text` < [string]> Text to type into the page
- returns: < [Promise]>
Sends a `keydown` , `keypress` /`input`, and `keyup` event for each character in the text.
This is the suggested way to type printable characters.
```js
page.keyboard.type('Hello World!');
```
2017-06-27 19:15:21 +00:00
### class: Dialog
2017-07-14 20:03:21 +00:00
[Dialog] objects are dispatched by page via the ['dialog' ](#event-dialog ) event.
2017-07-17 18:02:13 +00:00
An example of using `Dialog` class:
```js
const {Browser} = require('puppeteer');
const browser = new Browser({headless: false});
browser.newPage().then(async page => {
page.on('dialog', dialog => {
console.log(dialog.message());
dialog.dismiss();
browser.close();
});
page.evaluate(() => alert('1'));
});
```
> NOTE: Chrome Headless currently has issues with managing javascript dialogs, see [issue 13](https://github.com/GoogleChrome/puppeteer/issues/13)
2017-07-12 00:01:58 +00:00
#### dialog.accept([promptText])
2017-07-13 22:54:37 +00:00
- `promptText` < [string]> A text to enter in prompt. Does not cause any effects if the dialog's `type` is not prompt.
- returns: < [Promise]> Promise which resolves when the dialog has being accepted.
2017-07-12 00:01:58 +00:00
2017-06-27 19:15:21 +00:00
#### dialog.dismiss()
2017-07-13 22:54:37 +00:00
- returns: < [Promise]> Promise which resolves when the dialog has being dismissed.
2017-07-12 15:01:21 +00:00
2017-06-27 19:15:21 +00:00
#### dialog.message()
2017-07-13 22:54:37 +00:00
- returns: < [string]> A message displayed in the dialog.
2017-06-27 19:15:21 +00:00
2017-07-12 15:01:21 +00:00
#### dialog.type
- < [string]>
Dialog's type, could be one of the `alert` , `beforeunload` , `confirm` and `prompt` .
2017-06-27 19:15:21 +00:00
### class: Frame
2017-07-14 20:03:21 +00:00
At every point of time, page exposes its current frame tree via the [page.mainFrame() ](#pagemainframe ) and [frame.childFrames() ](#framechildframes ) methods.
[Frame] object's lifecycle is controlled by three events, dispatched on the page object:
- ['frameattached' ](#event-frameattached ) - fired when the frame gets attached to the page. Frame could be attached to the page only once.
- ['framenavigated' ](#event-framenavigated ) - fired when the frame commits navigation to a different URL.
- ['framedetached' ](#event-framedetached ) - fired when the frame gets detached from the page. Frame could be detached from the page only once.
2017-07-17 18:02:13 +00:00
An example of dumping frame tree:
```js
const {Browser} = new require('.');
const browser = new Browser({headless: true});
browser.newPage().then(async page => {
await page.navigate('https://www.google.com/chrome/browser/canary.html');
dumpFrameTree(page.mainFrame(), '');
browser.close();
function dumpFrameTree(frame, indent) {
console.log(indent + frame.url());
for (let child of frame.childFrames())
dumpFrameTree(child, indent + ' ');
}
});
```
2017-07-18 01:56:56 +00:00
#### frame.$(selector, pageFunction, ...args)
- `selector` < [string]> A selector to be matched in the page
- `pageFunction` < [function]\([Element]\)> Function to be evaluated with first element matching `selector`
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
- returns: < [Promise]< [Object]>> Promise which resolves to function return value.
#### frame.$$(selector, pageFunction, ...args)
- `selector` < [string]> A selector to be matched in the page
- `pageFunction` < [function]\([Element]\)> Function to be evaluted for every element matching `selector` .
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
- returns: < [Promise]< [Array]< [Object]>>> Promise which resolves to array of function return values.
2017-06-27 19:15:21 +00:00
#### frame.childFrames()
2017-07-13 22:54:37 +00:00
- returns: < [Array]< [Frame]>>
2017-07-14 20:51:22 +00:00
#### frame.evaluate(pageFunction, ...args)
- `pageFunction` < [function]> Function to be evaluated in browser context
2017-07-18 01:56:56 +00:00
- `...args` < ... [ string ] > Arguments to pass to `pageFunction`
2017-06-27 19:40:46 +00:00
- returns: < [Promise]< [Object]>> Promise which resolves to function return value
2017-07-13 22:54:37 +00:00
If the function, passed to the `page.evaluate` , returns a [Promise], then `page.evaluate` would wait for the promise to resolve and return it's value.
```js
const {Browser} = require('puppeteer');
const browser = new Browser();
2017-07-18 01:49:52 +00:00
browser.newPage().then(async page =>
2017-07-13 22:54:37 +00:00
const result = await page.evaluate(() => {
return Promise.resolve().then(() => 8 * 7);
});
console.log(result); // prints "56"
browser.close();
});
```
2017-06-27 19:15:21 +00:00
#### frame.isDetached()
2017-07-13 22:54:37 +00:00
- returns: < [boolean]>
Returns `true` if the frame has being detached, or `false` otherwise.
2017-06-27 19:15:21 +00:00
#### frame.isMainFrame()
2017-07-13 22:54:37 +00:00
- returns: < [boolean]>
Returns `true` is the frame is page's main frame, or `false` otherwise.
2017-06-27 19:15:21 +00:00
#### frame.name()
2017-07-13 22:54:37 +00:00
- returns: < [string]>
Returns frame's name as specified in the tag.
2017-06-27 19:15:21 +00:00
#### frame.parentFrame()
2017-07-13 22:54:37 +00:00
- returns: < [Frame]> Returns parent frame, if any. Detached frames and main frames return `null` .
2017-06-27 19:15:21 +00:00
#### frame.url()
2017-07-13 22:54:37 +00:00
- returns: < [string]>
Returns frame's url.
2017-07-07 22:39:02 +00:00
2017-07-13 22:54:37 +00:00
#### frame.waitFor(selector)
2017-07-07 22:39:02 +00:00
- `selector` < [string]> CSS selector of awaited element,
- returns: < [Promise]> Promise which resolves when element specified by selector string is added to DOM.
2017-07-13 22:54:37 +00:00
Wait for the `selector` to appear in page. If at the moment of calling
the method the `selector` already exists, the method will return
immediately.
2017-06-27 19:15:21 +00:00
### class: Request
2017-07-13 22:54:37 +00:00
2017-07-14 20:03:21 +00:00
Whenever the page sends a request, the following events are emitted by puppeteer's page:
- ['request' ](#event-request ) emitted when the request is issued by the page.
- ['response' ](#event-response ) emitted when/if the response is received for the request.
- ['requestfinished' ](#event-requestfinished ) emitted when the response body is downloaded and the request is complete.
If request fails at some point, then instead of 'requestfinished' event (and possibly instead of 'response' event), the ['requestfailed' ](#event-requestfailed ) event is emitted.
If request gets a 'redirect' response, the request is successfully finished with the 'requestfinished' event, and a new request is issued to a redirected url.
2017-07-13 22:54:37 +00:00
[Request] class represents requests which are sent by page. [Request] implements [Body] mixin, which in case of HTTP POST requests allows clients to call `request.json()` or `request.text()` to get different representations of request's body.
2017-07-12 15:01:21 +00:00
#### request.headers
- < [Headers]>
Contains the associated [Headers] object of the request.
#### request.method
- < [string]>
Contains the request's method (GET, POST, etc.)
2017-07-14 05:52:02 +00:00
#### request.response()
2017-07-13 22:54:37 +00:00
- returns: < [Response]> A matching [Response] object, or `null` if the response has not been received yet.
2017-07-14 05:52:02 +00:00
2017-07-12 15:01:21 +00:00
#### request.url
- < [string]>
Contains the URL of the request.
2017-07-07 17:34:35 +00:00
### class: Response
2017-07-12 15:01:21 +00:00
2017-07-13 22:54:37 +00:00
[Response] class represents responses which are received by page. [Response] implements [Body] mixin, which allows clients to call `response.json()` or `response.text()` to get different representations of response body.
2017-07-12 15:01:21 +00:00
#### response.headers
- < [Headers]>
Contains the [Headers] object associated with the response.
#### response.ok
- < [boolean]>
Contains a boolean stating whether the response was successful (status in the range 200-299) or not.
2017-07-14 05:52:02 +00:00
#### response.request()
2017-07-13 22:54:37 +00:00
- returns: < [Request]> A matching [Request] object.
2017-07-12 15:01:21 +00:00
#### response.status
- < [number]>
Contains the status code of the response (e.g., 200 for a success).
#### response.statusText
- < [string]>
Contains the status message corresponding to the status code (e.g., OK for 200).
2017-07-14 05:52:02 +00:00
2017-07-12 15:01:21 +00:00
#### response.url
- < [string]>
Contains the URL of the response.
2017-07-14 05:52:02 +00:00
2017-07-07 17:34:35 +00:00
### class: InterceptedRequest
2017-07-12 15:01:21 +00:00
2017-07-13 22:54:37 +00:00
[InterceptedRequest] represents an intercepted request, which can be mutated and either continued or aborted. [InterceptedRequest] which is not continued or aborted will be in a 'hanging' state.
2017-07-14 05:52:02 +00:00
#### interceptedRequest.abort()
2017-07-13 22:54:37 +00:00
Aborts request.
2017-07-14 05:52:02 +00:00
#### interceptedRequest.continue()
2017-07-13 22:54:37 +00:00
Continues request.
2017-07-12 15:01:21 +00:00
#### interceptedRequest.headers
- < [Headers]>
2017-07-18 01:49:52 +00:00
Contains the [Headers] object associated with the request.
2017-07-13 22:54:37 +00:00
Headers could be mutated with the `headers.append` , `headers.set` and other
methods. Must not be changed in response to an authChallenge.
2017-07-12 15:01:21 +00:00
2017-07-14 05:52:02 +00:00
#### interceptedRequest.isHandled()
2017-07-13 22:54:37 +00:00
- returns: < [boolean]> returns `true` if either `abort` or `continue` was called on the object. Otherwise, returns `false` .
2017-07-14 05:52:02 +00:00
2017-07-12 15:01:21 +00:00
#### interceptedRequest.method
- < [string]>
2017-07-18 01:49:52 +00:00
Contains the request's method (GET, POST, etc.)
2017-07-12 15:01:21 +00:00
2017-07-13 22:54:37 +00:00
If set this allows the request method to be overridden. Must not be changed in response to an authChallenge.
2017-07-12 15:01:21 +00:00
#### interceptedRequest.postData
- < [string]>
2017-07-13 22:54:37 +00:00
Contains `POST` data for `POST` requests.
`request.postData` is mutable and could be written to. Must not be changed in response to an authChallenge.
2017-07-12 15:01:21 +00:00
2017-07-14 05:52:02 +00:00
#### interceptedRequest.url
- < [string]>
2017-07-13 22:54:37 +00:00
If changed, the request url will be modified in a way that's not observable by page. Must not be changed in response to an authChallenge.
2017-07-07 17:34:35 +00:00
### class: Headers
2017-07-12 00:01:58 +00:00
#### headers.append(name, value)
- `name` < [string]> Case-insensetive header name.
- `value` < [string]> Header value
If there's already a header with name `name` , the header gets overwritten.
#### headers.delete(name)
- `name` < [string]> Case-insensetive name of the header to be deleted. If there's no header with such name, the method does nothing.
2017-07-07 17:34:35 +00:00
#### headers.entries()
2017-07-13 22:54:37 +00:00
- returns: < [iterator]> An iterator allowing to go through all key/value pairs contained in this object. Both the key and value of each pairs are [string] objects.
2017-07-12 00:01:58 +00:00
#### headers.get(name)
- `name` < [string]> Case-insensetive name of the header.
- returns: < [string]> Header value of `null` , if there's no such header.
#### headers.has(name)
- `name` < [string]> Case-insensetive name of the header.
- returns: < [boolean]> Returns `true` if the header with such name exists, or `false` otherwise.
2017-07-07 17:34:35 +00:00
#### headers.keys()
2017-07-13 22:54:37 +00:00
- returns: < [iterator]> an iterator allowing to go through all keys contained in this object. The keys are [string] objects.
2017-07-12 00:01:58 +00:00
#### headers.set(name, value)
- `name` < [string]> Case-insensetive header name.
- `value` < [string]> Header value
If there's already a header with name `name` , the header gets overwritten.
2017-07-07 17:34:35 +00:00
#### headers.values()
2017-07-13 22:54:37 +00:00
- returns: < [iterator]< [string]>> Returns an iterator allowing to go through all values contained in this object. The values are [string] objects.
2017-07-07 17:34:35 +00:00
### class: Body
#### body.arrayBuffer()
2017-07-13 22:54:37 +00:00
- returns: < Promise <[ ArrayBuffer ] > >
2017-07-14 06:11:39 +00:00
#### body.bodyUsed
2017-07-13 22:54:37 +00:00
- returns: < [boolean]>
2017-07-07 17:34:35 +00:00
#### body.buffer()
2017-07-13 22:54:37 +00:00
- returns: < Promise <[ Buffer ] > >
2017-07-07 17:34:35 +00:00
#### body.json()
2017-07-13 22:54:37 +00:00
- returns: < Promise <[ Object ] > >
2017-07-07 17:34:35 +00:00
#### body.text()
2017-07-13 22:54:37 +00:00
- returns: < Promise <[ text ] > >
2017-06-21 18:17:35 +00:00
[Array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array "Array"
2017-07-13 22:54:37 +00:00
[ArrayBuffer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer "ArrayBuffer"
2017-06-21 18:17:35 +00:00
[boolean]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Boolean_type "Boolean"
[Buffer]: https://nodejs.org/api/buffer.html#buffer_class_buffer "Buffer"
[function]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function "Function"
[number]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Number_type "Number"
[Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object "Object"
[Page]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page "Page"
2017-07-12 15:01:21 +00:00
[Headers]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-headers "Headers"
2017-07-12 00:07:06 +00:00
[InterceptedRequest]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-interceptedrequest "Page"
2017-06-21 18:17:35 +00:00
[Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise "Promise"
[string]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#String_type "String"
2017-07-13 22:54:37 +00:00
[stream.Readable]: https://nodejs.org/api/stream.html#stream_class_stream_readable "stream.Readable"
[Frame]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-frame "Frame"
[iterator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols "Iterator"
[Response]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-response "Response"
[Request]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-request "Request"
[Browser]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-browser "Browser"
[Body]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-body "Body"
2017-07-18 01:56:56 +00:00
[Element]: https://developer.mozilla.org/en-US/docs/Web/API/element "Element"
2017-07-18 01:49:52 +00:00
[Keyboard]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-keyboard "Keyboard"
2017-07-14 20:03:21 +00:00
[Dialog]: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-dialog "Dialog"