Selenium时间等待_显示等待

特点:
  • 针对具体元素进行时间等待

  • 可以自定义等待时长和间隔时间

  • 按照设定的时间,不断定位元素,定位到了直接执行下一步操作

  • 如在设定时间内没定位到元素,则报错(TimeOutException)

显示等待概念:

设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就提示一个超时异常(TimeoutException)。

在使用显示等待时,需要结合Selenium的WebDriverWait和expected_conditions模块来实现。

  • WebDriverWait负责等待的设置,
  • expected_conditions模块提供了一系列常用的条件,可以根据具体的需求选择合适的条件
需要导入两个包
# 导入selenium模块中的WebDriverWait类,用于等待特定条件出现后再执行下一步操作
from selenium.webdriver.support.ui import WebDriverWait# 导入selenium模块中的expected_conditions模块的EC别名,用于定义预期条件
from selenium.webdriver.support import expected_conditions as EC
使用步骤:

1)初始化WebDriverWait对象,指定等待时间和浏览器驱动。

      eg:wait = WebDriverWait(driver, timeout=3)

2)调用until方法,传入要等待的条件。

     eg:wait.until(condition)

3)condition条件通过:expected_conditions as EC 调用指定条件

     eg:wait.until(EC.condition)

3)在until方法中,会不断地轮询条件是否满足,直到条件满足或超时时间到达。还有                 until_not()正好与until相反

4)条件满足后,继续执行后续代码。

5)如果超过超时时间后仍未满足条件,则抛出TimeoutException异常。

WebDriverWait参数说明:

WebDriverWait(driver, timeout=3).until(some_condition)
driver:浏览器驱动对象
timeout:最长等待时间

轮询时间:默认是以每500ms轮询一次,也可以指定
.until(some_condition):调用until()方法并传递一个特定的条件some_condition。该方法将等待直到条件满足或超时时间达到

这里是一个使用until()方法的例子,它等待页面标题包含特定文本:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 创建WebDriver实例,并指定使用Chrome浏览器驱动
driver = webdriver.Chrome()# 导航到菜鸟教程网页
driver.get("https://www.runoob.com/")# 显式等待直到页面标题包含“菜鸟教程”
wait = WebDriverWait(driver, 10)
title_contains_runoob = EC.title_contains("菜鸟教程")
title = wait.until(title_contains_runoob)# 输出页面标题
print(title)# 关闭浏览器
driver.quit()

这里是一个使用until_not()方法的例子,它等待文本框中的值被清除:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 创建WebDriver实例,并指定使用Chrome浏览器驱动
driver = webdriver.Chrome()# 导航到百度网页
driver.get("https://www.baidu.com")# 获取文本框元素并输入文本
input_elem = driver.find_element("css selector", "input[name='wd']")
input_elem.send_keys("python")# 显式等待直到文本框中的值被清除
wait = WebDriverWait(driver, 10)
value_cleared = EC.text_to_be_present_in_element_value(("css selector", "input[name='wd']"), "")
input_elem.clear()
wait.until_not(value_cleared)# 关闭浏览器
driver.quit()
expected_conditions as EC 条件方法

先导包

# 导入expected_conditions类,并取别名为 EC
from selenium.webdriver.support import expected_conditions as EC
条件1:title_is

检查页面标题的期望。title是预期的标题,必须完全匹配如果标题匹配,则返回True,否则返回false。

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver# 实例化驱动对象
driver = webdriver.Chrome()
driver.get("http://shop.aircheng.com/simple/login")# 显示等待 页面标题
# 等待10s
wait = WebDriverWait(driver, 5)
# 获取页面标题
title = driver.title  # 用户登录 - iWebShop商城演示
# title:"预期标题"  message:提示消息
wait.until(EC.title_is(title="用户登录 - iWebShop商城演示3"), message='标题不匹配')print(title)
# 不匹配报错
D:\Scripts\python.exe D:\桌面\Hualenium_demo_6_1\demo9\显示等待2.py Traceback (most recent call last):File "D:\桌面\HuaCe_Python\code_py\selenium_demo_6_1\demo9\显示等待2.py", line 15, in <module>wait.until(EC.title_is(title="用户登录 - iWebShop商城演示3"), message='标题不匹配')File "D:\桌面\HuaCe_Python\code_py\selenium_demo_6_1\venv\lib\site-packages\selenium\webdriver\support\wait.py", line 105, in untilraise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 标题不匹配
条件2:title_contains

