史上最全的Selenium三大等待介绍

2023-11-09

 一.强制等待

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

三.显性等待

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

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

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最全的Selenium三大等待介绍 的相关文章

随机推荐

  • 笔记本屏幕忽亮忽暗解决方法大全,总有一款适合你

    笔记本屏幕忽亮忽暗解决方法大全 导言 傻逼Intel的傻逼设计 其原本目的是想在屏幕显示暗的东西时能有更高的暗部表现 或者 顺便省电 实际上眼睛导致干涩流泪 解决方法一 在Intel图形设置关闭Intel节能技术 解决方法二 在intel控
  • Element按需引入

    ElementUI网址 https element eleme cn zh CN component quickstart 1 1 安装 babel plugin component npm install babel plugin com
  • Windows网络守门人UserLock教程:如何分配登录时间配额

    UserLock是您的Windows网络守门人 它可以轻松实现有效的Windows和Active Directory网络用户访问控制策略 并严格执行 在UserLock中我们可以定义时间配额规则以限制所选会话类型的周期性连接时间 接下来 我
  • 法将数据写入传输连接: 你的主机中的软件中止了一个已建立的连接_LabVIEW_基于Network Steams 的无损传输技术...

    LabVIEW提供了用于创建分布式应用程序的多种技术的访问权限 LabVIEW 2010中引入的网络流是在这些应用程序之间流传输数据的理想方法 使用网络流 您可以轻松地在网络上或同一台计算机上共享数据 本文是对网络流进行介绍 并讨论了其功能
  • 【通俗易懂】vue中loading功能实现方法

    效果图 我是点击后让他出现loading效果 上代码
  • STM32MP157 AP6236 WiFi蓝牙模块

    STM32MP157 AP6236 WiFi蓝牙模块 1 介绍 2 修改设备树 3 配置Linux内核 3 1 配置支持WiFi设备 3 2 配置支持IEEE 802 11 3 3 配置支持蓝牙 4 配置Buildroot 5 板子配置 6
  • Vue + axios + vant 封装公共请求

    import axios from axios 引入axios import router from router 引入路由 import Toast from vant 引入提示层 export function post obj 调用时
  • 线程的声明周期

    要想实现多线程 必须在主线程中创建新的线程对象 JAVA中使用Thread类及其子类的对象来表示线程 在它的完整的生命周期一般要包括5类 新建 当一个Thread类或子类的对象被声明并创建时 新生的线程对象就处于新建状态 就绪 处于新建状态
  • Matlab读取csv文件csvread函数的使用

    方法一 M csvread FILENAME 读取逗号分隔值格式的文件名 结果直接返回给M 因此 文件只能包含数值 方法二 M csvread FILENAME R C 从逗号分隔值格式的文件中读取数据 从R行和C列开始 R和C从零开始 因
  • PHP cURL获取HTTP响应头

    前言 平时做开发时 经常会用到PHP的cURL扩展 用于请求外部HTTP接口 大多数情况下 我们只需要获取接口返回的响应体 HTTP response body 但如果我们想获取响应头 HTTP response header 那可以怎么做
  • Mac-解决程序包javafx.util不存在

    环境 macos m1芯片 IDEA jdk zulu 8 jdk 1 8 0 322 支持m1芯片的 解决方式 1 更换jdk版本 不使用支持m1芯片的jdk 到官网 链接下载macos的jdk1 8 0 333 且下载成功之后不需要配置
  • Eclipse调整XML源代码文件字体大小

    Eclipse调整XML源代码文件字体大小 Window gt Preferences gt General gt Appearance gt Colors and Fonts gt Basic gt Text Font 点击Edit 设置
  • 简单的书签服务LinkDing

    今天是上海全域静态管理的第 29 天 周三抗原 周四老苏刚做完核酸 居委突然通知后面的不做了 大家一阵慌乱 结果后来又通知继续 这是要闹哪样 据说是怕系统崩溃 周五终于休息了 根据居委会的通告 周二的核酸又发现一管异常 希望昨天的复检正常吧
  • Codeforces Round#808 div.1+div.2题解

    视频讲解 BV1ya411S7KF div 2 A Difference Operations 题目大意 给定长度为 n n n 的数组 a a a 可以进行任意次操作 每次操作选择一个整数
  • Android高德地图获取当前缩放等级及可视区域四个角的坐标

    获取当前缩放等级 未开启定位图层 在fragment中oncreatview生命周期中无法获取到 可以在Onresume中获取 float zoom mAMap getCameraPosition zoom VisibleRegion vi
  • 第5章域内横向移动分析及防御

    域内横向移动投不定在夏杂的内网攻击中被广泛使用的一种技术 尤其是在高级持续威胁 Advanced Persistent Threats APT中 攻击者会利用该技术 以被攻陷的系统为跳板 访问其他域内主机 扩大资产范围 包括跳板机器中的文档
  • 三千预算进卡吧的顺口溜是啥

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 三千预算进卡吧 加钱加到十万八 十核 E7装上去 四路泰坦抱回家 4K 屏幕组三屏 万元液态温度压 固态硬盘装三块 硬盘内存使劲加 键鼠必花几千元 耳机手柄八千八 还有机箱
  • Java异常————argument type mismatch

    今天写程序遇到的错误 Exception in thread main java lang IllegalArgumentException argument type mismatch argument type mismatch 参数类
  • 简单几步:实现Redis的访问

    一 导入jar包 这里有两个 jedis 2 9 0 jar commons pool2 2 4 2 jar 二 写一个工具类 我叫做 RedisTools类 代码如下 import redis clients jedis JedisPoo
  • 史上最全的Selenium三大等待介绍

    一 强制等待 1 设置完等待后不管有没有找到元素 都会执行等待 等待结束后才会执行下一步 2 实例 driver webdriver Chrome driver get https www baidu com time sleep 3 设置