写在前面:
最近我在整理显性等待ec的方法的时候,忽然发现显性等待不止一种写法。我比较常用的是ec.presence_of_element_located 这个方法,但是居然发现还有其他的显性等待写法(amazing!! )让我感兴趣的是
ec.element_to_be_clickable
和 ec.presence_of_element_located
和 ec.visibility_of_element_located
这三个模块,因为它在我在解决 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.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的汇总
发表评论