检查标题是否包含区分大小写的子字符串。title是所需的标题片段当标题匹配时返回True,否则返回False

用法与title_is一样,唯一区别就是:

  • title_is是完全相等,
  • title_contains是包含
条件3:presence_of_element_located

检查元素是否存在于页面。这并不一定意味着元素是可见的。定位器-用于查找元素找到WebElement后返回该WebElemen

#导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriverclass Brouser:fox = webdriver.Firefox()wait = WebDriverWait(fox, 5)def get_url(self,url):self.fox.get(url)def presence_located(self,value,*ele):el = self.wait.until(EC.presence_of_element_located(ele),message='没有发现期望的元素')el.send_keys(value)if __name__ == '__main__':b = Brouser()b.get_url('http://shop.aircheng.com/simple/login')b.presence_located('qingan',By.NAME,'login_info')
条件4:visibility_of_element_located

检查元素是否存在于页面和可见。可见性意味着不仅显示元素但其高度和宽度也大于0。定位器-用于查找元素找到并可见WebElement后返回该WebElement

用法与presence_of_element_located一样,唯一区别就是:

  • visibility_of_element_located:检查元素是否出现,元素为:可见或不可见
  • presence_of_element_located:检查元素是否出现,元素必须为:可见
条件5:url_to_be

检查当前url的期望值。url是预期的url,必须完全匹配。如果url匹配,则返回True,否则返回false

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriverclass Brouser:fox = webdriver.Firefox()wait = WebDriverWait(fox, 5)def get_url(self,url):self.fox.get(url)def url_be(self,url):self.wait.until(EC.url_to_be(url))if __name__ == '__main__':b = Brouser()b.get_url('http://shop.aircheng.com/simple/login')b.url_be('http://shop.aircheng.com/simple/login')

判断url还有另外的几种方式,都大同小异

  • url_matches: 检查当前url的期望值。pattern是预期的模式,必须是完全匹配的如果url匹配,则返回True,否则返回false。
  • url_contains: 检查当前url是否包含区分大小写的子字符串。url是所需url的片段,url匹配时返回True,否则返回False
  • url_changes : 检查当前url的期望值。url是预期的url,不能完全匹配如果url不同,则返回True,否则返回false。
条件6:visibility_of

检查已知存在于页面的DOM是可见的。可见性意味着元素不仅仅是显示,但高度和宽度也大于0。元素是WebElement在WebElement可见时返回(相同的)WebElement

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriverclass Brouser:fox = webdriver.Firefox()wait = WebDriverWait(fox, 5)def get_url(self,url):self.fox.get(url)def visibility_(self,*ele):el = self.wait.until(EC.visibility_of(self.fox.find_element(*ele)))el.click()if __name__ == '__main__':b = Brouser()b.get_url('http://shop.aircheng.com/simple/login')b.visibility_(By.NAME, 'remember')

这里值得注意的是

visibility_of_element_located跟visibility_of很类似。与上面的写法不同EC.visibility_of里面写的是定位,而非单纯的元素。这也是一个区别点。在后续的使用中注意一下。

代码示例1
"""需求:等待页面出现标题"""# 创建WebDriver实例
driver = webdriver.Chrome()# 导航到网页
driver.get("https://www.csdn.net")# 等待页面标题包含"CSDN"
wait = WebDriverWait(driver, 5)
title_contains_csdn = EC.title_contains("CSDN")
wait.until(title_contains_csdn)# 输出页面标题
print(driver.title)
代码示例2
# 导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 默认是以每500ms轮询一次until中的条件,传入的超时时间是10s
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw'))) # 设置每1s轮询一次until中的条件,传入的超时时间是10s
WebDriverWait(driver,10,1).until(EC.presence_of_element_located((By.ID,'kw'))) 
 自定义封装-显示等待
