软件测试:Selenium三大等待(详解版)

news2024/11/20 9:19:19

一、强制等待

1.设置完等待后不管有没有找到元素,都会执行等待,等待结束后才会执行下一步

2.实例:

driver = webdriver.Chrome()
  driver.get("https://www.baidu.com")
  time.sleep(3)  # 设置强制等待
  driver.quit()

二、隐性等待

1.设置全局等待,对每个查询的元素都生效,当页面元素没有第一时间找到,会等待implicitly_wait设置的时间,时间过后再查找一次,要是还没找到就报错。

2.实例:

driver = webdriver.Chrome()
  driver.get("https://www.baidu.com")
  driver.implicitly_wait(10)  # 设置隐性等待
  driver.quit() 

同时,我也为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接点击文末小卡片免费领取资料文档

软件测试视频教程观看处:

【B站最系统自动化测试教程】整整400集,从入门到项目实战,只需18天,手把手带你进阶自动化测试!!!

三、显性等待

1.WebDriverWait类

1)导入webdriverwait类

from selenium.webdriver.support.wait import WebDriverWait

2)实例化WebDriverWait

wait = WebDriverWait(driver, 10, 2)  # 10为等待时间,2为在10s内每过2s去判断一次

selenium提供了WebdriverWait类用于针对指定的元素设置等待,其中内含until和until_not两个方法判断。

3)until(self, method, message: str = "")  函数

methon:为判断条件,若返回true,则判断成功,返回false,判断失败,打印message信息。

message:为判断失败时打印的信息,可写可不写。

 driver = webdriver.Chrome()
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until("判断条件", "返回false时打印的信息")
  driver.quit()

4)until_not(self, method, message: str = "") 函数

until_not效果与until相反,返回false时判断成功,返回true时判断失败。

driver = webdriver.Chrome()
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until_not("判断条件", "返回true时打印的信息")
  driver.quit()

5)判断条件通常与expected_conditions连用,内部封装了判断方法。expected_conditions的具体用法,我们接着往下看。

2.expected_conditions

下面介绍expected_conditions模块下所有的函数用法

1)title_is:精准匹配页面标题,匹配成功返回true,失败返回false

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option) <br>driver.get("https://www.baidu.com") <br>wait = WebDriverWait(driver, 10, 2) # 设置显性等待 <br>wait.until(title_is("百度一下,你就知道")) # 精准匹配标题 <br>driver.quit()

2)title_contains:模糊匹配标题,匹配成功返回true,失败返回false

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(title_contains("百度"))  # 模糊匹配标题
  driver.quit()

3)presence_of_element_located:判断定位的元素是否存在(可见和隐藏元素),存在返回true,否则返回false。

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(presence_of_element_located((By.ID, "kw")), "不存在")  # 判断元素是否存在,可见和隐藏元素都可判断
  driver.quit()

4)url_contains:判断页面url地址是否包含预期结果,满足预期返回true,不满足返回false。

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(url_contains("baidu1"), "不包含")  # 检测当前页面url地址是否包含预期结果
  driver.quit()

5)url_matches:判断当前页面地址是否包含预期结果,内填写正则表达式,满足预期返回true,不满足返回false。

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(url_matches("baidu"), "不包含")  # 检测当前页面url地址是否包含预期结果,内填写正则表达式
  driver.quit()

6)url_to_be:精准判断url,若相同返回true,不同返回false

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(url_to_be("https://www.baidu.com/"), "不存在")  # 精准判断url
  driver.quit()

7)url_changes:精准判断url,若相同返回false,不同返回true。

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(url_changes("https://www.baidu.c"), "相等")  # 精准匹配url不相等
  driver.quit()

8)visibility_of_element_located:判断定位的元素是否存在,只能判断可见元素,存在返回true,不存在返回false。

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  wait.until(visibility_of_element_located((By.ID, "kw")), "不存在")  # 判断元素是否存在,只适用于可见元素
  driver.quit()

9)visibility_of:判断元素是否存在,只能判断可见元素

from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.wait import WebDriverWait
  from selenium.webdriver.support.expected_conditions import *
   
  option = webdriver.ChromeOptions()
  option.add_argument("--headless")  # 设置无窗口模式
  driver = webdriver.Chrome(options=option)
  driver.get("https://www.baidu.com")
  wait = WebDriverWait(driver, 10, 2)  # 设置显性等待
  element_id = driver.find_element(by=By.ID, value="kw")
  wait.until(visibility_of(element_id), "不存在")  # 判断元素是否存在,只适用于可见元素
  driver.quit()

