UI 自动化里面等待方式应用场景!

news2024/11/25 13:14:54

掌握Selenium 自动化测试的人员都知道Selenium的等待使用场景至关重要,这些等待对于测试自动化稳定性不可或缺的一部分,因为它们确保与 Web 元素的同步交互,从而能够在不同的加载时间和动态页面更改中准确执行测试脚本。

本文将深入探讨 Selenium 等待并说明测试人员如何使用 Selenium 的等待功能。我们将介绍所有 Selenium 等待:隐式等待、显式等待和Fluent Wait。

为什么我们需要 Selenium 等待?

测试自动化的主要挑战是确保应用程序经过合适的方式以按预期执行特定的Selenium命令。UI测试自动化最常见的问题之一是要操作对象不存在。在这种情况下, selenium 执行的时候,页面上需要操作的元素不存在,就会出现执行操作失败,这也是测试结果不可靠的主要原因之一。

这种问题的原因取决于很多方面,例如网络速度、内容大小以及所使用的前端技术/框架。例如由于文档对象模型(也称为 DOM)的动态更新,Vue、React 或 Angular 等Javascript 框架需要一些时间来加载网页上的不同对象。

如果没有适当的等待机制,自动化测试往往会产生不一致的结果。缺乏稳定可靠的测试执行会增加自动化开发人员的投入时间,最终降低他们的效率。为了解决这个问题,Selenium等待就派上用场,用来解决一些元素出现时机不可控的场景。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

我们可以使用Thread.sleep()吗?

Thread.sleep()是一个线程停止运行语句,它可以在指定的时间内停止程序的执行。通过使用它,我们可以实现可靠的自动化测试脚本所需的等待,但它带来了一些阻碍其使用的问题,如下所示:

  • • 使测试脚本效率低下:无论任何情况,Thread.sleep()方法的调用都会等待指定的时间。这种静态行为会导致执行测试脚本时出现不必要的延迟。无论测试时元素的加载时间如何,脚本都会等待静态持续时间并增加测试执行时间。

  • • 需要在每个 Selenium 命令后显式添加:使用Thread.sleep()在测试脚本中添加等待时,需要在所有位置添加等待,即使在访问网页的任何元素之前需要持续等待。这使得测试脚本随着时间的推移很难维护。

  • • 停止时间多少:在不同场景需要使用多长时间是我们一个难题。

考虑到这些原因,我们需要找到更好的解决方案。下面让我们看看 Selenium 等待、它们的不同类型,以及它们如何解决 Web 自动化中的特定等待问题。

Selenium 等待类型

Selenium提供了三种类型来处理不同的场景并增强自动化测试的可靠性。

  • • 隐式等待– Selenium 中的隐式等待是一种全局等待,适用于脚本中的所有元素。它设置任何元素在交互之前变得可用的最长等待时间。如果该元素在指定时间内出现,则脚本继续,否则会引发TimeoutException

  • • 显式等待– Selenium 中的显式等待是一种更细粒度的方法,允许您等待特定条件或元素。显式等待应用于各个元素,并提供更好的控制。通常使用WebDriverWait类和预期条件来定义自定义等待条件。显式等待对于有效处理具有不同加载时间的动态 Web 元素非常有用。

  • • Fluent Wait – Selenium 中的 Fluent Wait 允许用户以自定义的检查条件频率来等待满足特定条件。当处理可能需要不同时间来加载或更改状态的元素时,流畅的等待特别有用。此等待是使FluentWait类创建的,并配置了超时、轮询频率和要忽略的异常等选项。

Selenium 中的隐式等待

在 Selenium 中,隐式等待是一种指示 WebDriver在抛出异常之前等待一定时间的机制。它全局应用于整个脚本,其主要目的是等待元素出现在 DOM(文档对象模型)中,然后再对它们执行操作。

当设置隐式等待时,WebDriver 将在指定的时间内重复轮询 DOM,直到找到元素或超时期限到期。如果在指定时间内找到该元素,WebDriver 将继续执行脚本中的下一步。如果在隐式等待期间未找到该元素,则会引发异常。

默认情况下,隐式等待的值设置为零,这意味着如果未找到该元素,它将立即返回错误。要在脚本中使用隐式等待,使用以下语法:

driver.implicitly_wait(10)

在初始化 WebDriver 后立即在脚本中设置隐式等待。这为所有后续交互设置了统一的等待时间。

