以前我曾經在《Rize - 一個可讓你簡單、優雅地使用 puppeteer 的 Node.js 庫》一文簡單介紹過 Rize 這個庫。當時僅僅是介紹這個庫自己,關於如何使用,我沒有給太多的指導。javascript
這篇文章講的是如何使用 Rize 來作 UI 測試或 E2E 測試。html
在正式開始以前,先給可能沒了解過 Rize 的同窗作個簡單的介紹:Rize 是一個提供了相對頂層而且可鏈式調用的 API 的庫,可與 puppeteer 一塊兒使用。目前開源在 GitHub,地址是 github.com/g-plane/riz…,歡迎你們前往 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 用戶:api
PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize
複製代碼
Windows 用戶:瀏覽器
SET PUPPETEER_DOWNLOAD_HOST=https://storage.googleapis.com.cnpmjs.org yarn add --dev puppeteer rize
複製代碼
(npm 用戶同理)bash
因爲安裝 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 倉庫:github.com/g-plane/riz… (歡迎 star)
Rize 的文檔教程:rize.js.org/
Rize 全部的 API 參考:https://rize.js.org/api/classes/index.rize.html