class BackLogin:@classmethoddef wait(cls, driver, func):return WebDriverWait(driver, 5).until(func)# need_wait:形参代表默认值False不需要触发显示等待def find_element(self, by, value, driver, need_wait=False):def f(driver):# 判断当前元素是否有文本属性if driver.find_element(by, value).text:msg = driver.find_element(by, value).textif need_wait:  # 是否触发隐式等待,返回实际提示信息结果return msgelse:return Trueelse:return True# 类中可以通过self对象调用类方法self.wait(driver, f)return driver.find_element(by, value)

调用

# 获取实际结果
msg = BackLogin().find_element(*BackLogin.res_txt, driver,need_wait=True).text
print(msg)
assert msg == "验证码不能为空"

参考博客:Selenium 等待方式详解_selenium等待元素可见-CSDN博客

selenium--显示等待(中)--详解篇_presenceofelementlocated-CSDN博客

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

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

相关文章

mysql的binlog占用大量磁盘空间的解决方法

查看当前日志保存天数&#xff1a; mysql> show variables like %expire_logs_days%; ------------------------- | Variable_name | Value | ------------------------- | expire_logs_days | 0 | ------------------------- 1 row in set (0.08 sec) 默认是0&…

基于Python的实验室管理系统的设计与实现(论文+源码)_kaic

摘 要 随着实验室设备越来越多&#xff0c;实验室及其设备管理工作变得越来越繁重&#xff0c;还存在些管理模式仍旧处于手工管理模式和一些抢占实验室的不文明现象&#xff0c;传统的手工模式已经满足不了日益增长的管理需求&#xff0c;而本系统摒弃传统模式&#xff0c;开启…

高校运维赛 2024 pyssrf

