4-selenium自动化中的元素等待

selenium自动化中的元素等待

一、设置元素等待

很多页面都使用 ajax 技术,页面的元素不是同时被加载出来的,如果遇到使用ajax加载的网页,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。

1、显式等待

设置一个超时时间,每个一段时间就去检测一次该元素是否存在,如果存在则执行后续内容,如果超过最大时间(超时时间)则抛出超时异常(TimeoutException)。

显示等待需要使用 WebDriverWait,同时配合 untilnot until

# WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
"""
driver:浏览器驱动
timeout:超时时间,单位秒
poll_frequency:每次检测的间隔时间,默认为0.5秒  [poll]:轮测 [frequency]:频次
ignored_exceptions:指定忽略的异常  [ignored]:忽略 [exceptions]:异常处理
如果在调用 until 或 until_not 的过程中抛出指定忽略的异常,则不中断代码,默认忽略的只有 NoSuchElementException 
[NoSuchElementException]:Selenium中的一个异常类,它表示在查找元素时未能找到指定的元素
"""

method 中的预期条件判断方法是由 expected_conditions 提供,下面列举常用方法。

请添加图片描述

下面来使用一下

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
# 定义一个定位器
locator = (By.ID, 'kw')


# until(method, message=’ ‘)
# until_not(method, message=’ ')
"""
method:指定预期条件的判断方法,在等待期间,每隔一段时间调用该方法,判断元素是否存在,直到元素出现。until_not 正好相反,当元素消失或指定条件不成立,则继续执行后续代码
message: 如果超时,抛出 TimeoutException ,并显示 message 中的内容
"""
element = WebDriverWait(driver, 5, 0.5,).until(
 EC.presence_of_element_located(locator), message='超时啦!')

# 退出
driver.quit()

运行后报错是设置的message

请添加图片描述

下面用ignored_exceptions:指定忽略的异常:

# 前面的代码与上方的例子一样
wait = WebDriverWait(driver, 5, 0.5, (TimeoutException, StaleElementReferenceException)
                     )

try:
 element = wait.until(EC.presence_of_element_located(locator))
 print("元素已找到")
 element.click()
except TimeoutException:
 print("等待超时")
except StaleElementReferenceException:
 print("元素已失效")
finally:
 driver.quit()

# 退出
driver.quit()

因为ignored_exceptions默认就会忽略异常,所以我定义为None重新实验,发现运行结果还是没有报错,并且输出 等待超时

经过一晚上的实验报错之后,AI如是答道:

ignored_exceptions参数在WebDriverWait中的作用是指定在等待期间忽略的异常类型,并不会阻止程序终止。当等待超时或出现指定的异常时,程序仍然会引发异常并终止。如果希望在出现异常时不终止程序,可以使用try-except语句块来捕获并处理异常。

所以它的作用是忽略异常,在上述的用例中被忽略的异常是没有被找到的那个元素,本应该没找到就停止运行的,但是继续等待程序响应了。而报错的内容是因为设定的时间到了,最终等待超时。

这是AI原话:在等待期间,如果出现NoSuchElementException异常,WebDriverWait将会忽略该异常并继续等待。在try语句块中,我们尝试等待一个不存在的元素,这会引发NoSuchElementException异常。但由于我们已经将该异常添加到忽略列表中,所以程序不会终止,而是继续等待。最终,等待超时,程序打印出"等待超时"的提示信息。

通过使用ignored_exceptions参数,我们可以指定在等待期间要忽略的异常类型,从而使程序能够继续执行而不会因为异常而终止。

在WebDriverWait中,ignored_exceptions参数不能用于忽略TimeoutException异常。TimeoutException异常是由WebDriverWait自身引发的,它表示等待超时。

如果在等待期间发生了TimeoutException异常,程序会立即引发该异常并终止,而不会继续等待。因此,ignored_exceptions参数不能用于忽略TimeoutException异常。

2、隐式等待

隐式等待也是指定一个超时时间,如果超出这个时间指定元素还没有被加载出来,就会抛出 NoSuchElementException 异常。
除了抛出的异常不同外,还有一点,隐式等待是全局性的,即运行过程中,如果元素可以定位到,它不会影响代码运行,但如果定位不到,则它会以轮询的方式不断地访问元素直到元素被找到,若超过指定时间,则抛出异常。

使用 implicitly_wait() 来实现隐式等待,使用难度相对于显式等待要简单很多。

请添加图片描述

3、强制等待

time.sleep() 没啥好说的,设置几秒等几秒

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JC03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值