selenium三大等待

 一、强制等待

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() 

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

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

2024年Python自动化测试全套保姆级教程,70个项目实战,3天练完,永久白嫖...

三、显性等待

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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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/"), "不存在")  # 精准判断urldriver.quit()

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

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.wait import WebDriverWaitfrom 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.mzph.cn/news/603210.shtml

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

相关文章

Java与云平台开发:AWS、Azure与GoogleCloud

随着云计算的兴起&#xff0c;越来越多的企业和开发者开始将应用程序迁移到云端。AWS、Azure和Google Cloud是三家主要的云平台提供商&#xff0c;这些云平台提供各种计算资源和服务&#xff0c;帮助开发者构建、运行和扩展应用程序。在本文中&#xff0c;我们将重点讨论Java在…

Python处理音频文件两个非常重要库

pyaudio和sounddevice都是用于Python中音频处理和流的库&#xff0c;允许用户通过他们的API录制、播放和处理音频数据。下面是对这两个库的简要介绍&#xff1a; PyAudio PyAudio 提供了 Python 绑定到 PortAudio&#xff0c;这是一个跨平台的音频I/O库。它允许你很容易地使用…

Python+Torch+FasterCNN网络目标检测识别

程序示例精选 PythonTorchFasterCNN网络目标检测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonTorchFasterCNN网络目标检测识别》编写代码&#xff0c;代码整洁&#xff0c;规…

SQL Server从0到1——写shell

xp_cmdshell 查看能否使用xpcmd_shell&#xff1b; select count(*) from master.dbo.sysobjects where xtype x and name xp_cmdshell 直接使用xpcmd_shell执行命令&#xff1a; EXEC master.dbo.xp_cmdshell whoami 发现居然无法使用 查看是否存在xp_cmdshell: EXEC…

LeetCode 每日一题 Day 36 ||模拟/字典序(哈希策略)

383. 赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1…

PyQT5+MySQL的学生信息管理系统【附源码,运行简单】

PyQT5MySQL的学生信息管理系统【附源码&#xff0c;运行简单】 总览 1、《学生成绩管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 学生新增界面2.4 学生更改界面2.4 学生删除界面2.5 其他功能贴图 3、下载 总览 自己做的项目&a…

C语言 设置控制台字体及背景颜色

颜色函数SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),前景色 | 背景色 | 前景加强 | 背景加强); 前景色&#xff1a;数字0-15 或 FOREGROUND_XXX 表示 &#xff08;其中XXX可用BLUE、RED、GREEN表示&#xff09; 前景加强&#xff1a;数字8 或 FOREGROUND_INTENS…

使用Docker-Compose部署MySQL一主二从同步高可用MHA集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容准备mysql一主二从同步集群一主二从同步集群规划需要安装docker和docker-compose命令形式安装安装docker安装docker-compose 宝塔面板形式安装 部署Master节点的docker-compose.yaml文件部署MySQL从节点1的docker-compose.…

QOS(Quality of Service)基本原理及配置示例

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 由于QOS&#xff08;Quality of Service&#xff09;在报文上主要是更改特定字段进行流量的差异化服务&#xff0c;因此此处重点介绍各种服…

使用 C# Winfrom编写倒计时功能

在日常生活中&#xff0c;我们经常需要倒计时来提醒自己重要的时间节点&#xff0c;比如倒计时到达一个特定的日期和时间。介绍一个使用 C# 编写的倒计时应用程序的实现。 步骤一&#xff1a;应用程序的功能 它具有以下几个主要特点&#xff1a; 用户输入目标日期和时间&…

从零实现CLIP模型

1. 引言 CLIP代表语言图像对比预训练模型&#xff0c;是OpenAI于2021年开发的一个深度学习模型。CLIP模型中图像和文本嵌入共享相同的潜在特征空间&#xff0c;从而能够在两种模式之间直接进行对比学习。这是通过训练模型使相关的图像和文本更紧密地结合在一起&#xff0c;同时…

浅谈 JVM 类加载过程

&#x1f697;&#x1f697;&#x1f697;今天给大家分享的是HTTPS加密的工作过程。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈…

四. 基于环视Camera的BEV感知算法-BEVDistill

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

Transformer架构和对照代码详解

1、英文架构图 下面图中展示了Transformer的英文架构&#xff0c;英文架构中的模块名称和具体代码一一对应&#xff0c;方便大家对照代码、理解和使用。 2、编码器 2.1 编码器介绍 从宏观⻆度来看&#xff0c;Transformer的编码器是由多个相同的层叠加⽽ 成的&#xff0c;每个…

Auto tokenizer和Bert tokenizer的区别

"AutoTokenizer" 和 "BERT Tokenizer" 是两个不同概念&#xff0c;而不是两种不同的tokenizer。让我为您解释它们的含义&#xff1a; AutoTokenizer: "AutoTokenizer" 不是一个具体的tokenizer&#xff0c;而是 Hugging Face Transformers 库中提…

10款有趣的前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 自毁按钮动画特效 自毁按钮动画特效 点击打开盒子可以点击自毁按钮 进而会出现自毁…

【网络层】网际控制报文协议ICMP(湖科大慕课自学笔记)

网际控制报文协议ICMP 1&#xff1a;网际控制报文协议ICMP基本概述 ICMP报文被封装在IP数据报中发送 1&#xff1a;ICMP报文格式 ICMP报文作为IP数据报的数据载荷&#xff0c;IP协议为其添加一个首部使之成为IP数据报 2&#xff1a;ICMP报文类型 ICMP报文分为两大类&#x…

NGUI基础-三大基础组件之Event System(Uicameras)

目录 主要作用 相关参数 (建议&#xff1a;红色是重点&#xff0c;黑色的了解即可&#xff09; Event Type Events go to Process Events in Event Mask​编辑 Debug Command Click Allow Multi Touch Auto Hide Cursor Sticky ToolTip/Long press ToolTip/ToolTip…

vue实现点击复制功能方法封装demo。

源码如下 copyTextToClipboard(text, that) { const textArea document.createElement("textarea"); textArea.value text; document.body.appendChild(textArea); 在子节点末尾添加元素 textArea.select(); select方法讲解可以了解一下 JavaScri…

工业协议转换网关:打破通信壁垒,实现设备互联

在工业自动化领域&#xff0c;各种设备和系统间的通信协议不尽相同&#xff0c;这给不同设备间的集成和数据交互带来了挑战。工业协议转换网关作为一种解决这一问题的关键设备&#xff0c;能够实现不同协议间的转换和数据传输&#xff0c;打破通信壁垒&#xff0c;提高设备的协…