之前我曾经在《Rize - 一个可以让你简单、优雅地使用 puppeteer 的 Node.js 库》一文简单介绍过 Rize 这个库。当时仅仅是介绍这个库本身,关于如何使用,我没有给太多的指导。

这篇文章讲的是如何使用 Rize 来做 UI 测试或 E2E 测试。

在正式开始之前,先给可能没了解过 Rize 的同学做个简单的介绍:Rize 是一个提供了相对顶层并且可链式调用的 API 的库,可与 puppeteer 一起使用。目前开源在 GitHub,地址是 https://github.com/g-plane/rize,欢迎大家前往 GitHub 给个 star。

安装

首先是安装 Rize 和 puppeteer。

如果您使用 Yarn:

$ yarn add --dev rize puppeteer

如果您使用 npm:

$ npm install --save-dev rize puppeteer

考虑到国内的网络原因,您可能需要使用国内的 Chromium 镜像:

对于 Linux 或 macOS 用户:

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 用户同理)

由于安装 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

利用 Rize 来进行 UI 测试或 E2E 测试的更多相关文章

  1. e2e测试框架之Cypress

    谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...

  2. UT, FT ,E2E 测试的意思

    前端实现自动化就要借助到unit和e2e端到端测试了 一.unit测试(FT 就是Fucntion Test 功能测试,  注意不是: funciton函数 ...fucntion功能   不一样哦  ...

  3. e2e 测试(1)

    距离上一随笔,已经有一个月没有没写.到今天,刚刚好好,是学习e2e测试的一个月.今天有点时间可以总结一下这个月来的收获. 1.搭建e2e的测试环境 我是使用 Vue 构建项目,所以我也是通过Vue-c ...

  4. angularjs e2e测试初步学习(一)

    e2e测试是从用户角度出发,认为整个系统都是一个黑盒,只有UI暴露出来. angularjs的测试框架是采用protractor. 1.创建文件 首先创建一个项目文件夹test,然后再创建两个文件,一 ...

  5. Webpack单元测试,e2e测试

    此篇文章是续 webpack多入口文件.热更新等体验,主要说明单元测试与e2e测试的基本配置以及相关应用. 一.单元测试 实现单元测试框架的搭建.es6语法的应用.以及测试覆盖率的引入. 1. 需要安 ...

  6. 使用Angular CLI进行单元测试和E2E测试

    第一篇文章是: "使用angular cli生成angular5项目" : http://www.cnblogs.com/cgzl/p/8594571.html 第二篇文章是: & ...

  7. UI测试和GUI测试的区别

    UI 测试 包含GUI测试和command line 测试 分享连接 https://www.ranorex.com/resources/testing-wiki/gui-testing/

  8. E2E测试框架

    1. 目前E2E测试工具有哪些? 项目 Web Star puppeteer Chromium (~170Mb Mac, ~282Mb Linux, ~280Mb Win) 41427 nightma ...

  9. e2e 测试 出现的错误

    每次开始学习vue的新知识时,总在环境这一块出现很多坑.这次我来记录一下,我在搭建vue e2e测试框架是踏过的坑吧. 我们都只知道,使用vue init webpack 项目名字<项目名字不能 ...

随机推荐

  1. C - The Battle of Chibi HDU - 5542 (树状数组+离散化)

    Cao Cao made up a big army and was going to invade the whole South China. Yu Zhou was worried about ...

  2. python Pandas Profiling 一行代码EDA 探索性数据分析

    文章大纲 1. 探索性数据分析 代码样例 效果 解决pandas profile 中文显示的问题 1. 探索性数据分析 数据的筛选.重组.结构化.预处理等都属于探索性数据分析的范畴,探索性数据分析是帮 ...

  3. PAT甲级——1019 General Palindromic Number

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  4. python学习笔记(13)常用模块列表总结

    os模块: os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作 ...

  5. JavaScript--DOM,BOM

    前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...

  6. python语法基础-函数-基础-长期维护

    ###############    函数的定义调用,返回值和返回值接收    ############## def mylen(): s = "myname" i = 0 for ...

  7. plague|commence|gymnasium|triumph|jump

    N-COUNT 瘟疫:疫病A plague is a very infectious disease that spreads quickly and kills large numbers of p ...

  8. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  9. Vimmer一套全语言支持的完美Vim配置——附Monaco字体

    本配置轻量,强大,支持流行语言,包括现代前段框架react,jsx,vue,pug(jade)高亮和格式化,支持各种语言的自动补全.同时新增了MonacoNerd字体,可以显示文件类型logo,Mon ...

  10. Zabbix 监控进程参考

    1)zabbix自动发现占用内存最大top10进程并监控资源 http://blog.csdn.net/ybx13218464908/article/details/47819401