https://www.selenium.dev/documentation/webdriver/waits/

有时候我们需要等待网页上的元素出现后才能操作。selenium中可以使用以下几种方法等大元素。

直接time.sleep()

这个不用解释了吧....

time.sleep(秒)

隐式等待implicitly_wait

# 设置粘性超时以隐式等待找到元素或完成命令。
# 每个会话只需要调用一次此方法,针对所有元素都生效。
driver.implicitly_wait(2.5) 什么意思呢?就是你使用find_element()方法查找元素最长的等待时间,

显示等待WebDriverWait

实现该功能的核心为:WebDriverWait类

通过调用WebDriverWait 中的方法until或者until_not,并向其传递查找元素的方法。

until(method)方法:调用提供的method,直到返回值为True(也就是找到了元素)

unitl_not(method)方法:调用提供的method,直到返回值为False (也就是找不到元素...)

实际上until和until_not就是一个循环判断获取元素:看源码如下:

def until(self, method, message: str = ""):
"""Calls the method provided with the driver as an argument until the \
return value does not evaluate to ``False``. :param method: callable(WebDriver)
:param message: optional message for :exc:`TimeoutException`
:returns: the result of the last call to `method`
:raises: :exc:`selenium.common.exceptions.TimeoutException` if timeout occurs
"""
screen = None
stacktrace = None # 将当前时间+超时秒数,然后计算最长等待时间
end_time = time.monotonic() + self._timeout
# 死循环一直判断获取元素
while True:
try:
# 调用函数
value = method(self._driver)
# 如果有值就返回,此时就会跳出循环了
if value:
return value
except self._ignored_exceptions as exc:
screen = getattr(exc, "screen", None)
stacktrace = getattr(exc, "stacktrace", None)
# 没有找到值就sleep指定的秒数.self._poll是初始化WebDriverWait类时指定的,没有指定默认为0.5秒
time.sleep(self._poll)
# 判断当前时间是否超过了最长等待时间,超过了就跳出循环直接抛出异常!
if time.monotonic() > end_time:
break
raise TimeoutException(message, screen, stacktrace)

from selenium.webdriver.support.wait import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium import webdriver
**from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC **
from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.baidu.com') # 显式等待
WebDriverWait(driver, 20, 0.5).until(
EC.presence_of_element_located((By.LINK_TEXT, '好123'))
)
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在。默认就是0.5
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常 print(driver.find_element_by_link_text('好123').get_attribute('href')) driver.quit()

Selenium等待元素出现的更多相关文章

  1. [Selenium]等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的

    等待元素出现之后再消失,界面上的loading icon都属于这种类型,之前的方法总是卡死,换这种方法目前还好用的 /** * Check if the element present with cu ...

  2. selenium 等待元素加载

    今天,尝试用代码指定自动化测试用例. 将测试record导出为C# 代码后,使用FF的drive ,发现执行一直失败,提示无法加载元素.顿时一种无力感袭来啊.还是硬着头皮找方法.尝试id name x ...

  3. 【亲测显式等待】Selenium:元素等待的4种方法

    Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用.   2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...

  4. python selenium等待特定网页元素加载完毕

    selenium等待特定元素加载完毕 is_disappeared = WebDriverWait(driver, 8, 0.5, ignored_exceptions=TimeoutExceptio ...

  5. selenium界面元素定位

    一.        Selenium界面元素定位 本文元素定位以das2为例 #导入包 from selenium import  webdriver #打开火狐驱动 driver=webdriver ...

  6. selenium等待

    简介 在selenium操作浏览器的过程中,每一次请求url,selenium都会等待页面加载完成以后, 才会将操作权限在交给我们的程序. 但是,由于ajax和各种JS代码的异步加载问题,当一个页面被 ...

  7. python+selenium遇到元素定位不到的问题,顺便记录一下自己这次的错误(报错selenium.common.exceptions.NoSuchElementException)

    今天在写selenium一个发送邮件脚本时,遇到一些没有找到页面元素的错误.经过自己反复调试,找原因百度,终于解决了.简单总结一下吧,原因有以下几点: 一:Frame控件嵌套,.Frame/Ifram ...

  8. selenium中元素操作之浏览器窗口滚动&网页日期控件操作(js操作)(五)

    js的滚动条scrollIntoView() Arguments[] - python与js之间的羁绊 1.移动到元素element对象的“底端”,与当前窗口的“底部”对齐: driver.execu ...

  9. selenium定位元素的方法

    1.id定位: find_element_by_id() 从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框 代码: # coding = ...

  10. Helium文档8-WebUI自动化-wait_until等待元素出现

    前言 wait_until等待某个条件为真才继续往下执行.默认的超时时间为10s,每0.5查询一次,这俩参数选填.可以设置超时时间和轮询间隔. 可以作为添加后校验元素是否存在的场景 入参介绍 def ...

随机推荐

  1. 【Qt6】列表模型——抽象基类

    列表模型(Item Model),老周没有翻译为"项目模型",因为 Project 和 Item 都可以翻译为"项目",容易出现歧义.干脆叫列表模型.这个模型也 ...

  2. Go类型全解:常量与变量大全!

    本篇文章深入探讨了 Go 语言中类型确定值.类型不确定值以及对应类型转换的知识点,后续充分解析了常量与变量及其高级用法,并举出丰富的案例. 关注公众号[TechLeadCloud],分享互联网架构.云 ...

  3. JDK8升级JDK11最全实践干货来了

    1.前言 截至目前(2023年),Java8发布至今已有9年,2018年9月25日,Oracle发布了Java11,这是Java8之后的首个LTS版本.那么从JDK8到JDK11,到底带来了哪些特性呢 ...

  4. Solution -「洛谷 P6156」简单题

    Description Link. 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n(i+j)^kf(\gcd(i,j))\gcd(i,j)\). Solution ...

  5. 大白话带你认识JVM(转)

    转自微信公众号(JavaGuide) 前言 如果在文中用词或者理解方面出现问题,欢迎指出.此文旨在提及而不深究,但会尽量效率地把知识点都抛出来 一.JVM的基本介绍 JVM 是 Java Virtua ...

  6. Python基础——变量、常量、数字类型、四 列表list、五 字典dict、六 布尔bool、垃圾回收机制、用户交互、运算符、流程控制

    文章目录 变量 一 引入 一.什么是变量? 二.为什么要有变量? 三.怎么使用变量(先定义.后使用) 3.1.变量的定义与使用 3.2.变量名的命名规范 3.3.变量名的命名风格 3.4.变量值的三大 ...

  7. answer answerdev/answer:latest 开源问答平台

    freedidi.com/10294.html   https://youtu.be/A2GUgvPlTBE?si=jdhqXL1WttLrLgiQ     docker依赖 yum install ...

  8. LVGL双向链表学习笔记

    LVGL双向链表学习笔记 1.LVGL链表数据类型分析 对于LVGL双向链表的使用,我们需要关注lv_ll.h和lv_ll.c两个文件,其中lv_ll.h里面包含了链表结构类型定义,以及相关API的声 ...

  9. WPF性能优化:Freezable 对象

    Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象.冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象. Freezable的应用 我们 ...

  10. Nacos源码阅读心得

    Nacos注册中心(1.4.1)源码解读心得 一丶Nacos介绍 Nacos是阿里巴巴推出的一款新开源项目,是一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台.它致力于帮助您发现.配置和 ...