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

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

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

Rize 的文档教程:rize.js.org/

Rize 所有的 API 参考:https://rize.js.org/api/classes/index.rize.html

利用 Rize 来进行 UI 测试或 E2E 测试相关推荐

  1. 端到端测试(e2e测试)

    端到端测试:end to end测试,又称为e2e测试,可以看做一个自动化的测试脚本,其目的是模拟用户行为,通过自动的访问一个真实浏览器环境下的页面,对于页面上的任意操作,断言浏览器中发生特定的行为.

  2. 前端E2E测试略详解(以cypress为例)

    上一篇文章很简略的介绍了E2E测试的一些框架,本文从相对更详细的层面进行整理 E2E测试 (by cypress): cypress安装 npm install cypress --save-dev ...

  3. 单元测试和E2E测试

    单元测试 把代码看成一个个组件,对每个组件进行单独测试 测试内容主要是组件内每一个函数的返回结果是不是和期望值一样 代码覆盖率是指代码中每个函数的每种情况的测试情况 E2E测试 把程序当做黑盒子,对于 ...

  4. Vue + nightwatch + Chrome76进行e2e测试的正确配置(一)

    2019.08.19 修正文章中的错误 除了单元测试之外,前端还有一个额外的测试:e2e测试,也就是端到端测试,用来模拟用户操作.对于Vue来说,推荐的e2e测试框架有nightwatch和cypre ...

  5. vue e2e 测试

    1.vue e2e测试概述 e2e 测试 端对端测试,属于黑盒测试,通过编写测试用例,自动化模拟用户操作,确保组件间通信正常,程序流数据传递如预期. 典型 e2e 测试框架对比 名称 断言 是否跨浏览 ...

  6. 自动化测试(二)02——单元测试类工具-Karma、Jasmine、Mocha、Jest、AVA E2E测试类工具-cypress、nightmare、nightwatch、testcafe

    自动化测试(二)02--单元测试类工具-Karma.Jasmine.Mocha.Jest.AVA & E2E测试类工具-cypress.nightmare.nightwatch.testcaf ...

  7. e2e测试框架之Cypress

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

  8. 本地编译执行 Kubernetes e2e 测试

    一.Kubernetes e2e 测试简介 Kubernetes e2e(end-to-end) 测试是单元测试和集成测试的补充,其主要目标是确保 Kubernetes 行为的一致可靠,并在单元和集成 ...

  9. E2E 端到端测试学习 - E2E 介绍、Cypress 案例基本使用

    E2E 测试介绍 E2E E2E(end to end)端到端测试是最直观可以理解的测试类型.在前端应用程序中,端到端测试可以从用户的视角通过真实浏览器自动检查应用程序是否正常工作. E2E 把整个系 ...

最新文章

  1. 网站优化只需五步技巧分享推广无界限
  2. linux下的汇编环境搭建(nasm)
  3. 成都python工作-成都python就业
  4. Nginx做负载均衡报:nginx: [emerg] could not build the types_hash
  5. [转载]WSUS客户端排错--使用wsus client tools
  6. OpenGL starfield星空的实例
  7. storm安装笔记以及提交拓扑任务
  8. Unity3D打包后日志文件输出目录
  9. Keras与PyTorch全方位比较 哪一个深度学习框架更适合初学者?
  10. SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
  11. Bailian4143 和为给定数【排序+二分】
  12. python2.7教程-python2.7学习笔记——菜鸟教程
  13. oem718d 基准站设置_诺瓦泰NovAtel OEM718D全系统多频单机测向板卡
  14. hmtl--textarea的滚动条(转)
  15. win7如何设置自定义开关机背景图片
  16. Quorum区块链原理及其概念
  17. ORACLE数据库练习题整理(2)
  18. SAP的标准委外采购中都有哪些坑
  19. PUCCH(3)matlab验证ZC序列的性质
  20. [macOS]_[打开GBK-ANSI编码的中文字符文件乱码解决办法]

热门文章

  1. es查询语句拼接 java_JAVA使用ElasticSearch查询in和not in的实现方式
  2. nginx 上传文件漏洞_nginx爆惊天漏洞 上传图片就能入侵服务器
  3. python完全支持面向对象编程_[Python] 类与面向对象编程
  4. shiro密码正确也会匹配错误_Shiro学习之——Shiro与Web集成
  5. python 爬虫系统_实战干货:从零快速搭建自己的爬虫系统
  6. 使用intellij idea打开以前用maven的包
  7. centos7查看当前系统时间、_CentOS7 设置系统时间
  8. Leetcode-13. 罗马数字转整数(C++)
  9. C#中巧用Lambda表达式实现对象list进行截取
  10. Winform中使用FastReport实现自定义PDF打印预览