利用 Rize 来进行 UI 测试或 E2E 测试
之前我曾经在《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 测试的更多相关文章
- e2e测试框架之Cypress
谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...
- UT, FT ,E2E 测试的意思
前端实现自动化就要借助到unit和e2e端到端测试了 一.unit测试(FT 就是Fucntion Test 功能测试, 注意不是: funciton函数 ...fucntion功能 不一样哦 ...
- e2e 测试(1)
距离上一随笔,已经有一个月没有没写.到今天,刚刚好好,是学习e2e测试的一个月.今天有点时间可以总结一下这个月来的收获. 1.搭建e2e的测试环境 我是使用 Vue 构建项目,所以我也是通过Vue-c ...
- angularjs e2e测试初步学习(一)
e2e测试是从用户角度出发,认为整个系统都是一个黑盒,只有UI暴露出来. angularjs的测试框架是采用protractor. 1.创建文件 首先创建一个项目文件夹test,然后再创建两个文件,一 ...
- Webpack单元测试,e2e测试
此篇文章是续 webpack多入口文件.热更新等体验,主要说明单元测试与e2e测试的基本配置以及相关应用. 一.单元测试 实现单元测试框架的搭建.es6语法的应用.以及测试覆盖率的引入. 1. 需要安 ...
- 使用Angular CLI进行单元测试和E2E测试
第一篇文章是: "使用angular cli生成angular5项目" : http://www.cnblogs.com/cgzl/p/8594571.html 第二篇文章是: & ...
- UI测试和GUI测试的区别
UI 测试 包含GUI测试和command line 测试 分享连接 https://www.ranorex.com/resources/testing-wiki/gui-testing/
- E2E测试框架
1. 目前E2E测试工具有哪些? 项目 Web Star puppeteer Chromium (~170Mb Mac, ~282Mb Linux, ~280Mb Win) 41427 nightma ...
- e2e 测试 出现的错误
每次开始学习vue的新知识时,总在环境这一块出现很多坑.这次我来记录一下,我在搭建vue e2e测试框架是踏过的坑吧. 我们都只知道,使用vue init webpack 项目名字<项目名字不能 ...
随机推荐
- 电脑C盘空间不足
电脑C盘空间不足,又不知道哪些文件可以删,可以下载下面的批处理文件 @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.t ...
- 60)PHP,项目执行过程总结
- WIN10 蓝牙连接音箱之后,音量调节无效,音量从1-100,声音一样大,都是最大声,可以静音(解决方案)
1.win+r,输入regedit,打开注册表2.进入路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AV ...
- TensorFlow 介绍
关于 TensorFlow TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...
- Introduction to Computer Science and Programming in Python--MIT
学习总结--(Introduction to Computer Science and Programming in Python--MIT) 导论 主题 重新利用数据结构来表达知识 理解算法的复杂性 ...
- python数据类型:Number数字
Python Number数据类型用于存储数值 数据类型是不允许改变的,如果改变Number数据类型的值,将从新分配内存空间 整型(int):整型或整数,是正或者负整数,不带小数点 长整型(long) ...
- 详解js面向对象编程
转自:http://segmentfault.com/a/1190000000713346 基本概念 ECMA关于对象的定义是:”无序属性的集合,其属性可以包含基本值.对象或者函数.“对象的每个属性或 ...
- idea快捷键-eclipse
ctrl+shift+R 查找文件ctrl+shift+T 查找class类alt+Enter 导包alt+Shift+P 实现方法
- Spring 错误 cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'context:property-placeholder'.
我来说下这个出错的原因吧 eclise中xsd的验证问题Description Resource Path Location Type cvc-complex-type.2.4.c: The matc ...
- SWUST OJ Gold Nuggets Distribution(0490)
Gold Nuggets Distribution(0490) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 421 Accepte ...