一、Hades介绍
Hades自动化框架介绍
源码
https://github.com/puppeteer/puppeteer/
同时,想要更好的去使用该项目,需要一定的JavaScript语法基础,可以参考下JavaScript教程
二、从0到1安装
基础环境安装
安装Nodejs,https://nodejs.org/en/download/ 安装有点慢,需要耐心等待
验证是否已经安装成功
初始化项目
新建UI自动化项目saas-uitest
执行 yarn install,安装依赖环境
至此,所有环境已经安装成功,可以进行用例编写了
三、架构解析及Saas分层
安装完基础环境后,可进行对应repo代码的拉取,分支为https://****
四、常用方法介绍
– /lib/function/下封装了我们常用的公共方法和基于业务的常用方法,接下来就给大家讲一下常用的公共方法:
1、常用的操作方法
op-common.js 常用操作方法
logout, //封装登出方法
setText, // 选中文本框,并输入文本
getElementAttribute, // 获取某元素的属性值,如class、href
getElementText, // 获取某元素的文本值
getElementsText, // 获取批量元素的文本值
getElementPosition, // 获取某元素的位置坐标:boundingBox
pressEsc, // 按键盘Esc键,可以取消模型选中状态
pressEnter, // 按回车键
clickConfirm, // 点击确定、确认按钮
clickCancel, // 点击取消按钮
clickCloseButton, // 点击弹窗上的关闭按钮
setCheckBoxValue, // 设置checkbox勾选状态
waitForDisappear, // 等待某项元素消失
responseInterception, // 拦截页面请求,并得到返回值。在触发请求操作前调用
hoverElement, //将鼠标hover到指定的selector,若有多个匹配的元素, hover第一个
hoverElementByText, //鼠标hover到指定的text,若有多个匹配的元素
openPanguMenu, //封装通用的盘古应用进入方法
check-common.js 常用check函数
checkPageTitleEqual, // 验证当前page的title值
checkIsElementExist, // 验证某元素是否存在
checkAttrValueEqual, // 验证某元素属性值
checkAttrValueContain, // 验证某元素属性是否包含 期望文本
checkTextEqual, // 验证某元素文本值
checkTextContain, // 验证某元素文本值 是否包含期望文本
checkTextNotContain, // 验证某元素文本值 是否不包含某期望文本
checkIsTextExist, // 验证某项文本是否存在,可用于验证toast
checkImgDiff, // 图片对比校验,比对结果一定精度范围内认为通过
checkIsPageUrlExist, // 根据url判断page是否存在,可用于验证跳转新页面的场景
二次封装函数的好处在于,可以对某类操作进行统一处理,方便复用,减少业务用例的冗余
我们能用到的操作基本都在这里面涵盖了。
四、写一个Demo
/**
* @Description 查看方案详情场景测试用例
*/
//导入pybell依赖包
const { pyBell } = require("@qunhe/pybell")
//获取用户列表
const { UserList: { User }, DesignList} = require("../../global/configs")
//获取selector信息
let {commonSelector, designSelector} = require("../../lib/selector");
//获取function
const {
commonOption,
checkCommon, opSaasDesign, saasDesignOption
} = require("../../lib/function")
const {userCommon} = require("@qunhe/pybell-extend-user-common");
/* 配置合适的timeOut */
//常量const、let局部变量
const timeout_case = 800 * 1000
let copyDesign
describe("方案详情页", () => {
//全局前置条件
beforeAll(async () => {
await commonOption.login(User)
},timeout_case)
//全局后置条件
afterAll(async () => {
//await commonOption.logout()
},timeout_case)
//case前置条件
beforeEach(async () => {
//每个用例的执行前置条件
await saasDesignOption.openDesignList()
},timeout_case)
afterEach(async () => {
await pyBell.log("Test AfterEach")
})
test("方案列表页-展示",async () => {
saasDesignOption.findDesignOfName("方案1")
await pyBell.sleep(10000)
},timeout_case)
}
)
五、编码规范
1、常量使用 const进行命名,并使用"//"备注说明:const timeout_designList = 3 * 1000 //**timeout参数
2、局部变量使用let进行命名,并使用"//"备注说明:let copyDesign
3、时间秒级设定统一使用timeout_***开头
4、function格式:op- 业 务 名 . j s s e l e c t o r 格 式 e l − {业务名}.js selector格式 el- 业务名.jsselector格式el−{业务名}.js
5、操作方法和元素尽量放到lib下,方便维护与复用
6、两个相同元素的定位:推荐使用前置父节点进行定位
7、自定义方法,要给出注解:
/**
- @apiDescription 获取元素的坐标值
- @apiParam {String} selector 控件定位
- @return {Object} 返回元素的坐标对象,例如:{x: 100, y:100}
*/
六、其他
Xpath定位方式: https://testerhome.com/topics/20296
注意点:
两个相同元素时,要会使用父节点组合定位
$x{ xpath }调试台组合调试