Cypress之提升定位和操作页面元素脚本稳定性

2023-11-02 15:31

本文主要是介绍Cypress之提升定位和操作页面元素脚本稳定性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

UI层自动化测试脚本中,脚本不稳定性一直是困扰测试人员很大的一个点,其中,没有找到期望的页面元素或者点击操作失败又是导致UI层自动化脚本失败的主要原因。故此次课程将学习如果选择cypress作为测试框架,有哪些策略可以提高定位和操作页面元素脚本的稳定性。总的来讲有三种层次的retry机制来提升脚本稳定性,即定位页面元素retry、步骤级别retry,案例级别retry。接下来就先了解定位页面元素的retry机制。

定位页面元素retry

我们先分析下哪些因素可能导致查找或者操作页面元素失败。

  • 未找到页面元素的原因

    • 定位页面元素的selector被修改,导致定位页面元素失败
    • 等待处理不合理,页面元素还未加载出来时进行定位导致定位失败
  • 操作页面元素失败

    • 页面元素是disable属性,不允许点击
    • 页面元素被其他元素遮挡,不允许点击
    • 页面元素不在viewport中,不允许点击
    • 页面元素是隐藏的,不允许点击
    • 页面元素是readOnly属性,不允许输入内容

如果我们使用webdriver编写UI层自动化测试,为了提升脚本的稳定性就需要在测试脚本中添加很多显式和隐式等待,保证元素被加载出来后再进行定位或者点击等操作。除此之外,还会检查页面元素属性值,拖动元素到viewport中等提升操作页面元素的成功率。如果这两项补偿措施没有做或者做的不够完善,UI层自动化测试就可能概率性失败。那么使用cypress时是否还需要在脚本中继续这样做呢?答案是基本不需要,因为cypress框架在定位页面元素时内置了自动retry机制,即在超时时间内会不断尝试定位元素直到到达超时时间。在操作页面元素时,cypress内置了很多操作保证页面元素操作不会失败,下面是cypress操作页面元素前执行的action。通过这些action极大提升了click或者type等操作的成功率。

前面说到基本不需要在编写UI层自动化脚本时再添加等待语句,根据笔者在真实项目中使用经验,某些场景下cypress的等待机制会失效,此时需要用户添加cy.wait(x)进行处理。例如,点击页面的确定按钮后会弹出一个确认框,点击确认框的确认按钮后还会弹出一个确认框,此时需要再次点击第二个确认框的确认按钮才能完成测试场景。页面弹出的是两个dialog框,但前端实际调用的是一个前端组建,故定位确认框中的确认按钮的selector一致。此种情况下,在上次点击确认按钮的过程中如果不添加等待,脚本会概率性失败。总结而言,不同项目中可能需要添加等待的场景不一致,因为cypress的自动等待机制基本能覆盖98%的场景,故在编写脚本时可以先不添加任何等待处理逻辑,如果发现某些脚本不稳定后,才尝试增加等待处理脚本。

除根据情况添加等待脚本外,如果某些点击操作失败,可以尝试开启{force:true}参数,即不管检查是否成功,cypress框架都会执行点击操作,默认情况下,此参数值是false。根据自己实际项目上经验,少量场景下可能会因为校验不过而导致点击失败。例如在页面上进行多次点击时,某次点击后显示的页面元素可能会对即将进行点击操作的页面元素造成遮挡。此时,如果不开启{force:true},脚本就会运行失败。那么什么时候开启此参数呢?策略同上面一致,编辑脚本时默认不开启此参数,如果某些场景点击操作偶发性失败,那么可以查看失败原因,如果是因为被遮挡等原因造成失败,可开启此参数。

上面讲解了cypress框架内置的定位页面元素的retry机制,在维护UI层自动化脚本中,为了提升脚本稳定性,还可以添加基于步骤级别的retry和基于用例级别的retry,接下来就介绍如何实现这两类retry机制。

步骤级别的retry

基于步骤级别的retry有2个关键点,第一:能否找到if()中的条件判断,第二:能否有补救操作。即当判断到页面不符合预期时,能否进行一些补救措施。如果能找到判断条件以及可执行的补救措施,那么就可以编写基于步骤级别的retry增强脚本稳定性。下面给出了基于步骤级别retry的示例代码。第一个是通过判断页面元素信息确定是否进行retry操作,第二个是通过判断接口返回信息确定是否进行retry操作。实际项目中,需要结合被测应用实际情况确定如何实现基于步骤级别的retry。

用例级别的retry

选用cypress测试框架,如果要实现案例级别retry,需要引入“cypress-plugin-retries”插件。即执行命令“npm install cypress-plugin-retries”完成retry插件安装,并在plugin/index.js文件中引入“cypress-plugin-retries”,support/index.js文件中引入插件。引入插件的代码如下所示。

module.exports = (on, config) => {require('cypress-plugin-retries/lib/plugin')(on);
}
import './commands';
require('cypress-plugin-retries')

引入插件后,有三种方式设置运行案例失败后retry的次数。

  • 方式一:cypress.json配置文件中设置retry次数,{"env":{ "RETRIES": 2}},此种方式全局生效,所有失败案例都会自动retry两次。通过此设置也可以知道retry插件是通过环境变量控制retry次数。

  • 方式二:运行自动化案例的命令中设置retry次数,执行命令"export CYPRESS_RETRIES=2 npm run caseName",此种方式局部生效,即设置的retry次数的测试案例会进行失败重试。

  • 方式三:测试脚本文件中设置retry的次数。此种方式只在设置了retry的测试案例上才生效。需要注意一点,如果在测试脚本中设置retry配置必须用function,不要用箭头函数,即()=>{}。

    it('test', function() {this.retries(2)
    })

    实际项目中,可根据情况选择上面的retry设置方式。下面演示第二种方式,package.json文件中配置失败retry命令,然后执行命令“npm run failedRetry”即可。

        "failedRetry": "export CYPRESS_RETRIES=2 && cypress run --headed --spec 'cypress/integration/e2e/retry/failedRetry_spec.js' "//需注意一点,IOS或者linux操作系统上设置环境命令export 环境变量名称=环境变量值,如果是window操作系统,设置环境变量命令请用setx "env_name" "env_value",setx表示设置永久环境变量

    执行上面的案例,可以看到开启的浏览器中当第一次运行失败后,框架自动从头开始运行案例。

     

这篇关于Cypress之提升定位和操作页面元素脚本稳定性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/331578

相关文章

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.