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

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

Python结合Free Spire.PDF for Python实现PDF页面旋转

《Python结合FreeSpire.PDFforPython实现PDF页面旋转》在日常办公或文档处理中,我们经常会遇到PDF页面方向错误的问题,本文将分享如何用Python结合FreeSpir... 目录基础实现:单页PDF精准旋转完整代码代码解析进阶操作:覆盖多场景旋转需求1. 旋转指定角度(90/27

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

故障定位快人一步! 华为交换机排障命令汇总

《故障定位快人一步!华为交换机排障命令汇总》在使用华为交换机进行故障排查时,首先需要了解交换机的当前状态,通过执行基础命令,可以迅速获取到交换机的系统信息、接口状态以及配置情况等关键数据,为后续的故... 目录基础系统诊断接口与链路诊断L2切换排障L3路由与转发高级调试与日志性能、安全与扩展IT人无数次实战