【Selenium自动化测试】设置元素等待

1、为什么要设置等待

大多数Web应用程序都是使用Ajax和Javascript开发的。当浏览器加载页面时,我们想要与之交互的元素可能以不同的时间间隔加载,因此在交互时,目标元素可能还未加载出来,这样程序就会抛出ElementNotVisibleException的异常。为了解决此类问题,WebDriver 提供了两种类型的元素等待:显式等待和隐式等待。我们可以为元素设置等待,确保元素加载完成后再执行程序的操作,从而避免元素不可见的异常。

2、显式等待

WebDriver提供的WebDriverWait()会等待某个条件成立则继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)

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
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
ele = WebDriverWait(driver,5,0.5).until(
    EC.visibility_of_element_located((By.ID,'kw'))
    )
ele.send_keys("ChatGPT4")
sleep(5)
driver.quit()

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

  • driver:浏览器驱动。
  • timeout:最长超时时间,默认以秒为单位。
  • poll_frequency:检测的间隔(步长)时间,默认为0.5s
  • ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常。

WebDriverWait()一般与until()或until_not()方法配合使用,下面是until()和until_not()方法的说明

until(method, message=)
# 调用该方法提供的驱动程序作为一个参数,直到返回值为True
until_not(method, message=)
# 调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在上述例子中,通过 as 关键字将expected_conditions重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。
expected_conditions 类提供的更多预期条件判断方法如下:

方法说明
title_is判断当前页面的标题是否等于预期
title_contains判断当前页面的标题是否包含预期字符串
presence_of_element_located判断元素是否被加在DOM 树里,并不代表该元素一定可见
visibility_of_element_located判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0)
visibility_of与上一个方法作用相同,上一个方法的参数为定位,该方法接收的参数为定位后的元素
presence_of_all_elements_located判断是否至少有一个元素存在于DOM 树中。例如,在页面中有n 个元素的class 为“wp”,那么只要有一个元素存在于DOM 树中就返回True
text_to_be_present_in_element判断某个元素中的text 是否包含预期的字符串
text_to_be_present_in_element_value判断某个元素的value 属性是否包含预期的字符串
frame_to_be_available_and_switch_to_it判断该表单是否可以切换进去,如果可以,返回True 并且切换进去,否则返回False
invisibility_of_element_located判断某个元素是否不在DOM 树中或不可见
element_to_be_clickable判断某个元素是否可见并且是可以点击的
staleness_of等到一个元素从DOM 树中移除
element_to_be_selected判断某个元素是否被选中,一般用在下拉列表中
element_selection_state_to_be判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位
alert_is_present判断页面上是否存在alert

3、隐式等待

WebDriver 提供的implicitly_wait()方法可用来实现隐式等待;隐式等待将告诉Web驱动程序在它抛出“No Such Element Exception”之前等待一定的时间。默认设置为0.一旦我们设置了时间,Web驱动程序将在抛出异常之前等待该时间。

from time import ctime
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")

try:
    print(ctime())
    driver.find_element(By.ID,'kw').send_keys("selenium")
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()

implicitly_wait()的参数是时间,单位为秒,本例中设置的等待时间为10s。首先,这10s 并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它会等待页面上的所有元素。当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,则它将以轮询的方式不断地判断元素是否存在。假设在第6s 定位到了元素,则继续执行,若直到超出设置时间(10s)还没有定位到元素,则抛出异常。

4、显式等待与隐式等待的区别

  • implicitly_wait():隐式等待,是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
  • WebDriverWait():显示等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。

以上就是本期文章的所有内容,感谢观看,如果对您有帮助请点赞关注+收藏,一键三连,多谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值