Selenium 中的显式等待

Selenium 中的显式等待是一种技术,其中 WebDriver 被指示等待满足特定条件,然后再继续执行脚本中的后续步骤。与全局应用并等待指定时间量的元素出现的隐式等待不同,显式等待侧重于单个元素的特定条件。

通过显式等待,等待某些条件,例如元素的存在、元素的可见性或可以配置元素处于特定状态的特定属性,然后再继续,使用以下语法:

wait = WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

element =wait.until(EC.presence_of_element_located((By.ID,"")),message="")

driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出 NoSuchElementExeception 异常。
与until()或者until_not()方法结合使用
WebDriverWait(driver,10).until(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为True

预期条件的类型

显式等待提供了一种在执行测试脚本之前等待满足某些条件或因无法满足该条件而引发异常的方法。这是在 Selenium 的ExpectedConditions类的帮助下完成的。可以使用多个条件进行等待,如下所示:

  • • 元素可见性: visibilityOfElementLocated()条件确保元素存在于 DOM 中并且在页面上可见。

  • • 元素可点击性: elementToBeClickable()条件对于元素需要交互(例如单击按钮)的场景至关重要。

  • • 元素的存在: presenceOfElementLocated()条件等待 DOM 中至少存在一个元素。

  • • 元素的不可见性: invisibilityOfElementLocated()条件等待指定元素不可见。

  • 更多的我们可以浏览ExpectedConditions类的官方文档了解更多信息。

Selenium 中的流畅等待

在 Selenium 中,Fluent wait 提供了一种更灵活的方法,可以在继续执行脚本之前等待满足某些条件。它实现了 Wait 接口,并允许您定义轮询频率和等待期间要忽略的异常。

流畅的等待命令是使用Java中的Selenium FluentWait类实现的。FluentWait 的关键特性是其“流畅”或可链接语法,您可以在链中应用不同的条件和配置。

Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver)
                .withTimeout(60, SECONDS) // 自定义等待的总时间
                .pollingEvery(2, SECONDS) // 自定义轮询频率
                .ignoring(NoSuchElementException.class); //  自定义要忽略的异常
        WebElement foo = fluentWait.until(new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver)  // 自定义等待条件
            {
                return driver.findElement(By.id("kw"));
            }
        });

如这段代码片段所示,在实例化等待对象时,我们可以提及等待持续时间、轮询持续时间以及此等待可以忽略的异常。流畅等待的实例化后,可以在访问 Web 元素时使用它,方法是在 wait 的直到方法中传入一个Function 。

Selenium 几种等待对比

在 Selenium 中选择正确的等待策略对于顺利实现自动化至关重要。让我们比较一下隐式等待、显式等待和流畅等待,以便于理解。

特征隐式等待显式等待流畅等待
范围普遍影响网站上的所有元素。可以单独应用于特定元素。允许针对特定元素量身定制个性化等待策略。
支持复杂条件最适合对元素是否存在进行基本检查。通过显式条件支持各种条件,例如可见性或可点击性。通过适应用户定义的特定条件提供高度的灵活性。
配置全局设置一次,以便在整个网站上保持一致的应用程序。可针对不同元素独立配置,提供细致入微的控制。类似于显式等待,但引入了额外的配置以提高精度。
使用案例非常适合具有一致加载时间的简单场景。非常适合处理复杂的情况,特别是当加载行为不可预测时。在以变化和可变加载时间为特征的动态场景中有效。
等待时间配置全局设置,确保整个站点的等待时间统一。可以针对特定元素或场景单独配置,从而实现精细控制。可根据每个元素进行定制,从而实现定制的等待时间。
轮询间隔配置检查之间以 500 ms的固定默认间隔运行。允许用户设置条件检查的频率,默认为 500ms 间隔。遵循与显式等待相同的轮询间隔配置。
忽略异常缺乏选择性忽略异常的能力。允许在等待期间选择性地抑制特定错误。在异常处理方面与显式等待保持一致。
灵活性相对简单,自定义选项有限。提供增强的适应性,适应各种等待场景。适应性强,特别有利于特定和微妙的情况。
可读性和表达性由于其全局应用,本质上很通用,提供的信息不太详细。表现出更大的表现力,特别是在使用不同的条件时。通过流畅的 API 展现出高表达力,有助于提高代码清晰度。

使用 Selenium 等待时要避免的常见错误

