Selenium自动化测试的显示等待

在进行UI自动化测试的时候,我们为了保持用例的稳定性,往往要设置显示等待,显示等待就是说明确的要等到某个元素的出现或者元素的某些条件出现,比如可点击、可见等条件,如果在规定的时间之内都没有找到,那么就会抛出Exception.

上面是我用selenium写的一个测试用例,展示了selenium中显示等待的使用方式,其中会使用到expected_conditions模块和WebDriverWait类,注意这里expected_conditions是一个py文件的文件名,也就是一个模块名,这个模块下面有很多的条件类,而我们用例中使用的title_is就是一个条件类。

WebDriverWait是一个类,这个类的作用就是根据一定的条件,不断的检查这个条件是否被满足了。WebDriverWait类只有两个方法,一个是until直到满足某个条件,另一个是until_not直到不满足某个条件。

  1. class WebDriverWait(object):

  2. def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):

WebDriverWait有四个参数分别是,driver驱动, timeout超时时间, poll_frequency=POLL_FREQUENCY轮训时间,也就是去判断条件是否满足的时间间隔,默认是0.5秒, ignored_exceptions=None在等待的过程中需要忽略的异常,是一个可迭代的异常类集合,比如我们可以设置一个list,里面是[NoSuchElementException,NoSuchAttributeException,InvalidElementStateException....],默认情况下,是一个元组,只包含一个NoSuchElementException,因为只有元素出现,才能去判断条件是否满足,在不断轮训的过程中,肯定会发生NoSuchElementException,这个时候必须忽略掉这个异常,不然程序就会中断。

其中driver和timeout是毕传的位置参数,另外两个是选择传递的关键字参数,如果不传都有指定的默认值。

下面就进入我们今天的主题,selenium中的等待条件的讨论

等待条件
条件类的实现原理

在selenium.webdriver.support.expected_conditions这个模块里,存放着所有的等待条件,每个条件类的结构都是一样的一个__init__构造方法和一个__call__方法。

在python中,如果想把类型的对象当做函数来使用,那么就可以给这个类实现__call__方法,如下:

  1. class TestCase:

  2. def __init__(self):

  3. self.driver = webdriver.Chrome(executable_path="./driver/chromedriver")

  4. self.driver.get('http://www.baidu.com')

  5. # sleep(2)

  6. def __call__(self):

  7. print(self.driver.title)

  8. if __name__ == '__main__':

  9. case = TestCase()

  10. case()

case()对象的调用,就会执行__call__方法里面的逻辑打印当前页面的标题,我们取一个selenium的实现类:

  1. class presence_of_element_located(object):

  2. def __init__(self, locator):

  3. self.locator = locator

  4. def __call__(self, driver):

  5. return _find_element(driver, self.locator)

这个条件类的意思是判断一个元素是否已经渲染到页面当中,在使用这个条件的时候需要先实例化,传入元素的定位,然后要进行判断的时候需要对实例对象进行调用并传入driver,对实例对象进行调用的时候就会执行__call__方法里的条件判断逻辑。

WebDriverWait是如何进行条件判断的

再回到文章开头看一下我们使用显示等待的代码:

  1. wait = WebDriverWait(self.driver, 2)

  2. wait.until(EC.title_is('百度一下,你就知道'))

先是实例化一个WebDriverWait对象,然后再调用until方法并且传递一个条件的实例对象,until方法里就会不断的去轮训条件是否满足。

  1. def until(self, method, message=''):

  2. screen = None

  3. stacktrace = None

  4. end_time = time.time() + self._timeout

  5. while True:

  6. try:

  7. value = method(self._driver)

  8. if value:

  9. return value

  10. except self._ignored_exceptions as exc:

  11. screen = getattr(exc, 'screen', None)

  12. stacktrace = getattr(exc, 'stacktrace', None)

  13. time.sleep(self._poll)

  14. if time.time() > end_time:

  15. break

  16. raise TimeoutException(message, screen, stacktrace)

method这个参数就是我们传递进来的条件的实例对象,value = method(self._driver)这里就是进行对象的调用,也就是执行了__call__方法里的逻辑。

