playwright-ts/README.md

126 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目名称
基于playwright-test实现的Page Object Demo
## 说明
主要实现了:
1.多用户交互,使用用例级别的context fixture,确保每个用户执行用例时都有独立的context环境。
2.监听HTTP请求捕获接口异常报错确保接口的稳定性和测试的可靠性。
3.封装表单和表格填写方法,通过{key1: value1, key2: value2}的方式快速操作。
4.集成dataclass,进行测试数据管理,与表单和表格的填写方法结合,使测试更轻松.
5.注入javascript脚本,监听xhr以及fetch类型API请求仅当无API正在请求时放开web界面操作,过滤规则在tools/apiObserver.js中进行配置.
6.注入javascript脚本,对新出现的button,input等按钮disble,当无API正在请求时恢复disable元素状态.
7.注入javascript脚本,全局监听指定元素出现,如果出现,则将其style.display属性设置为none
## 安装 && 测试
npm install
npx playwright test
具体操作可至playwright官网学习:<https://playwright.dev/docs/intro>
## 测试报告
### 如使用playwright html-reporter,以下两处源码可根据自身情况修改
1.html-reporter video附件重命名后,无法在video页签下展示,如不重命名,则只能通过观看video内容确定是哪个用户在操作,可修改以下源码解决:
路径:node_modules/playwright-core/lib/vite/htmlReport
查找内容:
==="video"
将第一个匹配项修改为
contentType.startsWith("video/")
2.如需html测试报告中隐藏某些步骤,可在test.step描述步骤名称时,加特定前缀,如"DeleteFromTheHtmlreport",然后修改以下源码解决:
路径:```node_modules/@playwright/test/lib/reporters/html.js```
方法名:_createTestResult
```steps: result.steps.map(s => this._createTestStep(s)),```
修改为:
```steps: result.steps.filter(s => !s.title.startsWith('DeleteFromTheHtmlreport')).map(s => this._createTestStep(s)),```
如无此文件,则修改路径```node_modules/playwright/lib/reporters/html.js```
方法名:_createTestResult
```steps: dedupeSteps(result.steps).map(s => this._createTestStep(s)),```
修改为:
```steps: dedupeSteps(result.steps).filter(s => !s.step.title.startsWith('DeleteFromTheHtmlreport')).map(s => this._createTestStep(s)),```
### 也可参照playwright官方文档,使用第三方报告
<https://playwright.dev/docs/test-reporters#html-reporter>
## 项目结构说明
### page-object-model
#### PageCompoment.ts 包含:页面基础类PageCompoment和通用定位器类Locators
Locators内通用的定位器可根据项目自行适配。
PageCompoment内的fillForm和fillTable方法也需要自行实现,目前方法相当于伪代码,提供了实现的思路。
fillTable可通过Table类获取cellLocator后直接调用fillForm进行填写操作。
#### table.ts 获取表格cellLocator
table在Locators内定义,需要根据项目情况自行适配。
获取到cellLocator后,可使用playwright Locator的所有方法进行操作。
#### 其他Page对象,继承PageCompoment,实现Page内方法
### data-factory
dataclass 官方文档:<https://dataclass.js.org/guide/>
继承dataclass编写数据类,每个表单可作为一个单独的数据类进行定义。
### tests
#### PagesInstance.ts
在此页进行page对象的实例化,然后BaseTest.ts用户fixture内对此类进行实例,以达到每个用户都可操作所有Page的目的。
#### BaseTest.ts
包含Context的创建和关闭方法,以及继承playwright test编写的各个用户fixture信息,其他用例从此文件import test即可进行用例编写,编写方式可至playwright官方文档学习。
### tools
#### ajaxHooker.js
引用cxxjackie脚本,增加API请求计数,感谢原作者,原文链接:<https://bbs.tampermonkey.net.cn/thread-3284-13-1.html>
#### apiObserver.js
调用ajaxHooker方法,实现当有API请求XHR和Fetch类型时,增加蒙层,禁止操作当前无API正在请求且上一API请求结束80ms以上,删除蒙层,恢复操作.
接口异常规则也在此文件中进行维护.
##### 某些情况下,添加蒙层会与hover操作冲突,如hover有发起网络请求的动作,会导致hover效果丢失
此时可执行以下命令在hover前停用蒙层
```await page.page.evaluate("window.maskTag=0")```
同样的,hover完成之后通过以下命令启用蒙层
```await page.page.evaluate("window.maskTag=1")```
也可通过调用PagesInstance内temporarilyDisableMask方法禁用再启用,调用方式如下:
```
await temporarilyDisableMask(async () => {
//your code here
});
```
##### 异常测试时,可能触发接口监听误告警
需执行以下命令临时禁止接口监听
```await page.page.evaluate("window.maskTag=0")```
同样的,异常测试步骤完成后立即启用
```await page.page.evaluate("window.maskTag=1")```
也可通过调用PagesInstance内temporarilyDisableDialog方法禁用再启用,调用方式如下:
```
await temporarilyDisableDialog(async () => {
//your code here
});
```
#### domObserver.js
监听dom变化,对新出现的button及input等元素进行disable及enable操作.
全局监听指定元素出现并将其隐藏的列表为此文件中```listenElementsClassName```变量,可在其中增加自己想隐藏的元素,若无此需求,可将此列表清空.