自动化实践之:从UI到接口,Playwright给你全包了!
ccwgpt 2025-07-07 15:00 2 浏览 0 评论
作者:京东保险 宋阳
1背景
在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的工作压力。
车险投保流程主要通过H5页面进行,核心功能集中在投保、报价、核保等阶段。这些功能的UI自动化测试具有很高的可行性和必要性。通过自动化测试,我们可以完全覆盖这些核心功能的测试场景,有效地降低手动测试的工作量和错误率。
在这种情况下,Playwright自动化测试工具因其跨浏览器和平台的支持、简洁直观的API设计以及强大的异步处理能力而成为首选。使用Playwright进行UI自动化测试不仅可以提高测试效率和准确性,还可以帮助测试团队更好地应对频繁的功能迭代和回归测试的挑战。
图1.车险自动化测试需解决问题
2工具
Playwright是一个强大的UI自动化测试工具,能够录制并自动生成代码,支持多种主流浏览器,包括Chrome、Firefox和Safari,并且适用于Windows、Linux和macOS操作系统,能够实现跨平台的自动化测试。同时,Playwright采用Python、C#、Java等编程语言编写脚本,易于学习和使用。它还提供了丰富的API,可以实现复杂的用户交互操作,如键盘输入、鼠标操作等,让自动化测试更加贴近真实用户行为。
此外,Playwright具备自动等待功能,能够智能地处理元素加载,提高测试的稳定性和效率。总的来说,Playwright在UI自动化测试领域具有很高的灵活性和实用性。
2.1安装
安装Playwright只需要一条pip3安装命令,如下:
pip3 install playwright
Playwright可以安装支持的浏览器,运行不带参数的命令将安装默认浏览器,默认会下载chromium内核,firefox以及webkit驱动。
playwright install
3实践
3.1车险系统
车险系统流程如图2,其核心功能在于人车信息录入、线上报价和核保,这些功能的测试点都可以通过PlaywrightUI自动化覆盖。
图2.车险系统流程图
3.2录制
使用Playwright的录制功能生成测试用例的代码。运行"npx playwright codegen --device='iPhone 13'"命令启动playwright,默认会开启两个窗口,左图为指定的iPhone 13机型浏览器,右图为playwright inspector界面,在浏览器页面进行系统测试,playwright inspector会自动生成记录浏览器操作的代码,图3为打开车险首页的playwright界面。
图3.playwright界面
在Target选择生成的代码语言,默认生成Python,可以换选Java等,如图4。
图4.选择生成语言
选择好生成的语言后,就可以在浏览器中执行测试用例了,图5中playwright inspector会自动生成在浏览器测试用例对应代码。
图5.录制Case
测试完成之后就可以把playwright inspector中生成的代码拷贝到Idea,添加日志断言等,进行执行和完善。
import com.microsoft.playwright.*;
import com.microsoft.playwright.options.*;
import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat;
import java.util.*;
public class Example {
public static void main(String[] args) {
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.webkit().launch(new BrowserType.LaunchOptions()
.setHeadless(false));
BrowserContext context = browser.newContext(new Browser.NewContextOptions()
.setDeviceScaleFactor(3)
.setHasTouch(true)
.setIsMobile(true)
.setUserAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1")
.setViewportSize(390, 664));
Page page = context.newPage();
page.navigate("http://test***");//注入pin
page.navigate("http://testcar***");//访问车险测试环境地址
page.getByText("更换车辆").click();
page.navigate("http://testcar***");
page.getByText("更换车辆").click();
page.getByText("京AL3UVJ").click();
page.getByText("更换车辆").click();
page.locator("p").filter(new Locator.FilterOptions().setHasText("晋L613A4")).click();
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("查看报价")).click();
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("同意").setExact(true)).click();
page.getByText("知道了").click();
page.getByText("查看该方案报价").click();
}
}
}
3.3页面接口响应验证
Playwright的强大在于支持UI录制的同时,也提供了接口操作的功能。我们可以结合UI用例执行,对重要接口参数进行获取和校验,也可以作为UI用例的参数使用。接口校验主要用到两个方法:expect_request和expect_response。expect_request方法会等待匹配的请求并返回,expect_response方法会返回匹配的响应。在车险的一个使用场景为例:代码在执行点击更换车辆文本之后,会监听queryCarHomePage接口的返回,获取当前用户所有的车。
page.getByText("更换车辆").click();
// 监听响应
page.onResponse(response -> {
if (response.url().contains("queryCarHomePage")) {
String result = new String(response.body(), StandardCharsets.UTF_8);
JSONObject res = new JSONObject(result);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = null;
try {
rootNode = mapper.readTree(result);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
JsonNode carInfoListNode = rootNode.get("resultData").get("carInfoListDto");
for (JsonNode carInfo : carInfoListNode) {
JsonNode licenseNoNode = carInfo.get("licenseNo");
if (licenseNoNode == null) {
throw new IllegalArgumentException("licenseNo field not found in carInfoListDto for car " + carInfo);
}
String licenseNo = licenseNoNode.asText();
System.out.println(licenseNo);
}
}
});
3.4基于Playwright的UI自动化测试系统
可见Playwright的自动录制功能能够大幅降低生成测试用例的复杂度,UI的自动执行也能够节省大量回归测试的时间。当然我们不仅仅满足于case的录制和本地手动执行,而更希望能够在生成case之后,可以定期执行、自动执行录制的case,并生成能够直观反映case执行结果的报告,这样就可以实现从用例录制、收集、定期执行到测试效果反馈的完整自动化测试链路,实现系统的测试和监控的同时,显著提升测试的效率,极大节省时间人力成本。所以未来我们预期实现的自动化系统结构如图6所示,本地录制case并上传到数据库,Playwright定时任务执行case并生成用例执行报告。
图6.基于playwright的UI自动化测试系统流程图
3.5测试Demo
以下撷取Case为Playwright录制生成代码和接口相关扩展方法相结合,实现车险首页切换车辆后报价,并通过获取该用户pin下车列表的Demo实例。
public class Example {
public static void main(String[] args) {
try (Playwright playwright = Playwright.create()) {
Browser browser = playwright.webkit().launch(new BrowserType.LaunchOptions()
.setHeadless(false));
BrowserContext context = browser.newContext(new Browser.NewContextOptions()
.setDeviceScaleFactor(3)
.setHasTouch(true)
.setIsMobile(true)
.setUserAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1")
.setViewportSize(390, 664));
Page page = context.newPage();
page.navigate("http://test***");
page.navigate("http://testcar***");
// 监听响应
page.onResponse(response -> {
if (response.url().contains("queryCarHomePage")) {
String result = new String(response.body(), StandardCharsets.UTF_8);
JSONObject res = new JSONObject(result);
System.out.println(result);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = null;
try {
rootNode = mapper.readTree(result);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
JsonNode carInfoListNode = rootNode.get("resultData").get("carInfoListDto");
for (JsonNode carInfo : carInfoListNode) {
JsonNode licenseNoNode = carInfo.get("licenseNo");
if (licenseNoNode == null) {
throw new IllegalArgumentException("licenseNo field not found in carInfoListDto for car " + carInfo);
}
String licenseNo = licenseNoNode.asText();
System.out.println(licenseNo);
}
}
});
page.getByText("更换车辆").click();
page.getByText("晋L613A4").click();
page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("查看报价")).click();
page.getByText("查看该方案报价").click();
}
执行效果如图7,可以灵活在此基础上扩展其他Case。
图7.执行Demo
4总结与展望
利用Playwright,我们可以轻松地编写可靠、快速和可维护的自动化测试脚本。这些脚本可以模拟真实用户的交互行为,覆盖各种可能的测试场景,从而确保车险的UI在不同环境和配置下的稳定性和正确性。通过playwright实现用例自动生成,定时执行并产出报告的车险UI自动化测试系统,能够帮助我们显著提高测试效率,节省大量的测试时间。展望未来,我们期待将车险UI自动化测试技术继续发展和完善,为目前的测试工作提升效率,未来带来更多的创新和改进。
相关推荐
- 滨州维修服务部“一区一策”强服务
-
今年以来,胜利油田地面工程维修中心滨州维修服务部探索实施“一区一策”服务模式,持续拓展新技术应用场景,以优质的服务、先进的技术,助力解决管理区各类维修难题。服务部坚持问题导向,常态化对服务范围内的13...
- 谷歌A2A协议和MCP协议有什么区别?A2A和MCP的差异是什么?
-
在人工智能的快速发展中,如何实现AI模型与外部系统的高效协作成为关键问题。谷歌主导的A2A协议(Agent-to-AgentProtocol)和Anthropic公司提出的MCP协议(ModelC...
- 谷歌大脑用架构搜索发现更好的特征金字塔结构,超越Mask-RCNN等
-
【新智元导读】谷歌大脑的研究人员发表最新成果,他们采用神经结构搜索发现了一种新的特征金字塔结构NAS-FPN,可实现比MaskR-CNN、FPN、SSD更快更好的目标检测。目前用于目标检测的最先...
- 一文彻底搞懂谷歌的Agent2Agent(A2A)协议
-
前段时间,相信大家都被谷歌发布的Agent2Agent开源协议刷屏了,简称A2A。谷歌官方也表示,A2A是在MCP之后的补充,也就是MCP可以强化大模型/Agent的能力,但每个大模型/Agent互为...
- 谷歌提出创新神经记忆架构,突破Transformer长上下文限制
-
让AI模型拥有人类的记忆能力一直是学界关注的重要课题。传统的深度学习模型虽然在许多任务上取得了显著成效,但在处理需要长期记忆的任务时往往力不从心。就像人类可以轻松记住数天前看过的文章重点,但目前的...
- 不懂设计?AI助力,人人都能成为UI设计师!
-
最近公司UI资源十分紧张,急需要通过AI来解决UI人员不足问题,我在网上发现了几款AI应用非常适合用来进行UI设计。以下是一些目前非常流行且功能强大的工具,它们能够提高UI设计效率,并帮助设计师创造出...
- 速来!手把手教你用AI完成UI界面设计
-
晨星技术说晨星技术小课堂第二季谭同学-联想晨星用户体验设计师-【晨星小课堂】讲师通过简单、清晰的语言描述就能够用几十秒自动生成一组可编辑的UI界面,AIGC对于UI设计师而言已经逐步发展成了帮助我们...
- 「分享」一端录制,多端使用的便捷 UI 自动化测试工具,开源
-
一、项目介绍Recorder是一款UI录制和回归测试工具,用于录制浏览器页面UI的操作。通过UIRecorder的录制功能,可以在自测的同时,完成测试过程的录制,生成JavaScr...
- APP自动化测试系列之Appium介绍及运行原理
-
在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。Appium介绍Appium概念Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序...
- 【推荐】一个基于 SpringBoot 框架开发的 OA 办公自动化系统
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍oasys是一个基于springboot框架开发的OA办公自动化系统,旨在提高组织的日常运作和管理...
- 自动化实践之:从UI到接口,Playwright给你全包了!
-
作者:京东保险宋阳1背景在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的...
- 销帮帮CRM移动端UI自动化测试实践:Playwright的落地与应用
-
实施背景销帮帮自2015年成立以来,移动端UI自动化测试的落地举步维艰,移动端的UI自动化测试一直以来都未取得良好的落地。然而移动互联网时代,怎样落地移动端的UI自动化测试以快速稳定进行移动端的端到端...
- 编写自动化框架不知道该如何记录日志吗?3个方法打包呈现给你。
-
目录结构1.loguru介绍1.1什么是日志?程序运行过程中,难免会遇到各种报错。如果这种报错是在本地发现的,你还可以进行debug。但是如果程序已经上线了,你就不能使用debug方式了...
- 聊聊Python自动化脚本部署服务器全流程(详细)
-
来源:AirPython作者:星安果1.前言大家好,我是安果!日常编写的Python自动化程序,如果在本地运行稳定后,就可以考虑将它部署到服务器,结合定时任务完全解放双手但是,由于自动化程序与平...
- 「干货分享」推荐5个可以让你事半功倍的Python自动化脚本
-
作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)