selenium里都有哪些条件
  • title_is 判断title是否出现
  • title_contains 判断title页面标题是否包含某些字符
  • presence_of_element_located 判断某个元素是否被加载到了dom树里,但是并不代表这个元素可见
  • url_contains 判断当前url是否包含某个url
  • url_matches 判断当前url是否符合某种格式
  • url_to_be 判断当前url是否出现
  • url_changes 判断当前url是否已经发生了变化
  • visibility_of_element_located 判断某个元素是否被添加到了dom树里,且宽高都大于0
  • visibility_of 判断看某个元素是否可见
  • presence_of_all_elements_located 判断至少有一个元素存在于dom树中,返回所有定位到的元素
  • visibility_of_any_elements_located 判断至少有一个元素在页面中可见
  • visibility_of_all_elements_located 判断是否所有元素都在页面中可见
  • text_to_be_present_in_element 判断指定的元素中是否包含了预期的字符串
  • text_to_be_present_in_element_value 判断指定的元素属性值中是否包含了预期的字符串
  • frame_to_be_available_and_switch_to_it 判断iframe是否可以switch进去
  • invisibility_of_element_located 判断某个元素是否在dom中不可见
  • element_to_be_clickable 判断某个元素是否可见并且是enable的,也就是说是是否可以点击
  • staleness_of 等待某个元素从dom中删除
  • element_to_be_selected 判断某个元素是否被选中了,一般用于下拉列表中
  • element_located_to_be_selected 与上面的意思一样,只不过上面实例化的时候传入的是元素对象,这个传入的是定位
  • element_selection_state_to_be 判断某个元素的选中状态是否符合预期
  • element_located_selection_state_to_be 与上面一样,只不过传值不同而已
  • number_of_windows_to_be 判断当前窗口数是否等于预期
  • new_window_is_opened 判断是否有窗口增加
  • alert_is_present 判断页面是否有弹窗

以上就是selenium支持的所有条件。

然后就是自定义了

说了那么多条件,其实我们也可以自己实现一个条件类,

  1. class page_is_load:

  2. def __init__(self, expected_title, expected_url):

  3. self.expected_title = expected_title

  4. self.expected_url = expected_url

  5. def __call__(self, driver):

  6. is_title_correct = driver.title == self.expected_title

  7. is_url_correct = driver.current_url == self.expected_url

  8. return is_title_correct and is_url_correct

上面是自己实现的一个条件类,根据页面的url和标题来判断页面是否被正确加载,

  1. class TestCase:

  2. def __init__(self):

  3. self.driver = webdriver.Chrome(executable_path="./driver/chromedriver")

  4. self.driver.get('http://www.baidu.com/')

  5. # sleep(2)

  6. def __call__(self):

  7. print(self.driver.title)

  8. def test_wait(self):

  9. wait = WebDriverWait(self.driver, 2)

  10. wait.until(page_is_load("百度一下,你就知道", "http://www.baidu.com/"))

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们如何构建 ClickHouse 内部的数据仓库:一年回顾的思考 【Part2】

本文字数:4105;估计阅读时间:11 分钟 作者:Mihir Gokhale 本文在公众号【ClickHouseInc】首发 一年前,我的同事 Dmitry Pavlov 介绍了我们如何在 ClickHouse Cloud 上构建了公司内部的数据仓库,简称 “DWH”…

外贸财务管理必备,6款热门软件优势对比

外贸企业的财务管理面临着多币种结算、汇率波动、跨境支付等复杂问题。本文将盘点Zoho Books、KashFlow、Sage Intacct等六款热门的外贸财务软件,并探讨它们各自的优势与特点,以帮助外贸企业做出明智的选择。 一、Zoho Books Zoho Books是一款面向中小企…

RNN(循环神经网络)简介及应用