此方法与visibility_of_element_located判断结果相同,只是传递参数不同,visibility_of传元素,visibility_of_element_located传元组

10)presence_of_all_elements_located:判断页面至少有一个定位的元素存在(可见和隐藏元素都会判断)。

wait.until(presence_of_all_elements_located((By.TAG_NAME, "span")), "没有一个存在")  # 判断页面至少有一个定位的元素存在(可见和隐藏元素都会判断)

11)visibility_of_any_elements_located:判断页面至少有一个定位的元素存在,且为可见元素。

wait.until(visibility_of_any_elements_located((By.TAG_NAME, "span")), "没有一个存在")  # 判断页面至少有一个定位的元素存在,且为可见元素

12)visibility_of_all_elements_located:判断定位的元素全部可见。

wait.until(visibility_of_all_elements_located((By.TAG_NAME, "span")), "不可见")  # 判断定位的元素全部可见

13)text_to_be_present_in_element:模糊匹配文本值。

wait.until(text_to_be_present_in_element((By.XPATH, "//span[contains(text(),'123')]"), "124"), "匹配不成功")  # 模糊匹配元素文本值

14)text_to_be_present_in_element_value:模糊匹配定位元素的value值。

 wait.until(text_to_be_present_in_element_value((By.XPATH, "//input[@id='su']"), "百度一下"), "匹配错误")  # 模糊匹配元素value值

15)text_to_be_present_in_element_attribute:模糊匹配定位元素指定属性的属性值。

wait.until(text_to_be_present_in_element_attribute((By.XPATH, "//input[@id='kw']"), "name", "w"), "匹配错误")  # 模糊匹配定位元素指定属性的属性值

16)frame_to_be_available_and_switch_to_it:判断frame是否可以切换(switch_to.frame())。

wait.until(frame_to_be_available_and_switch_to_it((By.XPATH, "elenment")), "不可切换")  # 判断frame是否可以切换

17)invisibility_of_element_located:判断定位的元素是否不可见或者不存在,不可见返回true,反之返回false

wait.until(invisibility_of_element_located((By.TAG_NAME, "span")), "错误")  # 判断元素是否不可见/不存在,不可见返回true

18)invisibility_of_element:判断元素是否不可见或者不存在,不可见返回true,反之返回false。

span=driver.find_element(By.TAG_NAME, "span")
  wait.until(invisibility_of_element(span), "错误")  # 判断元素是否不可见或者不存在,不可见返回true,反之返回false

与invisibility_of_element_located用法相同,只是传递参数不同,一个传元素,一个传元组。

19)element_to_be_clickable:判断定位的元素是否可点击

 wait.until(element_to_be_clickable((By.ID, "su")), "错误")  # 判断定位的元素是否可点击

20)staleness_of:判断元素是否存在,存在若在等待的时间内被移除,则返回true

span = driver.find_element(By.ID, "su")
wait.until(staleness_of(span), "错误")  # 判断元素是否存在,存在若在等待的时间内被移除,则返回true

这里注意的是传递的参数是元素。

21)element_to_be_selected:判断元素是否被选中

id=driver.find_element(by=By.XPATH, value="//option[contains(text(),'2')]")
wait.until(element_to_be_selected(id),"失败")  # 判断可见元素是否选中

这里注意的是传递的参数是元素。

22)element_located_to_be_selected:判断定位的元素是否被选中,选中返回true,未选中返回false。

wait.until(element_located_to_be_selected((By.XPATH, "//option[contains(text(),'1')]")),"失败")  # 判断定位的元素是否被选中

与element_to_be_selected用法相同,不同的是传递的是元组。

23)element_selection_state_to_be:判断元素选中的状态是否符合预期

id=driver.find_element(by=By.XPATH, value="//option[contains(text(),'2')]")<br><br>wait.until(element_selection_state_to_be(id,False),"选中了")  # 判断元素是否被选中,并给出预期结果

与element_selection_state_to_be用法相同,不同的是传递的元组。

25)number_of_windows_to_be:判断当前打开的窗口是否符合预期。

wait.until(number_of_windows_to_be(1),"不是一个")  # 期望当前打开的窗口数为几个

26)new_window_is_opened:判断是否新打开了一个窗口。

