Released APIs: v1.1.1 | v1.1.0 | v1.0.0 | v0.13.0 | v0.12.0 | v0.11.0 | v0.10.2 | v0.10.1 | v0.10.0 | v0.9.0
Puppeteer API v1.1.1-post **NOT RELEASED**
NOTE 此版本的API 预计将会发布 于2018年3月15日.
Table of Contents
- Overview
- Environment Variables
- class: Puppeteer
- puppeteer.connect(options)
- puppeteer.createBrowserFetcher([options])
- puppeteer.defaultArgs()
- puppeteer.executablePath()
- puppeteer.launch([options])
- class: BrowserFetcher
- browserFetcher.canDownload(revision)
- browserFetcher.download(revision[, progressCallback])
- browserFetcher.localRevisions()
- browserFetcher.platform()
- browserFetcher.remove(revision)
- browserFetcher.revisionInfo(revision)
- class: Browser
- event: 'disconnected'
- event: 'targetchanged'
- event: 'targetcreated'
- event: 'targetdestroyed'
- browser.close()
- browser.disconnect()
- browser.newPage()
- browser.pages()
- browser.process()
- browser.targets()
- browser.userAgent()
- browser.version()
- browser.wsEndpoint()
- class: Page
- event: 'console'
- event: 'dialog'
- event: 'domcontentloaded'
- event: 'error'
- event: 'frameattached'
- event: 'framedetached'
- event: 'framenavigated'
- event: 'load'
- event: 'metrics'
- event: 'pageerror'
- event: 'request'
- event: 'requestfailed'
- event: 'requestfinished'
- event: 'response'
- page.$(selector)
- page.$$(selector)
- page.$$eval(selector, pageFunction[, ...args])
- page.$eval(selector, pageFunction[, ...args])
- page.$x(expression)
- page.addScriptTag(options)
- page.addStyleTag(options)
- page.authenticate(credentials)
- page.bringToFront()
- page.click(selector[, options])
- page.close()
- page.content()
- page.cookies(...urls)
- page.coverage
- page.deleteCookie(...cookies)
- page.emulate(options)
- page.emulateMedia(mediaType)
- page.evaluate(pageFunction, ...args)
- page.evaluateHandle(pageFunction, ...args)
- page.evaluateOnNewDocument(pageFunction, ...args)
- page.exposeFunction(name, puppeteerFunction)
- page.focus(selector)
- page.frames()
- page.goBack(options)
- page.goForward(options)
- page.goto(url, options)
- page.hover(selector)
- page.keyboard
- page.mainFrame()
- page.metrics()
- page.mouse
- page.pdf(options)
- page.queryObjects(prototypeHandle)
- page.reload(options)
- page.screenshot([options])
- page.select(selector, ...values)
- page.setCacheEnabled(enabled)
- page.setContent(html)
- page.setCookie(...cookies)
- page.setDefaultNavigationTimeout(timeout)
- page.setExtraHTTPHeaders(headers)
- page.setJavaScriptEnabled(enabled)
- page.setOfflineMode(enabled)
- page.setRequestInterception(value)
- page.setUserAgent(userAgent)
- page.setViewport(viewport)
- page.tap(selector)
- page.target()
- page.title()
- page.touchscreen
- page.tracing
- page.type(selector, text[, options])
- page.url()
- page.viewport()
- page.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
- page.waitForFunction(pageFunction[, options[, ...args]])
- page.waitForNavigation(options)
- page.waitForSelector(selector[, options])
- page.waitForXPath(xpath[, options])
- class: Keyboard
- keyboard.down(key[, options])
- keyboard.press(key[, options])
- keyboard.sendCharacter(char)
- keyboard.type(text, options)
- keyboard.up(key)
- class: Mouse
- mouse.click(x, y, [options])
- mouse.down([options])
- mouse.move(x, y, [options])
- mouse.up([options])
- class: Touchscreen
- touchscreen.tap(x, y)
- class: Tracing
- tracing.start(options)
- tracing.stop()
- class: Dialog
- dialog.accept([promptText])
- dialog.defaultValue()
- dialog.dismiss()
- dialog.message()
- dialog.type()
- class: ConsoleMessage
- consoleMessage.args()
- consoleMessage.text()
- consoleMessage.type()
- class: Frame
- frame.$(selector)
- frame.$$(selector)
- frame.$$eval(selector, pageFunction[, ...args])
- frame.$eval(selector, pageFunction[, ...args])
- frame.$x(expression)
- frame.addScriptTag(options)
- frame.addStyleTag(options)
- frame.childFrames()
- frame.click(selector[, options])
- frame.content()
- frame.evaluate(pageFunction, ...args)
- frame.evaluateHandle(pageFunction, ...args)
- frame.executionContext()
- frame.focus(selector)
- frame.hover(selector)
- frame.isDetached()
- frame.name()
- frame.parentFrame()
- frame.select(selector, ...values)
- frame.setContent(html)
- frame.tap(selector)
- frame.title()
- frame.type(selector, text[, options])
- frame.url()
- frame.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
- frame.waitForFunction(pageFunction[, options[, ...args]])
- frame.waitForSelector(selector[, options])
- frame.waitForXPath(xpath[, options])
- class: ExecutionContext
- executionContext.evaluate(pageFunction, ...args)
- executionContext.evaluateHandle(pageFunction, ...args)
- executionContext.frame()
- executionContext.queryObjects(prototypeHandle)
- class: JSHandle
- jsHandle.asElement()
- jsHandle.dispose()
- jsHandle.executionContext()
- jsHandle.getProperties()
- jsHandle.getProperty(propertyName)
- jsHandle.jsonValue()
- class: ElementHandle
- elementHandle.$(selector)
- elementHandle.$$(selector)
- elementHandle.$x(expression)
- elementHandle.asElement()
- elementHandle.boundingBox()
- elementHandle.click([options])
- elementHandle.contentFrame()
- elementHandle.dispose()
- elementHandle.executionContext()
- elementHandle.focus()
- elementHandle.getProperties()
- elementHandle.getProperty(propertyName)
- elementHandle.hover()
- elementHandle.jsonValue()
- elementHandle.press(key[, options])
- elementHandle.screenshot([options])
- elementHandle.tap()
- elementHandle.toString()
- elementHandle.type(text[, options])
- elementHandle.uploadFile(...filePaths)
- class: Request
- request.abort([errorCode])
- request.continue([overrides])
- request.failure()
- request.frame()
- request.headers()
- request.method()
- request.postData()
- request.resourceType()
- request.respond(response)
- request.response()
- request.url()
- class: Response
- response.buffer()
- response.fromCache()
- response.fromServiceWorker()
- response.headers()
- response.json()
- response.ok()
- response.request()
- response.securityDetails()
- response.status()
- response.text()
- response.url()
- class: SecurityDetails
- securityDetails.issuer()
- securityDetails.protocol()
- securityDetails.subjectName()
- securityDetails.validFrom()
- securityDetails.validTo()
- class: Target
- target.createCDPSession()
- target.page()
- target.type()
- target.url()
- class: CDPSession
- cdpSession.detach()
- cdpSession.send(method[, params])
- class: Coverage
- coverage.startCSSCoverage(options)
- coverage.startJSCoverage(options)
- coverage.stopCSSCoverage()
- coverage.stopJSCoverage()
Overview
Puppeteer是一个Node库,它提供了一个高级API来通过DevTools协议控制Chromium或Chrome。
Puppeteer API是分层次的,反映了浏览器结构。
Puppeteer
使用浏览器进行通信 DevTools Protocol.Browser
实例可以拥有多个页面。Page
至少有一个框架:主框架。 可能有其他框架由创建 iframe or frame tags.Frame
至少有一个执行上下文 - 默认执行上下文 - 执行框架的JavaScript。 一个框架可能有其他与之相关的执行上下文 extensions.
(图源: link)
环境变量
Puppeteer 寻找某些环境变量 以帮助其运作。这些变量既可以在环境中设置,也可以在 npm config.
HTTP_PROXY
,HTTPS_PROXY
,NO_PROXY
- 定义用于下载和运行Chromium的HTTP代理设置。PUPPETEER_SKIP_CHROMIUM_DOWNLOAD
- 请勿在安装步骤中下载捆绑的Chromium。PUPPETEER_DOWNLOAD_HOST
- 覆盖用于下载Chromium的URL的主机部分
class: Puppeteer
Puppeteer模块提供了一种启动Chromium实例的方法。 以下是使用Puppeteer驱动自动化的典型示例:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.goto('https://www.google.com');
// other actions...
await browser.close();
});
puppeteer.connect(options)
options
- returns:
>
此方法将Puppeteer添加到现有的Chromium实例。
puppeteer.createBrowserFetcher([options])
options
- returns:
puppeteer.defaultArgs()
- returns:
> Chromium将与之一起启动的默认标志。
puppeteer.executablePath()
- returns:
Puppeteer希望找到捆绑的Chromium的路径。如果使用[ PUPPETEER_SKIP_CHROMIUM_DOWNLOAD
]跳过下载,那么Chromium可能不存在(#environment-variables).
puppeteer.launch([options])
options
- returns:
> 承诺解决浏览器实例。
该方法启动具有给定参数的浏览器实例。当父节点node.js进程关闭时,浏览器将被关闭。
NOTE Puppeteer也可以用来控制Chrome浏览器,但它与捆绑在一起的Chromium版本效果最好。 不能保证它可以与任何其他版本一起使用。极其谨慎地使用
executablePath
选项。如果Google Chrome(而不是Chromium)是首选的, Chrome Canary或Dev Channel版本
In puppeteer.launch([options]) above, any mention of Chromium 也适用于 Chrome.
See
this article
了解Chromium和Chrome之间的区别。This article
描述了Linux用户的一些差异。
class: BrowserFetcher
BrowserFetcher可以下载和管理不同版本的Chromium。
BrowserFetcher在指定精确版本的Chromium的修订字符串上运行,例如, "533271"
. 修订字符串可以从中获得 omahaproxy.appspot.com.
有关如何使用BrowserFetcher下载特定版本的Chromium并运行的示例
const browserFetcher = puppeteer.createBrowserFetcher();
const revisionInfo = await browserFetcher.download('533271');
const browser = await puppeteer.launch({executablePath: revisionInfo.executablePath})
NOTE BrowserFetcher不适用于与共享相同下载目录的其他BrowserFetcher实例同时使用。
browserFetcher.canDownload(revision)
revision
一个检查可用性的修订。 - returns:
> 如果可以从主机下载修订版,则返回 true
。
该方法启动一个HEAD请求来检查修订版是否可用。
browserFetcher.download(revision[, progressCallback])
revision
下载修订。 progressCallback
将用两个参数调用的函数: downloadedBytes
已经下载了多少字节 totalBytes
总下载量有多大。
- returns:
> 下载并提取修订版时解决修订信息 revision
信息创建的修订版本 folderPath
提取的修订文件夹的路径 executablePath
修订可执行文件的路径 url
这个版本的URL可以从中下载 local
修订版是否在本地可用磁盘上
该方法启动一个GET请求以从主机下载修订版本。
browserFetcher.localRevisions()
- returns:
>> 磁盘上本地可用的所有修订的列表。
browserFetcher.platform()
- returns:
返回 mac
,linux
,win32
或win64
中的一个。
browserFetcher.remove(revision)
revision
修改删除。 如果尚未下载修订版,该方法将抛出。 - returns:
在修订版本被删除时解决。
browserFetcher.revisionInfo(revision)
revision
修改以获取信息。 - returns:
revision
信息创建的修订版本 folderPath
提取的修订文件夹的路径 executablePath
修订可执行文件的路径 url
这个版本的URL可以从中下载 local
修订版是否在本地可用磁盘上
class: Browser
- extends:
EventEmitter
当Puppeteer连接到Chromium实例时创建浏览器, 通过 puppeteer.launch
or puppeteer.connect
.
使用Browser创建Page的示例:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();
});
断开连接并重新连接到Browser的示例:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
// Store the endpoint to be able to reconnect to Chromium
const browserWSEndpoint = browser.wsEndpoint();
// Disconnect puppeteer from Chromium
browser.disconnect();
// Use the endpoint to reestablish a connection
const browser2 = await puppeteer.connect({browserWSEndpoint});
// Close Chromium
await browser2.close();
});
event: 'disconnected'
当Puppeteer与Chromium实例断开连接时发出。 这可能由于以下原因而发生:
- Chromium 已关闭或坠毁
- 该
browser.disconnect
方法被调用
event: 'targetchanged'
Emitted 当目标的网址发生变化时。
event: 'targetcreated'
Emitted 当一个目标被创建时,例如当一个新页面被打开时 window.open
or browser.newPage
.
event: 'targetdestroyed'
Emitted 当一个目标被破坏时,例如当一个页面关闭时。
browser.close()
- returns:
关闭 Chromium及其所有页面(如果有的话)被打开。 该 Browser 对象本身被认为是 disposed 不能再使用了.
browser.disconnect()
将浏览器中的Puppeteer断开连接,但Chromium进程仍在运行。在调用disconnect
后,Browser对象被认为已经处理掉,不能再使用了。
browser.newPage()
- returns:
> 承诺解决一个新的Page对象。
browser.pages()
- returns:
>> Promise解析为所有打开页面的数组。
browser.process()
- returns: 产生的浏览器进程。 如果浏览器实例是使用
puppeteer.connect
方法创建的,则返回null
。
browser.targets()
- returns:
> 所有活动目标的数组。
browser.userAgent()
- returns:
> 承诺将解析为浏览器的原始用户代理。
NOTE 页面可以覆盖浏览器用户代理 page.setUserAgent
browser.version()
- returns:
> 对于 headless Chromium, 这与之类似 HeadlessChrome/61.0.3153.0
. 对于 non-headless, 这与之类似Chrome/61.0.3153.0
.
NOTE browser.version()的格式可能会随着未来版本的Chromium而改变。
browser.wsEndpoint()
- returns:
浏览器websocket网址。
可用作参数的浏览器websocket端点 puppeteer.connect. 格式是 ws://${host}:${port}/devtools/browser/
你可以找到 webSocketDebuggerUrl
从 http://${host}:${port}/json/version
. 了解更多关于 devtools protocol 和 browser endpoint.
class: Page
- extends:
EventEmitter
页面提供了与Chromium中的单个选项卡进行交互的方法。 一个Browser实例可能有多个Page实例。
本示例创建一个页面,将其导航到一个URL,然后保存截图:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'screenshot.png'});
await browser.close();
});
Page类发出各种事件(如下所述),可以使用Node的任何本机进行处理 EventEmitter
方法, such as on
or once
.
这个例子记录了单个页面load
事件的消息:
page.once('load', () => console.log('Page loaded!'));
event: 'console'
当页面内的JavaScript调用控制台API方法之一时发出,例如 console.log
or console.dir
. 如果页面抛出错误或警告,也会发出。
传递给console.log
的参数显示为事件处理函数的参数。
处理console
事件的一个例子:
page.on('console', msg => {
for (let i = 0; i < msg.args().length; ++i)
console.log(`${i}: ${msg.args()[i]}`);
});
page.evaluate(() => console.log('hello', 5, {foo: 'bar'}));
event: 'dialog'
当出现JavaScript对话框时发出, such as alert
, prompt
, confirm
or beforeunload
. Puppeteer 可以通过Dialog的回应对话 accept or dismiss methods.
event: 'domcontentloaded'
当JavaScript发出时 DOMContentLoaded
事件被派遣。
event: 'error'
页面崩溃时发出。
NOTE
error
事件在节点中有特殊的含义, see error events for details.
event: 'frameattached'
当连接框架时发射。
event: 'framedetached'
当框架分离时发射。
event: 'framenavigated'
Emitted当一个框架被导航到一个新的url。
event: 'load'
Emitted 当JavaScript load
事件被 调度.
event: 'metrics'
title
标题传递给 console.timeStamp
.metrics
包含指标作为键/值对的对象。 度量值的值是 类型。
Emitted 当JavaScript代码调用时 console.timeStamp
. 有关度量标准的列表 see page.metrics
.
event: 'pageerror'
异常消息
在页面内发生未捕获的异常时发出。
event: 'request'
当页面发出请求时发出。 request对象是只读的。 为了拦截和改变请求, see page.setRequestInterception
.
event: 'requestfailed'
当请求失败时,例如通过超时发送.
event: 'requestfinished'
当请求成功完成时发出。
event: 'response'
收到Response时发出。
page.$(selector)
selector
一个selector查询页面 - returns:
>
该方法在页面内运行document.querySelector
。如果没有元素匹配选择器,则返回值解析为null
。
快捷键 page.mainFrame().$(selector).
page.$$(selector)
selector
一个selector查询页面 - returns:
>>
该方法运行 document.querySelectorAll
在页面内. 如果没有元素匹配选择器, 返回值解析为[]
。
Shortcut for page.mainFrame().$$(selector).
page.$$eval(selector, pageFunction[, ...args])
selector
一个selector来查询帧frame pageFunction
在浏览器上下文中求值函数 ...args
<...Serializable|JSHandle> 传递给pageFunction
的参数- returns:
> Promise解析为 pageFunction
的返回值
该方法在页面内运行document.querySelectorAll
,并将其作为第一个参数传递给pageFunction
。
如果pageFunction
返回Promise,那么page.$$eval
将等待承诺解析并返回它的值。
例子:
const divsCounts = await page.$$eval('div', divs => divs.length);
page.$eval(selector, pageFunction[, ...args])
selector
一个selector查询页面page pageFunction
在浏览器上下文中求值函数 ...args
<...Serializable|JSHandle> 传递给pageFunction
的参数- returns:
> Promise解析为 pageFunction
的返回值
该方法在页面内运行document.querySelector
,并将其作为第一个参数传递给pageFunction
。 如果没有与selector
匹配的元素,则该方法将引发错误。
如果pageFunction
返回一个Promise,那么page.$eval
会等待承诺解析并返回它的值。
Examples:
const searchValue = await page.$eval('#search', el => el.value);
const preloadHref = await page.$eval('link[rel=preload]', el => el.href);
const html = await page.$eval('.main-container', e => e.outerHTML);
快捷键page.mainFrame().$eval(selector, pageFunction).
page.$x(expression)
expression
Expression to evaluate. - returns:
>>
该方法评估XPath表达式。
快捷键 page.mainFrame().$x(expression)
page.addScriptTag(options)
options
url
要添加的脚本的URL。 path
将JavaScript文件注入frame的路径. 如果 path
是相对路径,则相对于current working directory.content
被注入框架 的 原始的JavaScript内容 .
- returns:
> 当脚本的onload触发或者脚本内容被注入到框架中时,它解析为添加的标记。
将标签添加到具有所需网址或内容的页面中。
快捷键 page.mainFrame().addScriptTag(options).
page.addStyleTag(options)
options
url
标签的URL。
path
将CSS文件注入frame的路径。 如果 path
是一个相对路径,那么它相对于它被解析current working directory.content
被注入框架 的 原始的 Css 内容 .
- returns:
> 当样式表的onload被触发时或CSS内容被注入到框架中时,它解析为添加的标签。
添加一个 使用所需的网址标记到网页中 或 一个
标记内容。
快捷键 page.mainFrame().addStyleTag(options).
page.authenticate(credentials)
credentials
username
password
- returns:
提供凭据 http authentication.
禁用身份验证, 传递 null
.
page.bringToFront()
- returns:
将页面导向前(激活标签)。
page.click(selector[, options])
selector
selector搜索要单击的元素。如果有多个元素满足选择器,则会首先点击。 options
button
left
,right
, ormiddle
, 默认为left
.clickCount
默认为 1. See UIEvent.detail. delay
在毫秒内在 mousedown
和mouseup
之间等待的时间。 默认为 0.
- returns:
当匹配 selector
的元素被成功的点击时,Promise会解析。 如果没有匹配selector
的元素,Promise将被拒绝。
此方法使用selector
获取元素,如果需要将其滚动到视图中,然后使用page.mouse单击元素的中心。 如果没有与selector
匹配的元素,则该方法将引发错误。
请记住,如果click()
触发一个导航事件,并且有一个单独的page.waitForNavigation()
承诺被解析,那么最终可能会导致竞争条件,从而产生意想不到的结果。 点击和等待导航的正确模式如下:
const [response] = await Promise.all([
page.waitForNavigation(waitOptions),
page.click(selector, clickOptions),
]);
快捷键page.mainFrame().click(selector[, options]).
page.close()
- returns:
page.content()
- returns:
>
获取页面的完整HTML内容,包括文档类型。
page.cookies(...urls)
...urls
<...string>- returns:
>> name
value
domain
path
expires
Unix time in seconds. httpOnly
secure
session
sameSite
"Strict"
or"Lax"
.
如果未指定URL,则此方法返回当前页面URL的Cookie。 如果指定了URL,则仅返回这些URL的Cookie。
page.coverage
- returns:
page.deleteCookie(...cookies)
...cookies
<...Object>name
required url
domain
path
secure
- returns:
page.emulate(options)
options
viewport
width
页面宽度(像素)。 height
页面高度(按像素)。 deviceScaleFactor
指定设备缩放因子(可以认为是dpr)。默认为 1
.isMobile
是否考虑了 meta viewport
标签。 默认为false
.hasTouch
指定视口是否支持触摸事件. 默认为 false
isLandscape
指定视口是否处于横向模式. 默认为 false
.
userAgent
- returns:
仿真给定的设备指标和用户代理. 此方法是调用两种方法的捷径:
- page.setUserAgent(userAgent)
- page.setViewport(viewport)
为了辅助仿真,puppeteer提供了可以通过require('puppeteer / DeviceDescriptors')
命令获得的设备描述符列表。 下面是一个在puppeteer中模拟iPhone 6的例子:
const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');
const iPhone = devices['iPhone 6'];
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.emulate(iPhone);
await page.goto('https://www.google.com');
// other actions...
await browser.close();
});
源代码中提供了所有可用设备的列表: DeviceDescriptors.js.
page.emulateMedia(mediaType)
mediaType
更改页面的CSS媒体类型. 唯一允许的值是'screen'
,'print'
和null
. 传递null
将禁用媒体仿真。- returns:
page.evaluate(pageFunction, ...args)
pageFunction
要在页面上下文中求值的函数 ...args
<...Serializable|JSHandle> 传递给pageFunction
的参数- returns:
> Promise解析为 pageFunction
的返回值
如果传递给page.evaluate
的函数返回一个Promise,那么page.evaluate
将等待承诺解析并返回它的值。
如果传递给page.evaluate
的函数返回一个非Serializable值,那么page.evaluate
将解析为undefined
。
传递参数给 pageFunction
:
const result = await page.evaluate(x => {
return Promise.resolve(8 * x);
}, 7);
console.log(result); // prints "56"
一个字符串也可以传入而不是一个函数:
console.log(await page.evaluate('1 + 2')); // prints "3"
const x = 10;
console.log(await page.evaluate(`1 + ${x}`)); // prints "11"
ElementHandle实例可以作为参数传递给page.evaluate
:
const bodyHandle = await page.$('body');
const html = await page.evaluate(body => body.innerHTML, bodyHandle);
await bodyHandle.dispose();
快捷键 page.mainFrame().evaluate(pageFunction, ...args).
page.evaluateHandle(pageFunction, ...args)
pageFunction
要在页面上下文中评估的函数 ...args
<...Serializable|JSHandle> 传递给pageFunction
的参数- returns:
> Promise以 pageFunction
的返回值作为页内对象(JSHandle)
page.evaluate
和page.evaluateHandle
唯一的区别在于page.evaluateHandle
返回页内对象(JSHandle)。
如果传递给page.evaluateHandle
的函数返回一个Promise,那么page.evaluateHandle
将等待承诺解析并返回它的值。
一个字符串也可以传入而不是一个函数:
const aHandle = await page.evaluateHandle('document'); // Handle for the 'document'
JSHandle实例可以作为参数传递给page.evaluateHandle
:
const aHandle = await page.evaluateHandle(() => document.body);
const resultHandle = await page.evaluateHandle(body => body.innerHTML, aHandle);
console.log(await resultHandle.jsonValue());
await resultHandle.dispose();
快捷键page.mainFrame().executionContext().evaluateHandle(pageFunction, ...args).
page.evaluateOnNewDocument(pageFunction, ...args)
pageFunction
在浏览器上下文中评估函数 ...args
<...Serializable> 传递给pageFunction
的参数- returns:
添加一个将在下列情况之一中调用的函数:
- 每当页面被导航时
- 每当子框架被附加或导航时。在这种情况下,函数在新连接的帧的上下文中调用
该函数在创建文档之后但在其任何脚本运行之前被调用。 这对修改JavaScript环境很有用,例如 to seed Math.random
.
在加载页面之前覆盖navigator.languages属性的示例:
// preload.js
// overwrite the `languages` property to use a custom getter
Object.defineProperty(navigator, "languages", {
get: function() {
return ["en-US", "en", "bn"];
}
});
// In your puppeteer script, assuming the preload.js file is in same folder of our script
const preloadFile = fs.readFileSync('./preload.js', 'utf8');
await page.evaluateOnNewDocument(preloadFile);
page.exposeFunction(name, puppeteerFunction)
name
Name of the function on the window object puppeteerFunction
Callback function which will be called in Puppeteer's context. - returns:
该方法在页面的window
对象上添加一个名为name
的函数。 当被调用时,函数在node.js中执行puppeteerFunction
,并返回一个Promise,它解析为puppeteerFunction
的返回值。
如果puppeteerFunction返回一个Promise,它将被等待。
NOTE 通过
page.exposeFunction
安装的函数 survive navigations.
在页面中添加一个md5
函数的例子:
const puppeteer = require('puppeteer');
const crypto = require('crypto');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
page.on('console', msg => console.log(msg.text()));
await page.exposeFunction('md5', text =>
crypto.createHash('md5').update(text).digest('hex')
);
await page.evaluate(async () => {
// use window.md5 to compute hashes
const myString = 'PUPPETEER';
const myHash = await window.md5(myString);
console.log(`md5 of ${myString} is ${myHash}`);
});
await browser.close();
});
在页面中添加一个window.readfile
函数的例子:
const puppeteer = require('puppeteer');
const fs = require('fs');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
page.on('console', msg => console.log(msg.text()));
await page.exposeFunction('readfile', async filePath => {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, text) => {
if (err)
reject(err);
else
resolve(text);
});
});
});
await page.evaluate(async () => {
// use window.readfile to read contents of a file
const content = await window.readfile('/etc/hosts');
console.log(content);
});
await browser.close();
});
page.focus(selector)
selector
要聚焦的元素的selector。 如果有多个元素满足选择器,则第一个将被聚焦。 - returns:
当匹配 selector
的元素被成功聚焦时,Promise会解析。 如果没有匹配selector
的元素,Promise将被拒绝。
此方法使用selector
获取元素并将其聚焦。 如果没有与selector
匹配的元素,则该方法将引发错误。
快捷键 page.mainFrame().focus(selector).
page.frames()
- returns:
> 连接到页面的所有框架的数组。
page.goBack(options)
options
导航参数可能具有以下属性: timeout
最大导航时间,以毫秒为单位, 默认为30秒, 通过 0
来禁用超时。 默认值可以通过使用 page.setDefaultNavigationTimeout(timeout) method.waitUntil
> 何时考虑导航成功, 默认为 load
. 给定一组事件字符串,导航在所有事件被触发后被认为是成功的。事件也可以是:load
- 考虑在load
事件被触发时导航结束。domcontentloaded
- 考虑在DOMContentLoaded
事件被触发时导航完成。networkidle0
- 当网络连接数量不超过0个网络连接的时间至少为500
毫秒时,请考虑导航完成。networkidle2
- 当网络连接数不超过2个时,导航至少需要500
秒。
- returns:
> Promise解决主要资源响应。 在多重重定向的情况下,导航将通过最后重定向的响应来解决。如果不能返回,则解析为 null
。
导航到历史记录中的上一页。
page.goForward(options)
options
导航参数可能具有以下属性: timeout
最大导航时间以毫秒为单位,默认为30秒,通过 0
来禁用超时。 可以使用page.setDefaultNavigationTimeout(timeout)方法更改默认值。waitUntil
> 何时考虑导航成功,默认为 load
。 给定一组事件字符串,导航在所有事件被触发后被认为是成功的。Events can be either:load
- 考虑在load
事件被触发时导航结束。domcontentloaded
- 考虑在DOMContentLoaded
事件被触发时导航完成。networkidle0
- 当网络连接数量不超过0个网络连接的时间至少为500
毫秒时,请考虑导航完成。networkidle2
- 当网络连接数不超过2个时,导航至少需要500
秒。
- returns:
> 承诺解决主要资源响应。 在多重重定向的情况下,导航将通过最后重定向的响应来解决。如果
导航到历史中的下一页。
page.goto(url, options)
url
将页面导航到的URL。, e.g. https://
.options
导航参数可能具有以下属性: timeout
最大导航时间,以毫秒为单位, 默认为30秒, 通过 0
来禁用超时. 默认值可以通过使用 page.setDefaultNavigationTimeout(timeout) 方法.waitUntil
> 何时考虑导航成功, 默认为 load
. 给定一组事件字符串,导航在所有事件被触发后被认为是成功的. Events can be either:load
- 考虑在load事件被触发时导航结束。domcontentloaded
- 考虑在DOMContentLoaded
事件被触发时导航完成。networkidle0
- 当网络连接数量不超过0个网络连接的时间至少为500
毫秒时,请考虑导航完成。networkidle2
- consider navigation to be finished when there are no more than 2 network connections for at least500
ms.
- returns:
> 承诺解决主要资源响应。在多重重定向的情况下,导航将通过最后重定向的响应来解决。
如果出现以下情况,page.goto
将会抛出一个错误:
- 存在SSL错误(例如,在自签名证书的情况下)。
- 目标网址无效。
- 在导航过程中会超出
timeout
。 - 主资源加载失败。
NOTE
page.goto
或者抛出或返回主资源响应。 唯一的例外是导航到about:blank
,这将成功并返回null
.
NOTE 无头模式不支持导航到PDF文档。 See the upstream issue.
page.hover(selector)
selector
selector搜索要悬停的元素。如果有多个元素满足选择器,则第一个元素将被徘徊。 - returns:
当匹配 selector
的元素成功执行时,Promise会解析。 如果没有匹配selector
的元素,Promise将被拒绝。
此方法使用selector
获取元素,如果需要将其滚动到视图中,然后使用page.mouse将鼠标悬停在元素的中心。 如果没有与selector
匹配的元素,则该方法将引发错误。
快捷键 page.mainFrame().hover(selector).
page.keyboard
- returns:
page.mainFrame()
- returns: 返回页面的主框架。
页面保证具有在导航过程中持续存在的主框架。
page.metrics()
- returns:
> 包含指标作为键/值对的对象。 Timestamp
采集指标样本时的时间戳。 Documents
页面中的文档数量。 Frames
页面中的帧数。 JSEventListeners
页面中的事件数量。 Nodes
页面中DOM节点的数量。 LayoutCount
完整或部分页面布局的总数。 RecalcStyleCount
总页数风格重新计算。 LayoutDuration
所有页面布局的合并持续时间。 RecalcStyleDuration
所有页面样式重新计算的组合持续时间。 ScriptDuration
JavaScript执行的组合持续时间。 TaskDuration
浏览器执行的所有任务的合并持续时间。 JSHeapUsedSize
使用JavaScript堆大小。 JSHeapTotalSize
总的JavaScript堆大小。
NOTE 所有时间戳都是单调时间:从过去的任意点开始,以秒为单位的单调递增时间。
page.mouse
- returns:
page.pdf(options)
options
选项对象可能具有以下属性: path
保存PDF的文件路径。 如果 path
是相对路径,则相对于current working directory. 如果未提供路径,则PDF将不会保存到磁盘。scale
网页渲染的比例。 默认为 1
.displayHeaderFooter
显示页眉和页脚。 默认为 false
.headerTemplate
打印头的HTML模板。 应该是有效的HTML标记,以下类用于向它们中注入打印值: date
格式化的打印日期title
文件名url
文件位置pageNumber
当前页码totalPages
文档中的总页数
footerTemplate
打印页脚的HTML模板。 应该使用与 headerTemplate
相同的格式。printBackground
打印背景图形。 默认为 false
.landscape
纸张方向。 默认为 false
.pageRanges
要打印的纸张范围, '1-5, 8, 11-13'. 默认为空字符串,这意味着打印所有页面。 format
纸张格式。 如果设置,则优先于 width
orheight
选项。 默认为 'Letter'.width
纸张宽度,接受以单位标记的值. height
纸张高度,接受标有单位的值. margin
纸张边距,默认为无. top
上边距,接受以单位标记的值. right
右边距,接受标有单位的值. bottom
底部边距,接受标有单位的值. left
左边距,接受标有单位的值.
- returns:
> 承诺用PDF缓冲区解决.
NOTE 生成PDF目前仅在Chrome无头版中受支持.
page.pdf()
使用print
css媒体生成页面的pdf。 用screen
媒体生成pdf, 调用 page.emulateMedia('screen') 在之前 调用 page.pdf()
:
// Generates a PDF with 'screen' media type.
await page.emulateMedia('screen');
await page.pdf({path: 'page.pdf'});
The width
, height
, and margin
选项接受标有单位的值。 未标记的值被视为像素。
A few examples:
page.pdf({width: 100})
- 宽度设置为100像素的打印page.pdf({width: '100px'})
-宽度设置为100像素的打印page.pdf({width: '10cm'})
- 打印宽度设置为10厘米。
所有可能的单位是:
px
- 像素in
- 英寸cm
- 厘米mm
- 毫米
format
选项是:
Letter
: 8.5in x 11inLegal
: 8.5in x 14inTabloid
: 11in x 17inLedger
: 17in x 11inA0
: 33.1in x 46.8inA1
: 23.4in x 33.1inA2
: 16.5in x 23.4inA3
: 11.7in x 16.5inA4
: 8.27in x 11.7inA5
: 5.83in x 8.27inA6
: 4.13in x 5.83in
page.queryObjects(prototypeHandle)
prototypeHandle
对象原型的句柄。 - returns:
> Promise解决了这个原型的一个对象数组的句柄。
该方法迭代JavaScript堆,并找到具有给定原型的所有对象。
// Create a Map object
await page.evaluate(() => window.map = new Map());
// Get a handle to the Map object prototype
const mapPrototype = await page.evaluateHandle(() => Map.prototype);
// Query all map instances into an array
const mapInstances = await page.queryObjects(mapPrototype);
// Count amount of map objects in heap
const count = await page.evaluate(maps => maps.length, mapInstances);
await mapInstances.dispose();
await mapPrototype.dispose();
快捷键 page.mainFrame().executionContext().queryObjects(prototypeHandle).
page.reload(options)
options
导航参数可能具有以下属性: timeout
最大导航时间以毫秒为单位,默认为30秒,通过 0
来禁用超时。 默认值可以通过使用page.setDefaultNavigationTimeout(timeout) 方法.waitUntil
> 何时考虑导航成功, 默认为 load
. 给定一组事件字符串, 在所有事件被解雇后,导航被认为是成功的。 Events can be either:load
- 考虑在load
事件被触发时导航结束。domcontentloaded
- 考虑导航完成 当DOMContentLoaded
事件被触发时。networkidle0
- 当网络连接数量不超过0个网络连接的时间至少为500
毫秒时,请考虑导航完成。networkidle2
- 当网络连接数不超过2个时,导航至少需要500
秒。
- returns:
> 承诺解决主要资源响应。在多重重定向的情况下,导航将通过最后重定向的响应来解决。
page.screenshot([options])
options
选项对象可能具有以下属性: path
保存图像的文件路径。如果 path
是一个相对路径,那么它相对于它被解析 current working directory. 如果没有提供路径,图像将不会保存到磁盘。type
指定截图类型,可以是 jpeg
或png
。 默认为 'png'.quality
图像质量介于0-100之间。 Not applicable to png
images.fullPage
When true, 截取完整的可滚动页面. 默认为 false
.clip
指定页面剪切区域的对象. 应该有以下字段: x
剪辑区域左上角的x坐标 y
剪辑区域左上角的y坐标 width
剪辑区域的宽度 height
剪辑区域的高度
omitBackground
隐藏默认的白色背景并允许以透明度捕捉屏幕截图。默认为 false
.
- returns:
> 承诺解决与捕获的截图缓冲
page.select(selector, ...values)
selector
一个selector查询页面 ...values
<...string> 要选择的选项值。如果具有
multiple
属性,则考虑所有值,否则只考虑第一个值。- returns:
>> 返回已成功选择的选项值数组。
一旦选择了所有提供的选项,触发change
和input
事件。 如果没有匹配selector
的元素,该方法会抛出一个错误。
page.select('select#colors', 'blue'); // single selection
page.select('select#colors', 'red', 'green', 'blue'); // multiple selections
快捷键 page.mainFrame().select()
page.setCacheEnabled(enabled)
enabled
设置缓存的 enabled
状态。- returns:
基于启用状态,切换忽略每个请求的缓存。默认情况下,缓存已启用。
page.setContent(html)
html
分配给页面的HTML标记。 - returns:
page.setCookie(...cookies)
...cookies
<...Object>name
required value
required url
domain
path
expires
Unix时间以秒为单位。 httpOnly
secure
sameSite
"Strict"
or"Lax"
.
- returns:
page.setDefaultNavigationTimeout(timeout)
timeout
最大导航时间,以毫秒为单位
此设置将为以下方法更改30秒的默认最大导航时间:
- page.goto(url, options)
- page.goBack(options)
- page.goForward(options)
- page.reload(options)
- page.waitForNavigation(options)
page.setExtraHTTPHeaders(headers)
headers
包含额外的http标头的对象将随每个请求一起发送。 所有标头值必须是字符串。 - returns:
额外的HTTP标题将随着页面启动的每个请求一起发送。
NOTE page.setExtraHTTPHeaders 不保证传出请求中的标题顺序。
page.setJavaScriptEnabled(enabled)
enabled
是否在页面上启用JavaScript。 - returns:
NOTE 更改此值不会影响已经运行的脚本。 它将对下一个导航.
page.setOfflineMode(enabled)
enabled
当 true
时,为页面启用离线模式。- returns:
page.setRequestInterception(value)
value
是否启用请求拦截。 - returns:
激活请求拦截功能 request.abort
, request.continue
和 request.respond
方法.
一个简单的请求拦截器的例子,它会中止所有的图像请求:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg'))
interceptedRequest.abort();
else
interceptedRequest.continue();
});
await page.goto('https://example.com');
await browser.close();
});
NOTE 启用请求拦截将禁用页面缓存。
page.setUserAgent(userAgent)
userAgent
在此页面中使用的特定用户代理 - returns:
Promise在用户代理被设置时解决。
page.setViewport(viewport)
viewport
width
页面宽度(像素)。 height
页面高度(按像素)。 deviceScaleFactor
指定设备比例因子 (可以被认为是dpr). 默认为 1
.isMobile
是否考虑了 meta viewport
标签。 默认为false
.hasTouch
指定视口是否支持触摸事件。 默认为 false
isLandscape
指定视口是否处于横向模式。 默认为 false
.
- returns:
NOTE 在某些情况下, 设置视口将重新加载页面,以设置
isMobile
或hasTouch
属性。
对于单个浏览器中的多个页面,每个页面都可以有自己的视口大小。
page.tap(selector)
selector
selector搜索要点击的元素。 如果有多个元素满足选择器,则会轻击第一个元素。 - returns:
这个方法用selector
获取一个元素, 如果需要的话,将其滚动到视图中, 然后使用page.touchscreen点击元素的中心。 如果没有元素匹配 selector
, 该方法会引发错误。
快捷键 page.mainFrame().tap(selector).
page.target()
- returns:
这个页面的目标是从中创建的。
page.title()
- returns:
> 返回页面的标题。
Shortcut for page.mainFrame().title().
page.touchscreen
- returns:
page.tracing
- returns:
page.type(selector, text[, options])
selector
要键入的元素的selector。 如果有多个元素满足选择器,则会使用第一个元素。 text
要输入焦点元素的文本。 options
delay
按键之间的等待时间,以毫秒为单位。默认为 0.
- returns:
发送一个 keydown
, keypress
/input
, and keyup
事件为文本中的每个字符。
按一个特殊的键, 喜欢 Control
or ArrowDown
, 使用 keyboard.press
.
page.type('#mytextarea', 'Hello'); // Types instantly
page.type('#mytextarea', 'World', {delay: 100}); // Types slower, like a user
快捷键 page.mainFrame().type(selector, text[, options]).
page.url()
- returns:
这是一个捷径 page.mainFrame().url()
page.viewport()
- returns:
width
页面宽度(像素)。 height
页面高度(按像素)。 deviceScaleFactor
指定设备比例因子 (can be though of as dpr). 默认为 1
.isMobile
是否考虑了 meta viewport
标签。 默认为false
.hasTouch
指定视口是否支持触摸事件. 默认为 false
isLandscape
指定视口是否处于横向模式. 默认为 false
.
page.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
selectorOrFunctionOrTimeout
A selector, predicate or 超时等待 options
可选的等待参数 ...args
<...Serializable|JSHandle> 参数传递给pageFunction
- returns:
> 承诺这决定了JSHandle的成功价值
该方法的行为与第一个参数的类型有所不同:
- 如果
selectorOrFunctionOrTimeout
是一个string
, 那么第一个参数被视为selector或xpath,具体取决于它是否以'//'开头,并且该方法是一个快捷方式 page.waitForSelector or page.waitForXPath - 如果
selectorOrFunctionOrTimeout
是一个function
, 那么第一个参数被当作一个谓词来等待,并且该方法是一个快捷方式 page.waitForFunction(). - 如果
selectorOrFunctionOrTimeout
是一个number
, 那么第一个参数将被视为以毫秒为单位的超时,并且该方法返回一个在超时后解析的Promise - 否则,会引发异常
Shortcut for page.mainFrame().waitFor(selectorOrFunctionOrTimeout[, options[, ...args]]).
page.waitForFunction(pageFunction[, options[, ...args]])
pageFunction
在浏览器上下文中执行函数 options
可选的等待参数 polling
间隔时间 pageFunction
被执行, 默认为raf
. 如果polling
是一个数字,那么它被视为一个以毫秒为单位执行函数的时间间隔。 如果polling
是一个字符串,那么它可以是以下值之一:raf
- 在requestAnimationFrame
回调中不断执行pageFunction
。这是适合观察造型变化的最紧密轮询模式。mutation
- 在每个DOM变异上执行pageFunction
。
timeout
最长等待时间,以毫秒为单位。 默认为 30000
(30 seconds).
...args
<...Serializable|JSHandle> 参数传递给pageFunction
- returns:
> Promise什么时候解决 pageFunction
返回一个真值。 它解决了真值的JSHandle。
The waitForFunction
可用于观察视口大小更改:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
const watchDog = page.waitForFunction('window.innerWidth < 100');
await page.setViewport({width: 50, height: 50});
await watchDog;
await browser.close();
});
快捷键 page.mainFrame().waitForFunction(pageFunction[, options[, ...args]]).
page.waitForNavigation(options)
options
导航参数可能具有以下属性: timeout
最大导航时间,以毫秒为单位, 默认为30秒, 通过 0
来禁用超时. 默认值可以通过使用 page.setDefaultNavigationTimeout(timeout) 方法.waitUntil
> 何时考虑导航成功, 默认为 load
. 给定一组事件字符串,导航在所有事件被触发后被认为是成功的。 Events can be either:load
- 考虑导航完成 when theload
event is fired.domcontentloaded
-考虑导航完成 when theDOMContentLoaded
event is fired.networkidle0
- 考虑导航完成 当网络连接数不超过0时,至少为500
ms。networkidle2
- 考虑导航完成 当不超过2个网络连接至少为500
ms。
- returns:
> 承诺解决主要资源响应。 在多重重定向的情况下,导航将通过最后重定向的响应来解决。
page.waitForSelector(selector[, options])
selector
要等待的元素的selector options
可选的等待参数 visible
等待元素出现在DOM中并可见, i.e. 没有 display:none
或visibility:hidden
CSS属性。 默认为false
.hidden
等待元素在DOM中找不到或被隐藏,即具有 display:none
或visibility:hidden
CSS属性。 默认为false
.timeout
最长等待时间,以毫秒为单位。默认为 30000
(30 seconds).
- returns:
> 当选择器字符串指定的元素被添加到DOM时,Promise将被解析。
等待selector
出现在页面中。 如果在调用方法时selector
已经存在, 该方法将立即返回。 如果选择器在timeout
等待毫秒后没有出现,则该函数将抛出。 此方法适用于各种导航:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
let currentURL;
page
.waitForSelector('img')
.then(() => console.log('First URL with image: ' + currentURL));
for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com'])
await page.goto(currentURL);
await browser.close();
});
Shortcut for page.mainFrame().waitForSelector(selector[, options]).
page.waitForXPath(xpath[, options])
xpath
要等待的元素的xpath options
可选的等待参数 visible
等待元素出现在DOM中并可见, i.e. 没有 display:none
或visibility:hidden
CSS属性。 默认为false
.hidden
等待元素在DOM中找不到或者被隐藏, i.e. 有 display:none
或visibility:hidden
CSS属性。 默认为false
.timeout
最长等待时间,以毫秒为单位。 默认为 30000
(30 seconds).
- returns:
> Promise将在xpath字符串指定的元素添加到DOM时解析。
等待xpath
出现在页面中。如果在调用该方法的时候xpath
已经存在,该方法将立即返回。 如果xpath在timeout
等待毫秒后没有出现,则该函数将抛出。
此方法适用于各种导航:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
let currentURL;
page
.waitForXPath('//img')
.then(() => console.log('First URL with image: ' + currentURL));
for (currentURL of ['https://example.com', 'https://google.com', 'https://bbc.com'])
await page.goto(currentURL);
await browser.close();
});
快捷键 page.mainFrame().waitForXPath(xpath[, options]).
class: Keyboard
键盘提供了一个管理虚拟键盘的api。 高级别的API是 keyboard.type
, 它会采用原始字符并在页面上生成适当的keydown,按键/输入和键盘事件。
为了更好的控制,您可以使用keyboard.down
,keyboard.up
,而keyboard.sendCharacter
手动触发事件
按住Shift
键以选择和删除一些文本的例子:
await page.keyboard.type('Hello World!');
await page.keyboard.press('ArrowLeft');
await page.keyboard.down('Shift');
for (let i = 0; i < ' World'.length; i++)
await page.keyboard.press('ArrowLeft');
await page.keyboard.up('Shift');
await page.keyboard.press('Backspace');
// Result text will end up saying 'Hello!'
An example of pressing A
await page.keyboard.down('Shift');
await page.keyboard.press('KeyA');
await page.keyboard.up('Shift');
NOTE 在MacOS上,键盘快捷键就像
⌘ A
-> 选择全部不起作用。 看到 #1313
keyboard.down(key[, options])
key
按键的名称, 如 ArrowLeft
. 请参阅USKeyboardLayout以获取所有键名称的列表。options
text
如果指定,则使用此文本生成输入事件。
- returns:
分派keydown
事件。
如果key
是一个单独的字符,除了Shift
之外没有修饰键被按下, 一个keypress
/input
事件也会产生。 可以指定text
选项来强制生成输入事件。
如果key
是一个修饰键,Shift
,Meta
,Control
或Alt
,随着这个修饰符的激活,随后的按键将被发送。 释放修饰键, use keyboard.up
.
按键一次后, 随后 调用 keyboard.down
将有 repeat 设置为true. 要释放密钥,请使用 keyboard.up
.
NOTE 修饰键DO影响
keyboard.down
. 按住Shift
键将以大写形式输入文本。
keyboard.press(key[, options])
key
按键的名称, 如 ArrowLeft
. 请参阅USKeyboardLayout以获取所有键名称的列表。options
text
如果指定,则使用此文本生成输入事件。 delay
等待之间的时间 keydown
和keyup
以毫秒为单位. 默认为 0.
- returns:
如果key
是一个单独的字符,除了Shift
之外没有修饰键被按下, 一个keypress
/input
事件也会产生。 可以指定text
选项来强制生成输入事件。
NOTE 修改键效果
elementHandle.press
. 按住Shift键将以大写形式输入文本。
快捷键 keyboard.down
和 keyboard.up
.
keyboard.sendCharacter(char)
char
发送到页面的字符。 - returns:
分派keypress
和input
事件。 这不会发送keydown
或keyup
事件。
page.keyboard.sendCharacter('嗨');
NOTE 修饰键不起作用
keyboard.sendCharacter
. 按住Shift
键不会输入大写字母。
keyboard.type(text, options)
text
要输入焦点元素的文本。 options
delay
按键之间的等待时间,以毫秒为单位。 默认为 0.
- returns:
发送一个 keydown
, keypress
/input
, 和 keyup
事件为文本中的每个字符。
按一个特殊的键, 喜欢 Control
or ArrowDown
, 使用 keyboard.press
.
page.keyboard.type('Hello'); // Types instantly
page.keyboard.type('World', {delay: 100}); // Types slower, like a user
NOTE 修饰键不起作用
keyboard.type
. 按住Shift
键不会输入大写字母。
keyboard.up(key)
key
要释放的关键字的名称, 如 ArrowLeft
. 请参阅USKeyboardLayout以获取所有键名称的列表。- returns:
分派一个keyup
事件。
class: Mouse
mouse.click(x, y, [options])
x
y
options
button
left
,right
, ormiddle
, 默认为left
.clickCount
默认为 1. See UIEvent.detail. delay
在毫秒内在 mousedown
和mouseup
之间等待的时间. 默认为 0.
- returns:
快捷键 mouse.move
, mouse.down
and mouse.up
.
mouse.down([options])
options
button
left
,right
, ormiddle
, 默认为left
.clickCount
默认为 1. See UIEvent.detail.
- returns:
Dispatches 一个mousedown
事件。
mouse.move(x, y, [options])
x
y
options
steps
默认为 1. Sends intermediate mousemove
events.
- returns:
Dispatches 一个mousemove
事件。
mouse.up([options])
options
button
left
,right
, ormiddle
, 默认为left
.clickCount
默认为 1. See UIEvent.detail.
- returns:
Dispatches 一个mouseup
事件。
class: Touchscreen
touchscreen.tap(x, y)
x
y
- returns:
Dispatches touchstart
和touchend
事件。
class: Tracing
您可以使用 tracing.start
和 tracing.stop
创建一个可以在Chrome DevTools中打开的跟踪文件 or timeline viewer.
await page.tracing.start({path: 'trace.json'});
await page.goto('https://www.google.com');
await page.tracing.stop();
tracing.start(options)
options
path
将跟踪文件写入的路径. required screenshots
捕获跟踪中的屏幕截图。 categories
> 指定要使用的自定义类别而不是默认值。
- returns:
每个浏览器一次只能激活一条跟踪。
tracing.stop()
- returns:
class: Dialog
Dialog 对象是通过页面分派的 'dialog' 事件.
使用Dialog
类的一个例子:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
page.on('dialog', async dialog => {
console.log(dialog.message());
await dialog.dismiss();
await browser.close();
});
page.evaluate(() => alert('1'));
});
dialog.accept([promptText])
promptText
提示中输入的文本。 如果对话框的 type
不提示,不会产生任何影响。- returns:
当对话已被接受时,承诺会解决。
dialog.defaultValue()
- returns:
如果对话框出现提示,则返回默认提示值。否则,返回空字符串。
dialog.dismiss()
- returns:
当对话被dismissed时,承诺会resolves。
dialog.message()
- returns:
显示在对话框中的消息。
dialog.type()
- returns:
对话框的类型,可以是其中之一 alert
,beforeunload
,confirm
orprompt
.
class: ConsoleMessage
ConsoleMessage 对象是通过页面分派的 'console' 事件.
consoleMessage.args()
- returns:
>
consoleMessage.text()
- returns:
consoleMessage.type()
- returns:
以下值之一: 'log'
, 'debug'
, 'info'
, 'error'
, 'warning'
, 'dir'
, 'dirxml'
, 'table'
, 'trace'
, 'clear'
, 'startGroup'
, 'startGroupCollapsed'
, 'endGroup'
, 'assert'
, 'profile'
, 'profileEnd'
, 'count'
, 'timeEnd'
.
class: Frame
在每一个时间点,页面都会通过该页面公开当前frame树 page.mainFrame() 和 frame.childFrames() 方法.
Frame 对象的生命周期由三个事件控制,分派在页面对象上:
- 'frameattached' - 当框架连接到页面时触发。 一个框架只能附加到该页面一次。
- 'framenavigated' - 当框架提交导航到不同的URL时触发。
- 'framedetached' - 当框架从页面分离时触发。一个框架只能从页面上分离一次。
转储frame树的一个例子:
const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
const page = await browser.newPage();
await page.goto('https://www.google.com/chrome/browser/canary.html');
dumpFrameTree(page.mainFrame(), '');
await browser.close();
function dumpFrameTree(frame, indent) {
console.log(indent + frame.url());
for (let child of frame.childFrames())
dumpFrameTree(child, indent + ' ');
}
});
frame.$(selector)
selector
选择器查询页面 - returns:
> Promise将resolves解析为指向Frame元素的ElementHandle。
该方法查询选择器的frame。 如果框架内没有这样的元素,该方法将解析为null
。
frame.$$(selector)
selector
选择器查询页面 - returns:
>> Promise将其解析为指向框架元素的ElementHandles。
该方法在框架内运行document.querySelectorAll
。 如果没有元素匹配选择器,则返回值将解析为[]
。
frame.$$eval(selector, pageFunction[, ...args])
selector
一个[select]来查询 frame pageFunction
在浏览器上下文中评估函数 ...args
<...Serializable|JSHandle> 参数传递给pageFunction
- returns:
> 承诺哪些解决了返回值 pageFunction
此方法运行 document.querySelectorAll
在框架内并将其作为第一个参数传递给 pageFunction
.
如果 pageFunction
返回一个Promise, 然后 frame.$$eval
将等待承诺解决并返回其价值。
例子:
const divsCounts = await frame.$$eval('div', divs => divs.length);
frame.$eval(selector, pageFunction[, ...args])
selector
一个[select]来查询 frame pageFunction
在浏览器上下文中评估函数 ...args
<...Serializable|JSHandle> 参数传递给pageFunction
- returns:
> 承诺哪些解决了返回值 pageFunction
这个方法在框架内运行document.querySelector
并将它作为第一个参数传递给pageFunction
。如果没有与selector
匹配的元素,则该方法将引发错误。
如果pageFunction
返回一个Promise,那么frame.$eval
将等待承诺解析并返回它的值。
Examples:
const searchValue = await frame.$eval('#search', el => el.value);
const preloadHref = await frame.$eval('link[rel=preload]', el => el.href);
const html = await frame.$eval('.main-container', e => e.outerHTML);
frame.$x(expression)
expression
Expression to evaluate. - returns:
>>
该方法评估XPath表达式。
frame.addScriptTag(options)
options
url
要添加的脚本的URL。 path
将JavaScript文件注入frame的路径。如果 path
是一个相对路径,那么它相对于它被解析 current working directory.content
将原始JavaScript内容注入到框架中。
- returns:
> 当脚本的onload触发或者脚本内容被注入到框架中时,它解析为添加的标记。
将'