Puppeteer APIv1.11 中文版

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
    • browserWSEndpoint 一个浏览器websocket端点连接到。
    • ignoreHTTPSErrors 是否在导航期间忽略HTTPS错误。 默认为 false.
    • slowMo 将Puppeteer操作减少指定的毫秒数。 有用,这样你就可以看到发生了什么。
  • returns: >
  • 此方法将Puppeteer添加到现有的Chromium实例。

    puppeteer.createBrowserFetcher([options])

    • options
      • host 要使用的下载主机。默认为 https://storage.googleapis.com.
      • path 下载文件夹的路径。 默认为 /.local-chromium, 其中是puppeteer的软件包根目录。
      • platform 可能的值是:macwin32win64linux。默认为当前平台。
    • returns:
    • puppeteer.defaultArgs()

      • returns: > Chromium将与之一起启动的默认标志。

      puppeteer.executablePath()

      • returns: Puppeteer希望找到捆绑的Chromium的路径。如果使用[PUPPETEER_SKIP_CHROMIUM_DOWNLOAD]跳过下载,那么Chromium可能不存在(#environment-variables).

      puppeteer.launch([options])

      • options 在浏览器上设置的一组可配置选项。可以有以下字段:
        • ignoreHTTPSErrors 是否在导航期间忽略HTTPS错误。默认为 false.
        • headless 是否在headless mode中运行浏览器。 默认为 true unless the devtools option is true.
        • executablePath 可运行Chromium或Chrome可执行文件的路径,而不是捆绑的Chromium。 If executablePath is a relative path, then it is resolved relative to current working directory.
        • slowMo 将Puppeteer操作减少指定的毫秒数。有用,这样你就可以看到发生了什么。
        • args > 传递给浏览器实例的其他参数。可以找到Chromium标志的列表 here.
        • ignoreDefaultArgs 不要使用puppeteer.defaultArgs()。 Dangerous option; use with care. 默认为 false.
        • handleSIGINT 在Ctrl-C上关闭浏览器进程。 默认为 true.
        • handleSIGTERM 关闭SIGTERM上的浏览器进程。 默认为 true.
        • handleSIGHUP 关闭SIGHUP上的浏览器进程。 默认为 true.
        • timeout 等待浏览器实例启动的最长时间(以毫秒为单位)。默认为 30000 (30 seconds). Pass 0 to disable timeout.
        • dumpio 是否将浏览器进程标准输出和标准错误输入到process.stdoutprocess.stderr中。 默认为 false.
        • userDataDir 路径 User Data Directory.
        • env 指定浏览器可见的环境变量。 默认为 process.env.
        • devtools 是否为每个选项卡自动打开DevTools面板。 如果此选项为true,则headless选项将设置为false
        • 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: 返回maclinuxwin32win64中的一个。

          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/

            你可以找到 webSocketDebuggerUrlhttp://${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触发或者脚本内容被注入到框架中时,它解析为添加的标记。
                • 你可能感兴趣的:(Puppeteer APIv1.11 中文版)