0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

自动化实践之:从UI到接口,Playwright给你全包了!

京东云 来源:jf_75140285 作者:jf_75140285 2024-11-14 11:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:京东保险 宋阳

1背景

在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的工作压力。

车险投保流程主要通过H5页面进行,核心功能集中在投保、报价、核保等阶段。这些功能的UI自动化测试具有很高的可行性和必要性。通过自动化测试,我们可以完全覆盖这些核心功能的测试场景,有效地降低手动测试的工作量和错误率。

在这种情况下,Playwright自动化测试工具因其跨浏览器和平台的支持、简洁直观的API设计以及强大的异步处理能力而成为首选。使用Playwright进行UI自动化测试不仅可以提高测试效率和准确性,还可以帮助测试团队更好地应对频繁的功能迭代和回归测试的挑战。







图1.车险自动化测试需解决问题

2工具

Playwright是一个强大的UI自动化测试工具,能够录制并自动生成代码,支持多种主流浏览器,包括Chrome、Firefox和Safari,并且适用于Windows、Linux和macOS操作系统,能够实现跨平台的自动化测试。同时,Playwright采用PythonC#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。



4总结与展望

利用Playwright,我们可以轻松地编写可靠、快速和可维护的自动化测试脚本。这些脚本可以模拟真实用户的交互行为,覆盖各种可能的测试场景,从而确保车险的UI在不同环境和配置下的稳定性和正确性。通过playwright实现用例自动生成,定时执行并产出报告的车险UI自动化测试系统,能够帮助我们显著提高测试效率,节省大量的测试时间。展望未来,我们期待将车险UI自动化测试技术继续发展和完善,为目前的测试工作提升效率,未来带来更多的创新和改进。

审核编辑 黄宇



