目前 puppeteer 已经成为了很是流行的 Node.js 的库,被普遍用于爬虫或 UI 测试。javascript
我也很欢喜 puppeteer 这个库。然而,puppeteer 的几乎全部的 API 都是异步的,它返回的是一个 Promise
。html
这就致使整个代码有点啰嗦,下面是官方的例子:java
const puppeteer = require('puppeteer') void (async () => { const browser = await puppeteer.launch() const page = await browser.newPage() await page.goto('http://example.com') await page.screenshot({ path: 'example.png' }) await browser.close() })()
如您所见,一堆的 await
关键字使得代码不太优雅。为了要使用 async/await
,您必须将代码放入一个当即执行函数(IIFE)里。git
为此,我受到了 Laravel Dusk 的启发,写了 Rize
这个库。github
上面的例子若是用 Rize 重写,将会是这个样子:api
const Rize = require('rize') const rize = new Rize() rize .goto('http://example.com') .saveScreenshot('example.png') .end()
代码简单得多了。另外,链式的 API 调用也是代码变得优雅。异步
除了提供基本的操做(如页面导航、对 DOM 操做、与表单进行交互),Rize 这个库还提供了一些断言方法。async
为何呢?由于咱们常常利用 puppeteer 来进行 UI 测试。而 Rize 提供了一系列的 assertions,使得 UI 测试变得简单、方便,E2E 测试一样没有问题。函数
例如,您能够断言当前页面的 URL:测试
const rize = new Rize() rize.assertUrlIs('http://example.com')
又或者断言指定的文本是否存在于页面上:
const rize = new Rize() rize.assertSee('Some text')
还能够为 DOM 断言:
const rize = new Rize() rize.assertClassHas('div', 'my-class')
上面这个函数能够断言指定的元素上是否存在指定的类名。更多的 API 能够参考 Rize 的文档(连接在下方)。
Rize 库的 GitHub 仓库:https://github.com/g-plane/rize (欢迎 star)
Rize 库的文档教程:https://rize.js.org/
Rize 库全部的 API 参考:https://rize.js.org/api/classes/_index_.rize.html