掌握Selenium等待至关重要,但避免常见错误也同样重要。使用 Selenium 等待时要避免的一些问题:

  • • 过度依赖隐式等待: 仅依赖隐式等待可能会导致同步问题。用 显示等待 或 Fluent Waits 来补充它们,以获得在动态 Web 场景中更好的适应性。

  • • 等待时间不足: 通过设置合理的等待时间来避免脚本失败。元素可能需要更长的时间来加载;合适的等待时间可以增强测试的稳健性。

  • • 忽略 ExpectedConditions: 通过显式且流畅的等待来利用 ExpectedConditions 的强大功能。忽略这些条件可能会导致脚本的适应性和健壮性较差。

    • 异常处理不当: 在 Fluent Waits 中正确异常处理。忽视它可能会忽略关键错误,从而影响脚本的可靠性,通过细致的异常管理确保有效的调试。

  • • 忽略动态条件: 使您的等待适应网页的动态特性。忽视这一点可能会导致脆弱的脚本容易失败,Selenium 等待在动态场景中大放异彩。

  • • 忘记重置隐式等待: 全局修改隐式等待后,记得重置它。忘记这样做可能会影响脚本的其他部分,保持一致性至关重要。

  • • 等待策略使用混乱: 在整个测试套件中保持一致的等待策略,隐式、显式和流畅等待的混合可能会导致混乱和脚本不稳定。

总结

如果要熟练使用Selenium WebDriver进行UI自动化,必须要需要掌握 Selenium 等待,这是一项保证测试脚本执行稳定性重要技能。在我们的探索中,我们发现了在网页异步领域中 Selenium 等待的必要性,其中元素加载不一致的现象普遍存在。虽然 Thread.sleep() 提供静态解决方案,但 Selenium 等待会动态适应,优化不同加载时间的脚本执行。

我们深入研究了关键的 Selenium等待——隐式、显式和流畅——每一个都是针对特定场景量身定制的。隐式等待具有全局适用性,适合一致的加载时间。显式等待提供特定于元素的精度,非常适合动态页面。Fluent Wait 具有很强的适应性和表现力,在不可预测的环境中表现出色。

我们强调了要避免的常见错误,强调需要采取平衡的方法。总之,Selenium等待对于有效的Web 自动化是不可或缺的一部分。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1545632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黄金近期可以投资吗?看这篇技术分析就够了

黄金价格的走势很大程度上受到美联储货币政策&#xff0c;以及市场对于美联储货币政策预期变化的影响&#xff0c;但不管金价的走势如何改变&#xff0c;现货黄金作为一种可以双向操作的黄金交易工具&#xff0c;都可以帮助投资者在不同的走势中主动出击&#xff0c;在风险可控…

el-table 表格中插入表单循环校验

<template><div>{{form}}<el-form :model"form" ref"form"><el-form-item label"呃呃呃呃呃呃呃"><el-table :data"tableData" border><el-table-column prop"time" label"日期"…

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

linux + gitee+idea整套配置以及问题详解

目录&#xff1a; 1、安装git 2、git配置 3、git和gitee账户建立安全链接 4、gitee创建仓库 5、idea配置gitee 6、克隆提交代码 1、安装git 使用到github上下载最新版&#xff0c;上传到你的服务器&#xff0c;再进行解压。 这里是我的压缩包。解压命令&#xff1a; cd /usr/g…

ABAP程序代码批量导出

运行界面 *&---------------------------------------------------------------------* *& Report ZZ0001 *& *&---------------------------------------------------------------------* *& *& *&-----------------------------------------…

那位拿了多个Offer的大佬分享了最新Go面经

和大家分享一下我们 Go就业训练营 和 升职加薪星球 中战友们投稿的真实面经。 这是第一篇&#xff0c;计划还会再更新4篇最新Go面经&#xff0c;都是拿到Offer的那种&#xff01; 欢迎大家关注我的账号&#xff0c;关注之后不迷路。 先秀战绩 虽然不同的公司考察的侧重点不一…

宜搭低代码高级认证实操题1 todolist