一、引言 在深度学习领域,神经网络被广泛应用于各种任务,从图像识别到语音合成。但对于序列数据处理的任务,如自然语言处理(NLP)、语音识别或时间序列预测等,传统的前馈神经网络(Feedforward N…

docker compose入门5—创建一个3副本的应用

1. 定义服务 version: 3.8 services:web:image: gindemo:v2deploy:replicas: 3ports:- "9090" 2. 启动服务 docker compose -f docker-compose.yml up -d 3. 查看服务 docker compose ps 4. 访问服务

如何使用jmeter进行压测

简介: 1.概述 一款工具,功能往往是很多的,细枝末节的地方也很多,实际的测试工作中,绝大多数场景会用到的也就是一些核心功能,根本不需要我们事无巨细的去掌握工具的所有功能。所以本文将用带价最小的方式讲…

相亲交友系统源码开发:构建高效互动平台的技术探索

在数字化时代,相亲交友系统已成为人们寻找伴侣、拓展社交圈的重要方式之一。这类平台不仅促进了人与人之间的连接,还通过算法匹配、兴趣筛选等功能,提高了用户找到合适伴侣的效率。本文将从技术角度出发,探讨相亲交友系统源码开发…

[paddle]paddleseg快速开始

快速开始 为了让大家快速了解PaddleSeg,本文档使用一个简单示例进行演示。在实际业务中,建议大家根据实际情况进行调整适配。 在开始下面示例之前,请大家确保已经安装好PaddleSeg开发环境(安装说明)。 1 准备数据 …

Java->优先级队列(堆)

一、优先级队列 1.概念 数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数 据结构就是优先级队列(Priority Queue)。 2.堆的概念 把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中 3.堆的性质 …

python中,try-except捕获异常的意义(通过ai智库学习)

python中,不但可以用try-except捕获异常, 还可以自定义异常提示字符串,更可以自定义捕获异常后的处置。 (笔记模板由python脚本于2024年10月03日 06:47:06创建,本篇笔记适合喜欢研究python的coder翻阅) 【学习的细节是欢悦的历程】…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下: 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速,土地资源变得日益紧缺,停车难问题已成为许多城市面临的共同挑战。随…

【JavaEE】——文件IO

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:认识文件 1:文件的概念 2:文件的结构 3:文件路径…

No package nodejs available.No package npm available.

安装nodejs时出现的报错 这个错误的原因是当前的 yum 源没有包含 Node.js 和 npm 的安装包。 解决方法 使用 NodeSource 仓库 curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -运行 yum install 安装 Node.js 和 npm: yum install -y nodejs使用 E…

登录注册静态网页实现(HTML,CSS)

实现效果图 实现效果 使用HTML编写页面结构,CSS美化界面,点击注册,跳转到注册界面,均为静态网页,是课上的一个小作业~ 使用正则表达式对输入进行验证,包括邮箱格式验证,用户名格式验证。 正则…

YOLO 二元分类器

YOLO 二元分类器 在评估二元分类器性能时,TP、FP、TN和FN是四个核心指标,它们分别代表真阳性、假阳性、真阴性和假阴性。以下是这些指标的定义、计算方法以及在实际应用中的意义: 定义 TP(真阳性):模型正…

嵌入式 c 内存堆栈增长方向往低地址方向好处

如下是堆和栈内存空间使用方式有如下好处: 1、stack从高地址向低地址扩展,这样栈空间的起始位置就能确定下来;如果反向,则要考虑这个起点从哪里合适,要确定堆的大小。 2、可以共用中间部分区域空间,最大化…

kafka-windows集群部署

kafka-windows集群部署目录 文章目录 kafka-windows集群部署目录前言一、复制出来四个kafka文件夹二、修改集群每个kafka的配置文件四、启动zookeeper,kafka集群 前言 部署本文步骤可以先阅读这一篇博客,这篇是关于单机kafka部署测试的。本文用到的文件…

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定,最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…

职场上的人情世故,你知多少?这五点一定要了解

职场是一个由人组成的复杂社交网络,人情世故在其中起着至关重要的作用。良好的人际关系可以帮助我们更好地融入团队,提升工作效率,甚至影响职业发展。在职场中,我们需要了解一些关键要素,以更好地处理人际关系&#xf…

前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

详解JavaScript中函数式编程

函数式编程 JS并非函数式编程语言,但可以应用函数式编程技术,这种风格很多语言都用,例如Java. 使用函数处理数组 假设有一个数组,数组元素都是数字,我们想要计算这些元素的平均值和标准差。使用非函数式编程风格的话…