UI自动化Selenium 显式和隐式等待Wait

一、问题现象

大家是否自动化执行过程中,出现脚本时而成功时而失败的情况;发现常见情况如下:

1、元素时而出现时而提示不存在,timeout

2、元素时而可以操作时而不能操作;提示:元素不可点击或不可操作

3、页面找不到等等

究其根本原因,就是咱们的应用在运行过程中,因为服务器性能、网络延迟等等原因,导致页面响应或者加载变慢,自动化脚本在操作元素时,元素没有加载完成导致的;

那么怎么做才能让脚本无论在服务器慢或者快时都能正常运行呢?

方法是元素出来了我才操作,怎么判断呢?

二、通常有如下几种办法:

1、硬等待 sleep(秒)

2、隐式等待

3、显示等待

其中硬等待和隐式等待功效相同,作用域和使用方法不同;都是等待设定的固定时间;不同是,硬等待是只对后一行脚本起作用,隐式等待是全局设置,所有操作都会等待设置的时间后,才操作;

这两种等待一定程度上能缓解稳定性问题,但不能根本解决,也会带来脚本执行效率问题;

因为本身元素可能1s加载完成了,但是设置后,每次都固定等待10s,白白浪费9s时间;如果几百行脚本,那浪费的时间太可观了!

有没有一种按需等待的呢?智能判断,元素出来了就操作,不出来就等;这就是显示等待

三、几种等待的范例:

四、显示等待讲解

这里重点讲解显示等待,显示等待用到2个类:WebDriverWait和expected_conditions两个类

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

  • driver:webdriver对象本身
  • timeout:超时时间,单位s;不能永无止境的等待对吧,总有个极限,这个就是极限时间
  • poll_frequency:重试间隔,单位s;按照设定的时间每这个时间重新检查一下元素
  • ignored_exceptions:是否忽略异常

webDriverWait类有两个常用的方法:until()和until_not()

  • unit():直到条件为真,就终止执行,否则一直循环
  • until_not():直到条件为否,就终止执行,否则一直循环

那么条件是什么呢?

五、常用条件:

方法

说明

title_is

判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值

title_contains

判断当前页面的 title 是否包含预期字符串,返回布尔值

presence_of_element_located

判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见

visibility_of_element_located

判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0)

visibility_of

同上一方法,只是上一方法参数为locator,这个方法参数是 定位后的元素

presence_of_all_elements_located

判断是否至少有 1 个元素存在于 dom 树中。举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 1 个元素存在,这个方法就返回 True

text_to_be_present_in_element

判断某个元素中的 text 是否 包含 了预期的字符串

text_to_be_present_in_element_value

判断某个元素中的 value 属性是否包含 了预期的字符串

frame_to_be_available_and_switch_to_it

判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False

invisibility_of_element_located

判断某个元素中是否不存在于dom树或不可见

element_to_be_clickable

判断某个元素中是否可见并且可点击

staleness_of

等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False

element_to_be_selected

判断某个元素是否被选中了,一般用在下拉列表

element_selection_state_to_be

判断某个元素的选中状态是否符合预期

element_located_selection_state_to_be

跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator

alert_is_present

判断页面上是否存在 alert

六、显示等待使用实例:
def assertVisible2(self, locate, locateType=By.XPATH):
    try:
        WebDriverWait(self.driver, 15, 0.5).until(EC.presence_of_element_located((locateType, locate)))  #判断元数是否被加载到了dom中,但不一定可见
        WebDriverWait(self.driver, 15, 0.1).until(EC.visibility_of(self.driver.find_element(locateType, locate)))  #判断元素是可见的
    except:
        raise AssertionError("断言失败!" + "元素[" + locate + "]不可见!")
    else:
        pass
        return 1


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qdrant向量数据库

Qdrant 是专为扩展过滤支持而设计的向量相似度搜索引擎和向量数据库,这使得它适用于各种基于神经网络的语义匹配、图像搜索等应用。 Qdrant 使用 Rust 🦀 编写,即使在高负载下也能快速、可靠地工作。 Qdrant架构 上图展示了 Qdrant 一些主要…

【排序】堆排序(C语言实现)

文章目录 前言1. 堆排序1.1 堆排序的思想1.2 堆排序的实现 2. 为什么向下调整而不是向上调整 前言 本章主要会讲堆排序的实现过程以及向上调整和向下调整的时间复杂度,在学习本章前,需要对堆、以及向上调整和向下调整有一个了解,如果不了解的…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点,具体内容分布于如下各个子章节: 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念(例如 Biba、Star Model、Bell-LaPadula 等模型)基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