进行中待办 已完成待办 待办事项 待办事项远程api和变量配置 回调函数 function didFetch(content) {//console.log(content.data);// content.b 1; 修改返回数据结构中的 b 字段为1let res content.data;let todoList [];for(let i in res){todoList.push(res[i]);}consol…

MVC框架里的几种对象

Java语言是一门面向对象的编程语言&#xff0c;所有都用类表达&#xff0c;入口都是一个类&#xff0c;没有独立的main&#xff08;&#xff09;函数&#xff0c;类的实例化就是对象。 简单来讲类包括数据和方法&#xff0c;方法就是操作&#xff0c;是实现业务逻辑的地方&…

应急响应靶机-Linux(2)

前言 应急响应靶机训练&#xff0c;为保证每位安服仔都有上手的机会&#xff0c;不做理论学家&#xff0c;增加动手经验&#xff0c;可前来挑战应急响应靶机-Linux(2),此系列后期会长期更新&#xff0c;关注本公众号&#xff0c;被动学习。 挑战内容 前景需要&#xff1a;看…

16:00面试,16:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

生物信息—数据库

文章目录 核酸数据库1 一级核酸数据库&#xff1a;GenBank1.1 原核生物核酸序列1.2 真核生物成熟mRNA1.3 真核生物DNA序列 2 一级核酸数据库&#xff1a;基因组数据库&#xff1a;Ensemble3 一级核酸数据库&#xff1a;微生物宏基因组数据库&#xff1a;JCVI4 二级核酸数据库 蛋…

(2022级)成都工业学院Java程序设计(JAVA)实验二:类和对象

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、代码仅提供参考 3、如果代码不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 IntelliJ IDEA 2023.2.2 jdk17.0.6 实验要求 1、 控制台菜单。在 Exp02_x 类中添加一个方法 menu_x&…

Flutter开发进阶之瞧瞧BuildOwner

Flutter开发进阶之瞧瞧BuildOwner 上回说到关于Element Tree的构建还缺最后一块拼图&#xff0c;build的重要过程中会调用_element!.markNeedsBuild();&#xff0c;而markNeedsBuild会调用owner!.scheduleBuildFor(this);。 在Flutter框架中&#xff0c;BuildOwner负责管理构建…

Java基础--128陷阱

问题引入 Integer a 123; Integer b 123; System.out.println(ab); 结果为true。 但是如果代码如下 Integer a 1230;Integer b 1230;System.out.println(ab); 这个的结果就是false。 问题解决 当Integer a 123时&#xff0c;其实他底层自动转换成了Integer a Inte…

数据库专题(oracle基础和进阶)

前言 本专题主要记录自己最近学的数据库&#xff0c;有兴趣一起补习的可以一起看看&#xff0c;有补充和不足之处请多多指出。希望专题可以给自己还有读者带去一点点提高。 数据库基本概念 本模块有参考&#xff1a;数据库基本概念-CSDN博客 数据库管理系统是一个由互相关联的…

Arduino+ESP8266+华为云物联网平台实现智能开关

前言 最近在做一个物联网项目&#xff0c;涉及到智能开关的开发。目前已经实现简单的TCP通信远程控制&#xff0c;但是考虑到后期的设备管理以及设备通信所需要的技术和服务器的维护成本&#xff0c;我决定将设备接入云平台。本文将详细阐述如何利用华为云的物联网平台&#x…

Linux系统下安装部署Linux管理面板1panel

目录 一 1panel介绍 1、1Panel简介 2、1Panel特点 二、本地环境规划 1、本此实验目的 2、本地环境部署 三、部署1Panel&#xff08;在线安装&#xff09; 1.创建安装目录 2.一键部署1Panel 3.检查1Panel服务运行状态 4.检查1Panel监听端口 四、关闭防火墙和selinux…

小动物主动跑轮和被动跑轮的功能和目的?

小动物主动跑轮和被动跑轮在运动方式、实验目的和设计构造方面上是有区别的。 运动方式不同。主动跑轮是由动物自主运动来推动跑轮转动的。这种设置可以真实地反映动物自发的运动情况。相对地&#xff0c;被动跑轮则是一种强迫运动的方式&#xff0c;通常由电机带动跑轮转动从…

视频生成Sora的全面解析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

基于yolov8安全帽检测的系统

基于yolov8安全帽检测的系统 项目描述&#xff1a; 安全头盔检测&#xff08;计算机视觉&#xff09; 1.自训练数据集1538张数据图片&#xff0c;进行标注&#xff0c;并进行100轮的训练&#xff0c;准确率达0.966 2.使用 Flask 和 Ultralytics YOLOv8 模型开发了一个 Web 应…