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

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa