Selenium时间等待_显示等待

news2024/11/24 15:18:22
特点:
  • 针对具体元素进行时间等待

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

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

  • 如在设定时间内没定位到元素,则报错(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 until
    raise 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 webdriver

class 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 webdriver

class 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 webdriver

class 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:

    @classmethod
    def 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).text
                if need_wait:  # 是否触发隐式等待,返回实际提示信息结果
                    return msg
                else:
                    return True
            else:
                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.coloradmin.cn/o/1797662.html

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

相关文章

【Python报错】已解决NameError: name ‘secrets‘ is not defined

解决Python报错&#xff1a;NameError: name ‘secrets’ is not defined 在使用Python进行安全编程时&#xff0c;我们经常需要使用secrets模块来生成安全的随机数。然而&#xff0c;如果你在尝试使用这个模块时遇到了NameError: name secrets is not defined的错误&#xff0…

【机器学习】机器学习与智能交通在智慧城市中的融合应用与性能优化新探索

文章目录 引言机器学习与智能交通的基本概念机器学习概述监督学习无监督学习强化学习 智能交通概述交通流量预测交通拥堵管理智能信号控制智能停车管理 机器学习与智能交通的融合应用实时交通数据分析数据预处理特征工程 交通流量预测与优化模型训练模型评估 智能信号控制与优化…

安装TPMmanager

sudo apt-get install qt4-qmake sudo apt-get install libqt4-dev下载TPMManager&#xff0c;解压之后拖入Ubuntu&#xff0c;进入目录 https://gitcode.com/Rohde-Schwarz/TPMManager/overview?utm_sourcecsdn_github_accelerator&isLogin1 cd tpmmanager-master qmake…

【Spring Cloud】Gateway 服务网关核心架构的执行流程和断言

文章目录 基本概念执行流程断言内置路由断言工厂自定义路由断言工厂 总结 基本概念 路由(Route)是gateway中最基本的组件之一&#xff0c;表示一个具体的路由信息载体。主要定义了下面的几个信息&#xff1a; id&#xff1a;路由标识符&#xff0c;区别于其他Route。uri&…

centos系统清理docker日志文件

centos系统清理docker日志文件 1.查看docker根目录位置2.清理日志 1.查看docker根目录位置 命令&#xff1a;docker info ,将Docker Root Dir 的值复制下来。如果目录中包含 等特殊符号的目录&#xff0c;需要转义 2.清理日志 创建文件&#xff1a;vim docker_logs_clean.…

对GNSS辐射测试有疑问?德思特为您解答!

一、问题背景 在我们真实的环境中&#xff0c;GNSS信号是无处不在的&#xff0c;他通过从卫星辐射的形式覆盖地表。当我们想要使用GNSS模拟器进行测试时&#xff0c;一般有两种方式&#xff1a; ● 通过线缆直接连接待测件&#xff0c;无需额外环境与配置&#xff0c;即可进行…

问题:以下描写乡村词语的是() #媒体#媒体#知识分享

问题&#xff1a;以下描写乡村词语的是&#xff08;&#xff09; A&#xff0e;高楼林立 B&#xff0e;车水马龙 C&#xff0e;依山傍水 参考答案如图所示

智能售货机的商业潜力

智能售货机的商业潜力 1. 即时购物体验&#xff1a;在快节奏的生活中&#xff0c;人们往往缺乏闲暇去超市购物。智能售货机以其便捷性&#xff0c;提供了一种快速获取商品的方式&#xff0c;只需简单几步即可完成购买。 2. 全天候服务&#xff1a;智能售货机不受时间限制&…

黄金猛涨周大福却狂跌600亿搬厂裁员,年轻人血脉觉醒?

今年以来&#xff0c;有两样东西一直被吃瓜群众们津津乐道&#xff0c;一是AI的进化速度&#xff0c;二是黄金涨价的速度&#xff0c;并且时常霸占社交媒体热搜。‍‍‍‍‍‍‍‍‍ 尤其是黄金市场&#xff0c;更是一路上涨&#xff0c;快窜出天际了&#xff0c;不少吃瓜群众…

Qwen-2-7B和GLM-4-9B:“大模型届的比亚迪秦L”

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

车载以太网测试要测些什么呢?

车载以太网测试大致可以分成两块&#xff1a;TC8测试和以太网通信测试。 TC8测试全称TC8一致性测试&#xff0c;其规范由OPEN联盟制定&#xff0c;包括车载以太网ECU从物理层到应用层的各层互操作性以及常规基础功能服务。目的在于提高不同ECU之间的兼容性。 TC8测试规范可以…

用 OpenCV 实现图像中水平线检测与校正

前言 在本文中&#xff0c;我们将探讨如何使用 Python 和 OpenCV 库来检测图像中的水平线&#xff0c;并对图像进行旋转校正以使这些线条水平。这种技术可广泛应用于文档扫描、建筑摄影校正以及机器视觉中的各种场景。 环境准备 首先&#xff0c;确保您的环境中安装了 OpenC…

SpringBoot登录认证--衔接SpringBoot案例通关版

文章目录 登录认证登录校验-概述登录校验 会话技术什么是会话呢?cookie Session令牌技术登录认证-登录校验-JWT令牌-介绍JWT登录校验过滤器流程 SpringBoot案例通关版,上接这篇 登录认证 先讲解基本的登录功能 登录功能本质就是查询操作 那么查询完毕后返回一个Emp对象 如…

SpringSecurity6从入门到实战之登录表单的提交(源码级讲解,耐心看完)

SpringSecurity6从入门到实战之登录表单的提交(源码级讲解,耐心看完) 文接上回,当SpringSecurity帮我们生成了一个默认对象.本文继续对登录流程进行探索,我们如何通过账号密码进行表单的提交,SpringSecurity在这过程中又帮助我们做了什么 登录表单的提交的源码分析 在之前了解…

SITNE24V2BNQ-3/TR一种瞬态电压抑制器,对标PESD1CAN

SITNE24V2BNQ是一种瞬态电压抑制器&#xff0c;设计用于保护两个汽车控制器区域 网络(CAN)母线不受ESD等瞬变造成的损坏。 SITNE24V2BNQ采用SOT-23封装。标准产品不含铅和卤素。 产品参数 方向&#xff1a;双向通道数&#xff1a;2VRWM(V)(Max)&#xff1a;24IPP8/20μS(A)(M…

cad转换为空间数据库方案

autodesk cad 通过另存为dxf格式 如 dxf2010 或者dxf2012。 再通过supermap desktop 软件 可以转换为arcgis esri shape arcgis esri shape 可以用arcgis打开做建库操作。 可以通过第二个个人工具&#xff0c;读取cad设置的颜色&#xff0c;达到数据颜色gis中和cad中一致。 …

金鸣识别:助您快速识别竖排图片文字

大家有没有遇到过这种情况&#xff1f; 当你手捧一本古籍&#xff0c;或是浏览某些特殊的书籍时&#xff0c;文字却是从右到左竖向排版的。这种排版方式&#xff0c;仿佛让我们穿越到了古代&#xff0c;感受到了那种独特的韵味。但问题是&#xff0c;一般的OCR软件根本不支持这…

为何瑞士银行成了富人的“保险箱”?

​瑞士银行&#xff0c;这个名字大家耳熟能详&#xff0c;为啥呢&#xff1f;因为它被誉为“全球最安全银行”。那么&#xff0c;这“最安全”的名头是怎么来的呢&#xff1f;它的金库又藏在哪儿呢&#xff1f; 话说在1930年代&#xff0c;德国纳粹迫害犹太人&#xff0c;导致…

RBAC 模型梳理

1. RBAC 模型是什么 RBAC&#xff08;Role-Based Access Control&#xff09;即&#xff1a;基于角色的权限控制。通过角色关联用户&#xff0c;角色关联权限的方式间接赋予用户权限。 RBAC 模型由 4 个基础模型组成&#xff1a; 基本模型 RBAC0&#xff08;Core RBAC&#x…

Qwen2本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…