前言

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.

puppeteer是Chrome团队推出的用于控制Chrome或者Chromium的上层开发工具包.通过puppeteer你可以方便的控制浏览器进行模拟用户操作.如:

  1. 使用puppeteer构建爬虫.
  2. 使用puppeteer来构建自动化测试.

了解puppeteer

安装

完整安装

npm i puppeteer

安装该包会自动下载对应系统的chromium可执行文件到node_modules\puppeteer\.local-chromium下.

下载需要翻墙,如果不想翻墙,请使用阿里镜像

npm config set puppeteer_download_host=https://npm.taobao.org/mirrors

如果你不想安装chromium可以使用core包

npm i puppeteer-core

你可以在启动时绑定executablePath选项或者使用环境变量PUPPETEER_EXECUTABLE_PATH来指定Chromium/Chrome的运行路径

特别注意

  1. 请确保你的node版本在6.4.0以上
  2. centOS 7以下不支持安装,由于我个人是用的ubuntu进行的安装,所以有遇到的问题请自行查找对应issue解决
  3. 在linux环境下安装一般会缺少必要的包,请进入Chromium/Chrome目录运行ldd chrome | grep not查看缺少的包,官方也给出了各个版本系统所需的包列表,可以直接安装,参见troubleshooting

使用

使用puppeteer非常简单,下面来看一段官方示例:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch(); // 启动puppeteer
  const page = await browser.newPage(); // 通过浏览器对象打开一个tab
  await page.goto('https://example.com'); // 输入地址并回车访问
  await page.screenshot({path: 'example.png'}); // 截取一个png网页截图

  await browser.close(); // 最后关闭浏览器
})();

你也可以使用Promise的形式

const puppeteer = require('puppeteer');
puppeteer.launch() // 启动puppeteer
    .then((browser) => {
        return browser.newPage() // 通过浏览器对象打开一个tab
            .then((page) => {
                return page.goto('https://example.com') // 输入地址并回车访问
                    .then(() => {
                        return page.screenshot({path: 'example.png'}); // 截取一个png网页截图
                    });
            })
            .then(() => {
                browser.close(); // 最后关闭浏览器
            });
    })
    .catch(global.console.error)

其他常见问题

当然,在你实际使用时,还需要注意几项必要的内容:

sandbox

在linux运行时,你默认情况下必须关闭沙盒模式才能正常启动,如果你想启用sandbox,请参考Linux SUID Sandbox Development

https证书

当你遇到没有https证书的情况时,可以在puppeteer.launch设置选项ignoreHTTPSErrors忽略https错误.

用户操作

默认情况下,puppeteer不会等待执行,如果你想模拟用户的操作情况,可以在puppeteer.launch设置选项slowMo的时间来进行用户模拟.

页面着陆

默认使用page.goto时,会在load事件后算作加载成功,但单页应用可能在进入页面后需要加载js文件渲染,异步加载数据等操作,这个使用可以通过设置waitUntil来进行处理.

测试用例

如果你要书写测试用例,请注意使用page.$eval时,会导致你的覆盖率测试直接报错,详见Integrating coverage reports

Travis CI使用请参考Running Puppeteer on Travis CI

实践源码参考

你可以查看在puppeteer之上为GUI测试构建的botphus-core,来帮助解决一些常见的puppeteer使用问题