以前我曾經在《Rize - 一個可讓你簡單、優雅地使用 puppeteer 的 Node.js 庫》一文簡單介紹過 Rize 這個庫。當時僅僅是介紹這個庫自己,關於如何使用,我沒有給太多的指導。javascript
這篇文章講的是如何使用 Rize 來作 UI 測試或 E2E 測試。html
在正式開始以前,先給可能沒了解過 Rize 的同窗作個簡單的介紹:Rize 是一個提供了相對頂層而且可鏈式調用的 API 的庫,可與 puppeteer 一塊兒使用。目前開源在 GitHub,地址是 https://github.com/g-plane/rize,歡迎你們前往 GitHub 給個 star。java
首先是安裝 Rize 和 puppeteer。git
若是您使用 Yarn:github
$ yarn add --dev rize puppeteer
若是您使用 npm:shell
$ npm install --save-dev rize puppeteer
考慮到國內的網絡緣由,您可能須要使用國內的 Chromium 鏡像:npm
對於 Linux 或 macOS 用戶:segmentfault
PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize
Windows 用戶:api
SET PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize
(npm 用戶同理)瀏覽器
因爲安裝 puppeteer 的時候會下載 Chromium,因此整個過程可能比較費時,須要耐心等待。
咱們假定要被測試的頁面是這樣的:
<html> <head> <title>標題</title> </head> <body> <div class="greeting"> Hello World! </div> <a href="">Another Page</a> <button id="btn">Click Me</button> <input type="checkbox" name="cb1" checked /> <input type="checkbox" name="cb2" /> </body> </html>
首先是導入。咱們推薦使用 ES2015 的 import 語法:
import Rize from 'rize'
固然您也能夠用 CommonJS 方式:
const Rize = require('rize')
第一件事是構造一個 Rize 實例:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() }) })
而後要轉到要被測試的頁面。咱們假定前面設定的頁面運行在 http://localhost:8000/ 上,那麼咱們能夠:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') }) })
咱們可使用 assertTitle
方法來斷言當前頁面的標題:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') }) })
可使用 assertTitle
方法來斷言當前頁面存在指定的文本:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') }) })
咱們還能夠明確在某個元素中存在指定文本,只需給出該元素的 CSS 選擇器便可:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') }) })
咱們能夠斷言某個元素存在指定的類名:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') }) })
還能夠斷言不存在指定的類名:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') }) })
咱們能夠斷言一些表單控件的狀態,例如複選框(checkbox)選中或未選中:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') .assertChecked('[name="cb1"]') // 斷言已選中 .assertNotChecked('[name="cb2"]') // 斷言未選中 }) })
在實際測試的過程當中,咱們不單單須要進行一些斷言,還須要與頁面進行交互。
例如,咱們以上面的頁面爲例,咱們能夠單擊那個按鈕:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') .assertChecked('[name="cb1"]') // 斷言已選中 .assertNotChecked('[name="cb2"]') // 斷言未選中 .click('#btn') }) })
也能夠單擊某個連接,咱們只須要給出該連接上的文本:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') .assertChecked('[name="cb1"]') // 斷言已選中 .assertNotChecked('[name="cb2"]') // 斷言未選中 .click('#btn') .clickLink('Another Page') }) })
固然,咱們還能與表單進行交互。例如,勾選某個複選框:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') .assertChecked('[name="cb1"]') // 斷言已選中 .assertNotChecked('[name="cb2"]') // 斷言未選中 .click('#btn') .clickLink('Another Page') .check('[name="cb2"]') }) })
或者取消勾選某個複選框:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') .assertChecked('[name="cb1"]') // 斷言已選中 .assertNotChecked('[name="cb2"]') // 斷言未選中 .click('#btn') .clickLink('Another Page') .check('[name="cb2"]') .uncheck('[name="cb1"]') }) })
在完成全部工做以後,須要退出瀏覽器:
describe('UI test', () => { it('example test', async () => { const rize = new Rize() rize .goto('http://localhost:8000/') .assertTitle('標題') .assertSee('Hello World!') .assertSeeIn('.greeting', 'Hello World!') .assertClassHas('div', 'greeting') .assertClassMissing('div', 'greet') .assertChecked('[name="cb1"]') // 斷言已選中 .assertNotChecked('[name="cb2"]') // 斷言未選中 .click('#btn') .clickLink('Another Page') .check('[name="cb2"]') .uncheck('[name="cb1"]') await rize.end() }) })
實際上 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