写在前面:
最近我在整理显性等待EC的方法的时候,忽然发现显性等待不止一种写法。我比较常用的是EC.presence_of_element_located 这个方法,但是居然发现还有其他的显性等待写法(Amazing!! )让我感兴趣的是
EC.element_to_be_clickable
和 EC.presence_of_element_located
和 EC.visibility_of_element_located
这三个模块,因为它在我在解决 Exception 问题模块时,会用到的方法。于是让我产生了写这三者区别的想法。
这三者会用到的exception 出处:
这三个模块都是是 Selenium WebDriver 中 expected_conditions
(预期条件)模块的两个不同的函数,它们用于显式等待(Explicit Waits)中,以确保在执行某些操作之前页面上的元素满足特定的条件。
以下是他们的区别:
1. EC.presence_of_element_located
这个条件用于等待一个元素存在于DOM中。与可点击的 element_to_be_clickable 不同,它只检查元素是否存在,而不关心元素是否可见或可交互。
它适用于确保元素已经被加载到页面上,但不一定需要与元素进行交互。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myElement"))
)
这段代码会等待最多10秒钟,直到页面上存在一个ID为"myElement"的元素。
2. EC.element_to_be_clickable
它存在于DOM中,element_to_be_clickable 这个条件用于等待一个元素变得可点击,这意味着元素不仅需要是可见的,而且没有被其他元素遮挡,并且没有被禁用(例如,不是 display: none 或 visibility: hidden,并且没有 pointer-events: none 样式,pointer-events: none
的CSS属性不会阻止点击事件)。
它检查元素的可见性以及是否可以进行交互操作,如点击。
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "myElement"))
)
这段代码会等待最多10秒钟,直到页面上存在一个ID为"myElement"的元素,并且这个元素是可点击的。
3. EC.visibility_of_element_located
1.这个条件用于等待一个元素在页面上可见。一个元素被认为是可见的,如果它存在于DOM中,宽高都大于0,并且其CSS属性允许它被看到(例如,不是 display: none 或 visibility: hidden)。
2.它不检查元素是否可以交互,只关心元素是否能够被用户看到。
try:
# 等待直到页面上id为'myElement'的元素变得可见
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "myElement"))
)
# 一旦元素可见,可以执行进一步的操作,例如点击
# element.click()
except TimeoutException:
print("在指定时间内元素没有变得可见")
在这个示例中,我们使用 WebDriverWait 来等待最多10秒钟,直到页面上ID为 myElement 的元素变得可见。如果元素在这段时间内变得可见,我们可以对它执行进一步的操作;如果没有,将抛出TimeoutException。
4. 区别总结
EC.presence_of_element_located
关注的是元素的存在和可见性,而不考虑是否可进行点击操作。EC.element_to_be_clickable
不仅要求元素存在和可见,还要求元素可点击,即没有被其他元素覆盖,也没有禁用点击事件。visibility_of_element_located
:检查元素是否可见(存在且宽高大于0,没有被CSS隐藏)。
在实际使用中,如果我们需要等待一个元素以便与之交互(如点击),通常使用 EC.element_to_be_clickable,因为它确保了元素不仅加载完成,而且可以进行交互操作。
如果只是需要确认元素的存在,而不关心是否可交互,那么可以使用 EC.presence_of_element_located。
如果是确认元素是不是可见的,也不关心是否可交互,那么可以使用 EC.visibility_of_element_located。
PS:
如果想了解其他的【显性等待】中的expected_conditions 的方法,可以了解:【Python】Selenium WebDriver 中 expected_conditions(预期条件)模块
如果想要了解其他Exception的分类,可以了解:【Python】selenium的异常类selenium.common.exceptions的汇总