hand = driver.window_handles  # 获取当前所有窗口的柄句
  print(len(hand))
  driver.find_element(by=By.XPATH, value="//a[contains(text(),'新闻')]").click()
  wait.until(new_window_is_opened(hand))  # 判断是否打开了一个新窗口

27)alert_is_present:判断页面是否有alert。

wait.until(alert_is_present(),"没有alert")  # 判断页面是否有alert

28)element_attribute_to_include:判断定位的元素是否存在预期的属性值。

这个我们就不做多余的介绍了,因为本身封装的就有问题,我们先来看下封装的原代码:

通过get_attribute(attribute_)获取属性值,若为none则返回false,否则返回不为none,其实这点是存在问题的

因为get_attribute(attribute_)当属性不存在时是什么都不会返回的,更不会返回none。

29)any_of:判断多个条件满足一个为true的话就返回true,相当于or逻辑

wait.until(any_of(alert_is_present(), element_attribute_to_include((By.TAG_NAME, "a"), "name")), "没有一个符合要求的")  # 多个判断条件有一个返回true,则返回True,or逻辑

30)all_of:判断多个条件必须都满足为true的话才返回true,相当于and逻辑

wait.until(all_of(alert_is_present(), element_attribute_to_include((By.TAG_NAME, "a"), "name")))  # 多个判断条件必须都满足,True,and逻辑

31)none_of:判断多个条件都返回false时,才能判断成功返回true

wait.until(none_of(alert_is_present(), element_attribute_to_include((By.TAG_NAME, "a"), "name")))  # 判断多个条件都返回flase时返回true,有一个返回true时则返回false

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

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

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

相关文章

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第三次作业

part 1 设计一个学籍管理小系统。系统包含以下信息&#xff1a; 学号、学生姓名、性别、出生日、学生所在系名、学生所在系号、课程名、课程号、课程类型&#xff08;必修、选修、任选&#xff09;、学分、任课教师姓名、教师编号、教师职称、教师所属系名、系号、学生所选课…

【GEE笔记】随机森林特征重要性计算并排序

随机森林是一种基于多个决策树的集成学习方法&#xff0c;可以用于分类和回归问题。在gee中可以使用ee.Classifier.smileRandomForest()函数来创建一个随机森林分类器&#xff0c;并用它来对影像进行分类。 随机森林分类器有一个重要的属性&#xff0c;就是可以计算每个特征&a…

计算机毕业设计springboot+ssm停车场车位预约系统java

管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为&#xff1a;1.停车超过预约时间段 2.预约未使用 于系统的基本要求 &#xff08;1&#xff09;功能要求&am…

class067 二维动态规划【算法】

class067 二维动态规划 code1 64. 最小路径和 // 最小路径和 // 给定一个包含非负整数的 m x n 网格 grid // 请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 // 说明&#xff1a;每次只能向下或者向右移动一步。 // 测试链接 : https://leetcode…

【腾讯云 HAI域探秘】StableDiffusionWebUI 让我找到了宫崎骏动漫里的夏天

目录 前言一、HAI二、应用场景三、构建 Stable Diffusion 模型1、新建HAI应用2、StableDiffusionWebUI&#xff08;1&#xff09;功能介绍&#xff08;2&#xff09;页面转中文&#xff08;3&#xff09;AI绘图① 正向提示词语② 反向提示词③ “” 、“ AND”、“|” 用法④ 权…

网上下载的pdf文件,为什么不能复制文字?

不知道大家有没有到过这种情况&#xff1f;在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很可能是…

基于MATLAB的BPSK调制解调仿真(仿真图超多,结果超清晰)