声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    9444

    浏览量

    156142
  • ui
    ui
    +关注

    关注

    0

    文章

    208

    浏览量

    22237
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高压电力综合自动化系统:技术解析与应用实践

    角度解析高压电力综合自动化系统的应用现状、功能特点与实现方法,并探讨其在实际工程中的实践意义。 一、高压电力综合自动化系统的应用背景 高压电力系统涵盖发电、输电、变电等多个环节,其运行状态复杂且对实时性要求
    的头像 发表于 11-17 16:12 394次阅读
    高压电力综合<b class='flag-5'>自动化</b>系统:技术解析与应用<b class='flag-5'>实践</b>

    设计落地,音圈执行器如何适配你的自动化需求?​

    设计落地,音圈执行器如何适配你的自动化需求?​-速程精密 不少企业搞自动化升级时,都会遇到同一个困惑:“明明选了口碑不错的传动部件,怎么用起来总觉得‘水土不服’?” 其实问题往往出
    的头像 发表于 10-29 15:32 161次阅读

    订单退款自动化接口:高效处理退款流程的技术实现

    高效的订单退款自动化接口,涵盖核心概念、技术实现、代码示例和最佳实践。我们将使用RESTful API作为基础,并以Python示例展示具体实现。 1. 什么是订单退款自动化
    的头像 发表于 10-21 10:41 217次阅读
    订单退款<b class='flag-5'>自动化</b><b class='flag-5'>接口</b>:高效处理退款流程的技术实现

    一文读懂!工业自动化控制系统的5大核心组成,感知执行解析

    在工业生产从 “人工操作” 向 “无人值守” 升级的过程中,工业自动化控制系统是实现这一转变的核心 —— 它能替代人工完成设备启停、参数调节、故障预警等一系列操作,保障生产高效、稳定、安全运行
    的头像 发表于 10-09 15:42 593次阅读

    SaltStack自动化部署实践

    今天,我想和大家分享一个真实的案例:我们团队如何通过SaltStack将原本需要3天的部署时间缩短30分钟,并且实现了零失误率。这不是魔法,而是自动化运维的力量。
    的头像 发表于 09-17 16:18 361次阅读

    如何用Renix实现网络测试自动化: 配置分离多厂商设备支持

    文章主要介绍如何使用Renix高层封装API编写自动化脚本的基础知识和技巧。只要您熟悉测试流程,不需要很强的代码能力就可以顺利编写自动化测试。 本教程将以实践为导向,引导您逐步掌握Renix高层封装API Python编码的基础
    的头像 发表于 08-27 15:21 469次阅读
    如何用Renix实现网络测试<b class='flag-5'>自动化</b>: <b class='flag-5'>从</b>配置分离<b class='flag-5'>到</b>多厂商设备支持

    干货分享 | TSMaster MBD模块解析:模型搭建自动化测试的完整实践

    在汽车电子MBD开发中,TSMasterMBD模块深度集成于TSMaster先进的总线分析、仿真与测试平台,旨在为工程师提供一套模型自动编译、代码集成自动化测试的端
    的头像 发表于 08-22 20:04 1892次阅读
    干货分享 | TSMaster MBD模块<b class='flag-5'>全</b>解析:<b class='flag-5'>从</b>模型搭建<b class='flag-5'>到</b><b class='flag-5'>自动化</b>测试的完整<b class='flag-5'>实践</b>

    工业远程自动化控制系统功能图谱:50 + 细分功能的协同运作

    工业远程自动化控制系统作为连接分散生产单元与集中管理中枢的桥梁,其功能体系呈现多维度、层级的特点。基础的数据交互复杂的智能决策,单一
    的头像 发表于 08-19 17:44 621次阅读

    圆柱电池自动分选机:流程自动化检测的革新之路

    的解决方案。 传统电池分选依赖人工操作,存在效率低、误差率高、数据追溯困难等问题。自动分选机通过集成机械、电子、软件等多领域技术,实现了电池上料到分选的流程自动化。设备启动后,电池
    的头像 发表于 07-21 17:59 392次阅读

    APP自动化测试框架

    APP自动化测试框架是一套结合工具链、设计模式和技术规范的集成解决方案。以下是基于主流技术实践的核心要点总结: 一、核心模块构成 环境管理‌ 支持物理机/虚拟机/容器部署,集成ADB、Appium
    的头像 发表于 05-07 07:35 425次阅读
    APP<b class='flag-5'>自动化</b>测试框架

    3DAI,机器视觉全面赋能工业自动化

    电子发烧友网报道(文/吴子鹏)机器视觉作为人工智能与工业自动化深度融合的核心技术,近年来在算法创新、硬件迭代以及行业应用等方面均实现了跨越式发展,推动终端市场应用持续迭代升级。根据 GGII
    的头像 发表于 04-08 01:03 2871次阅读

    智能读码器:工业自动化的眼睛与大脑

    随着技术的不断进步,读码器的功能也在持续拓展。单一的数据采集智能的数据分析,独立设备自动化
    的头像 发表于 03-18 09:12 669次阅读
    智能读码器:工业<b class='flag-5'>自动化</b>的眼睛与大脑

    “制造”“智造”:三维扫描自动化智能检测系统

    CASAIM自动化智能检测系统,凭借前沿技术与场景化解决方案,为制造业客户提供设计生产的生命周期质量保障。
    的头像 发表于 03-12 13:21 557次阅读
    <b class='flag-5'>从</b>“制造”<b class='flag-5'>到</b>“智造”:三维扫描<b class='flag-5'>自动化</b>智能检测系统

    RS485接口电路设计全面指南:基础实践

    在当今的工业自动化与通信技术领域,RS485接口凭借其卓越的性能与高度的稳定性,已然成为不可或缺的一部分。本文旨在为您提供一份详尽的RS485接口电路设计指南,内容涵盖基本概念的解析、硬件层面的具体
    的头像 发表于 02-28 19:35 2712次阅读
    RS485<b class='flag-5'>接口</b>电路设计全面指南:<b class='flag-5'>从</b>基础<b class='flag-5'>到</b><b class='flag-5'>实践</b>

    自动化创建UI并解析数据

    *附件:32960_auto.rar备注:Main.vi是ui自动化2.1.vi,配置文件为32960.B.ini。 目前可以实现根据配置文件自动化创建控件并布局,且可以自动解析接收到
    发表于 12-10 08:41