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

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

java学习,进阶,提升

http://how2j.cn/k/hutool/hutool-brief/1930.html?p=73689

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

centos6一键安装vsftpd脚本

centos6一键安装vsftpd脚本 手动安装vsftpd参考教程:Centos下安装Vsftpd的图文教程 vsftpd脚本功能: 1.安装 (命令执行:sh xxx.sh)2.添加ftp用户 (命令执行:sh xxx.sh add)3.卸载vsftpd (命令执行:sh xxx.sh uninstall) 测试环境:centos6 x64 centos6 x86(测试centos7以

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字