基于MATLAB的BPSK调制解调仿真(包含中间各个环节的时域波形、功率谱、频谱图、抽样后的星座图和眼图、理论与仿真的误码率曲线) 目录 前言 一、BPSK基本原理 二、BPSK调制解调过程 三、仿真结果 1、码元信噪比eb/n0-10dB时 1、双极性不归零基带信号 2、成型滤波(根升余弦…

uni-app应用设置 可以根据手机屏幕旋转进行 (横/竖) 屏切换

首先 我们打开项目的 pages.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏反方…

Other -- ChatGPT 原理

本文为个人理解&#xff0c;帮助小白&#xff08;本人就是&#xff09;了解正在创建新时代的 AI 产品&#xff0c;如文中理解有误欢迎留言。 [参考链接--](https://baijiahao.baidu.com/s?id1765556782543603120&wfrspider&forpc) 1. 了解一些基本概念 大语言模型&a…

安卓MediaRecorder(2)录制源码分析

文章目录 前言JAVA new MediaRecorder() 源码分析android_media_MediaRecorder.cpp native_init()MediaRecorder.java postEventFromNativeandroid_media_MediaRecorder.cpp native_setup() MediaRecorder 参数设置MediaRecorder.prepare 分析MediaRecorder.start 分析MediaRec…

[面试题~Docker] 云原生必问基础篇

文章目录 基础相关1. Docker 是什么&#xff1f;2. 镜像是什么3. 容器是什么4. 数据卷是什么5. Docker 和虚拟机的区别&#xff1f;6. Docker 常用命令有哪些&#xff1f; 原理相关1. docker 有几种网络模式host 模式container模式none模式bridge模式 2. docker 网络实现在Linu…

AGILE-SCRUM

一个复杂的汽车ECU开发。当时开发队伍遍布全球7个国家&#xff0c;10多个地区&#xff0c;需要同时为多款车型定制不同的软件&#xff0c;头疼的地方是&#xff1a; 涉及到多方人员协调&#xff0c;多模块集成和管理不同软件团队使用的设计工具、验证工具&#xff0c;数据、工…

C语言数据结构-基于单链表实现通讯录

文章目录 1 基础要求2 通讯录功能2.1 引入单链表的文件2.2 定义联系人数据结构2.3 打开通讯录2.4 保存数据后销毁通讯录2.5 添加联系人2.6 删除联系人2.7 修改联系人2.8 查找联系人2.9 查看通讯录 3 通讯录代码展示3.1 SeqList_copy.h3.2 SeqList_copy.c3.3 Contact.h3.4 Conta…

【论文阅读】Reachability and distance queries via 2-hop labels

Cohen E, Halperin E, Kaplan H, et al. Reachability and distance queries via 2-hop labels[J]. SIAM Journal on Computing, 2003, 32(5): 1338-1355. Abstract 图中的可达性和距离查询是许多应用的基础&#xff0c;从地理导航系统到互联网路由。其中一些应用程序涉及到巨…

免费开源-数字孪生城市污水处理平台

智慧城市污水处理平台&#xff0c;基于污水厂三维模型可视化场景&#xff0c;结合物联网IOT、视频监控以及综合运营数据&#xff0c;增加污水处理厂的掌控力度。飞渡科技利用数字孪生技术结合物联网IOT技术&#xff0c;直观展现各污水处理站点的整体建设规模&#xff0c;以及污…

pytorch:YOLOV1的pytorch实现

pytorch&#xff1a;YOLOV1的pytorch实现 注&#xff1a;本篇仅为学习记录、学习笔记&#xff0c;请谨慎参考&#xff0c;如果错误请评论指出。 参考&#xff1a; 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(YOL…

Windows Service Name重复问题

Windows Service Name重复问题 1&#xff0c;问题 2&#xff0c;打开命令提示符&#xff0c;管理员身份运行 3&#xff0c;输入命令&#xff1a;sc delete MYSQL57 4&#xff0c;验证一下&#xff0c;可以看见已经没有感叹号啦 &#xff0c;可以看见已经没有感叹号啦

基于Qt的Live2D模型显示以及控制

基于Qt的Live2D模型显示以及控制 基本说明 Live2D官方提供有控制Live2D模型的SDK,而且还提供了一个基于OpenGL的C项目Example,我们可以基于该项目改成Qt的项目&#xff0c;做一个桌面端的Live2D桌宠程序。 官方例子 经过改造效果如下图所示。 官方项目配置 下载官方提供的SD…

视觉检测系统在半导体行业的应用

一、半导体产业链概述 半导体产业链是现代电子工业的核心组成部分&#xff0c;涵盖了从原材料到最终产品的整个生产过程。这个产业链主要分为以下几个环节&#xff1a; 1.原材料供应&#xff1a;半导体行业的基石是半导体材料&#xff0c;如硅片、化合物半导体等。这些材料需要…

CentOS7安装Docker,DockerCompose

安装docker 1、卸载docker 查看是否有旧版本docker docker info首先检测我们虚拟机是否已经安装过Docker&#xff0c;如果安装则需卸载。代码中“\”符号为换行符&#xff0c;相当于一行内容分为多行&#xff0c;这是检测docker的各种组件 yum remove docker \docker-clien…