Nginx多ip部署多站点

目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置,使用 d…

QT音频编程实战项目(二)

接上一篇 我们在实现完槽函数的定义后,我们应该将这些槽函数和对应的信号连接起来 接着将每个控件都对应转到槽进行实现: 这个是对打开文件呢个控件转到槽的具体操作: 首先通过QDir::homePath()获得用户的主目…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴 基础配置实现IGP需求:1. 根据拓扑所示,配置OSPF和EIGRP2. 在R3上增加一个网段:33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP,并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为666&…

java工作流详解

什么是工作流? 工作流:两个或两个以上的人,为了共同的目标,连续的以串行或并行的方式去完成某一业务。 业务:工作流所指业务涵盖了与经营相关的活动。 串行或并行:业务中的步骤也许以一步接着一步的方式…

YOLOv8改进:IoU系列篇 | Shape-IoU关注边界框本身的形状和尺度来计算损失 | 2023年12月最新IoU改进

🚀🚀🚀本文改进: 提出了一种新颖的Shape-IoU,小目标检测实现涨点,更加关注边界框本身的形状和尺度来计算损失 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Shape-IoU原理介绍 论文:https://ar…

【ps】如何给人偶添加衣服

使用PS工具扣出人物 使用编辑-变形-操控变型 、

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中,可以将【参数】放在【路由路径】中, 从而实现,同一个 路由,同一个组件,因路径参数不同,可以渲染出不同的内容。特点 : 1、当携带不同路径参数的路由相互跳转时&am…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息,它是服务器发送出来存储在浏览器上的一组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地,…

二叉搜索树介绍以及实现

二叉树无论是在实际运用还是面试题中,都是一种十分热门的数据结构,而二叉搜索树则是进阶版的二叉树,在map和set中也有应用。 什么是二叉搜索树 二叉搜索树又叫二叉排序树,它可以是一颗空树,又或者是有以下三个特点的…

用简单的方式理解串行主从通信方式(适用于LEU与TCC等外部设备之间的通信)

串行通信方式 数据按位序传送,最少需要两根通道(如RS485、CAN总线、以太网)。 优点:成本低,适合远距离通信。 缺点:速度慢、效率低。 注:以上特征为相较于并行通信方式。 主从通信方式 以RS4…

skimage图像处理(全)

文章目录 一、简介二、安装三、模块简介:API reference四、项目实战4.1、2D图像处理4.1.1、打印图像属性4.1.2、读取 / 显示 / 保存图像:skimage.io.imread() skimage.io.imshow() skimage.io.imsave()4.1.3、颜色空间转换:skimage.color.r…

轻松搞定软件开发:找对软件开发公司的流程与注意事项!

随着数字化时代的来临,软件开发在企业和个人生活中扮演着越来越重要的角色,然而,如何找到一家合适的软件开发公司却成为了一个令人头疼的问题。 本文将为你详细解读找软件开发公司的流程,以及在选择过程中需要注意的事项&#xf…

十大排序的个人总结之——冒泡排序、插入排序

同样,这两几乎也是被淘汰了的算法,尽管它们是稳定的,但是时间复杂度没人喜欢,了解一下就好,没啥好说的,注意最后一句话就行了 一,冒泡排序 1. 算法步骤 共n-1趟,谁两敢冒泡就换了…

C++ 不能用作全局变量名或给定 C 语言的链接

错误: C 不能用作全局变量名或给定 C 语言的链接 解决方案: 先抽自己两巴掌。 问问自己main函数作为一个函数,后面有没有添加()? 如果没有,建议再给自己两巴掌。

解决Golang WriteHeader设置后,Content-Type失效的问题

场景 最近笔者在研究web框架过程中,发现了一个响应类型的问题,困扰许久,原因就是设置了响应状态码后,然后设置响应类型为application/json。在实际请求后,响应类型变成了text/plain; charsetutf-8格式。 问题解决&…

梳理Langchain-Chatchat-UI接口文档

在 Langchain-Chatchat v0.1.17 版本及以前是有前后端分离的 Vue 项目的,但是 v0.2.0 后就没有了。所以本文使用的是 Langchain-Chatchat v0.1.17 版本中的 Vue 项目。经过一番折腾终于将 Langchain-Chatchat v0.1.17 版本前端 Vue 接口和 Langchain-Chatchat v0.2.…

YOLOv8改进 | 注意力篇 | ACmix自注意力与卷积混合模型(提高FPS+检测效率)

一、本文介绍 本文给大家带来的改进机制是ACmix自注意力机制的改进版本,它的核心思想是,传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影,生成一组中间特征,然后根…