没有环境,简单过一遍思路吧 考点: pickle反序列化urllib库注入redis缓存 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app Flask(__name__) redis Redis(host127.0.0.1, port6379)def get_result(u…

【Android面试八股文】Java中静态内部类是什么?和非静态内部类的区别是什么?

文章目录 Java中静态内部类是什么?和非静态内部类的区别是什么?这道题想考察什么?考察的知识点考生应该如何回答什么是内部类,什么是静态内部类?静态内部类非静态内部类静态内部类和非静态内部类的区别静态内部类和普通内部类都有各自的用途和优势扩展一:使用静态内部类来…

游戏心理学Day06

第三章 游戏即学习 第一节 行为主义心理学 行为主义心理学创立 &#xff08;三&#xff09;学习恐惧 1920年&#xff0c;华生进行了一个实验&#xff0c;训练小阿尔伯特害怕他原本喜欢的小鼠。他们将小鼠的出现与另一个令人讨厌的东西——锤子敲击钢条所产生的噪音相联系&…

路由黑洞处理

今天BGP基础实验碰到了路由黑洞 BGP承载于IGP之上&#xff0c;BGP路由天生要递归&#xff0c;才能找出口 在E的BGP去A&#xff0c;下一跳只有B&#xff0c;但是流量走了两条路&#xff0c;c和d BGP路由黑洞&#xff1a; 控制层面可达&#xff0c;数据层面不可达; 路由条目在BG…

软件分布式应用架构是什么?有什么特点?

软件分布式应用架构是一种软件架构模式&#xff0c;其特点在于将应用程序的不同部分分布在多个网络计算机上&#xff0c;这些计算机之间协同工作&#xff0c;以构成一个统一的环境。 分布式应用架构是指将一个大型的应用程序拆分成多个小的服务或组件&#xff0c;每个服务或组件…

前端经验:导出表格为excel并设置样式

应用场景 将网页上的table标签内容导出为excel&#xff0c;并且导出的excel携带样式&#xff0c;比如字色、背景色、对齐等等 实施步骤 必备引入包 npm install xlsx-js-style步骤1&#xff1a;准备好table table可以是已经存在与页面中的&#xff0c;也可以动态创建。 行…

Vue-插槽 Slots

文章目录 前言什么叫插槽简单插槽指定默认值多个插槽根据父级别名称指定区域显示(具名插槽)作用域插槽 前言 本篇文章不做过多的讲解与说明&#xff0c;只记录个人实验测试案例。 详见&#xff1a;vue 官方文档 插槽 slots 什么叫插槽 之前的博客中&#xff0c;父级组件可以…

06- 数组的基础知识详细讲解

06- 数组的基础知识详细讲解 一、基本概念 一次性定义多个相同类型的变量&#xff0c;并且给它们分配一片连续的内存。 int arr[5];1.1 初始化 只有在定义的时候赋值&#xff0c;才可以称为初始化。数组只有在初始化的时候才可以统一赋值。 以下是一些示例规则&#xff1a; …

Python网络安全项目开发实战:如何看清文件上传木马

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程:Python网络安全项目开发实战_看清文件上传木马_编程案例解析实例详解课程教程.pdf 在网络安全领域,Python以其强大的功能和灵活性成为了一种非常流行…

SVM模型实现城镇居民月平均消费数据分类

SVM模型实现城镇居民月平均消费数据分类 一、SVM支持向量机简介二、数据集介绍三、SVM建模流程及分析一、SVM支持向量机简介 支持向量机是由感知机发展而来的机器学习算法,属于监督学习算法。支持向量机具有完备的理论基础,算法通过对样本进行求解,得到最大边距的超平面,并…

常见代码版本管理工具

目录 一、引言 二、Gitee &#xff08;一&#xff09;优点与特点 &#xff08;二&#xff09;缺点 &#xff08;三&#xff09;使用报告 三、GitHub 四、SVN 五、总结 一、引言 在软件开发过程中&#xff0c;代码版本控制工具是不可或缺的。Gitee、GitHub和SVN是三种常…

6.6学习总结

一.算法练习(Codeforces Round 949 (Div. 2)和) B. Turtle and an Infinite Sequence 思路&#xff1a;对于数字而言&#xff0c;轮之后的结果是所有数的或。因此只需要求区间或就行了。(其实就是找区间左边界,二进制中的特殊位置,将后面的所有位都变成1,最后输出结果) 代码实…

如何通俗易懂地理解大模型参数?

大型语言模型 (LLM) 的大小是通过参数数量来衡量的。举几个典型例子&#xff0c;GPT-3 有 1750 亿个参数&#xff0c;1750亿也可称为175B&#xff08;1B 10亿&#xff09;&#xff0c;Meta最新开源的Llama3 参数数量在 80 亿到 700 亿之间&#xff0c;智谱公司最新开源的GLM4-…

pESC-HIS是什么,怎么看?-实验操作系列-2

01 典型的pESC-HIS质粒遗传图谱 02 介绍 质粒类型&#xff1a;酿酒酵母蛋白表达载体 表达水平&#xff1a;高拷贝 诱导方法&#xff1a;半乳糖 启动子&#xff1a;GAL1和GAL10 克隆方法&#xff1a;多克隆位点&#xff0c;限制性内切酶 载体大小&#xff1a;6706bp 5 测…

浅谈一下实例化

实例化对象是面向对象编程中非常重要的概念&#xff0c;它允许我们根据类的定义创建具体的对象&#xff0c;并操作这些对象的属性和方法。下面具体谈一下实例化对象的一些特点和用途&#xff1a; 封装性和复用性&#xff1a;实例化对象可以将数据和行为封装在一起&#xff0c;从…

C++_如何改变std::tuple中元素的值,即使是const?

1. 需求 第三方库库函数&#xff0c;使用了 const std::tuple<name, id> 作为参数, 当需要改变这里tuple中元素的值&#xff0c; 怎么办&#xff1f; 答&#xff1a; 使用引用传参数&#xff0c;如何使用引用呢&#xff1f; 见如下代码. 2. 代码 #include <iostre…

GitHub最大的开源算法库

GitHub 上最大的开源算法库 The Algorithms&#xff0c;值得每位算法工程师收藏&#xff01; 该库收录了 Python、Java、C、JavaScript、Go 等多种主流编程语言的算法实现代码。 其中包含二分查找、快速排序、斐波那契数列等众多热门算法&#xff0c;可以说是应用尽有。 此外&a…

程序代写,代码编写

Java 项目代做&#xff0c;小程序&#xff0c;安卓&#xff0c;鸿蒙&#xff0c;VUE 程序代写 Java调试安装、项目运行、代码代做、环境配置、工具安装、代码讲解、代码调试、代码运行、代码部署、项目调试、项目部署、Java Web、Spring Boot、项目设计、前后端分离、代码报错解…