现在 puppeteer 已经成为了异常盛行的 Node.js 的库,被普遍用于爬虫或 UI 测试。
我也很欢欣 puppeteer 这个库。但是,puppeteer 的险些一切的 API 都是异步的,它返回的是一个 Promise
。
这就致使全部代码有点烦琐,下面是官方的例子:
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)里。
为此,我受到了 Laravel Dusk 的启示,写了 Rize
这个库。
上面的例子假如用 Rize 重写,将会是这个模样:
const Rize = require('rize')
const rize = new Rize()
rize
.goto('http://example.com')
.saveScreenshot('example.png')
.end()
代码简朴得多了。别的,链式的 API 挪用也是代码变得文雅。
除了供应基础的操纵(如页面导航、对 DOM 操纵、与表单举行交互),Rize 这个库还供应了一些断言要领。
为何呢?由于我们常常应用 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