首页 > Python资料 博客日记

【Python】selenium 的EC.presence_of_element_located 和 EC.element_to_be_clickable 的区别

2024-09-20 08:00:05Python资料围观44

Python资料网推荐【Python】selenium 的EC.presence_of_element_located 和 EC.element_to_be_clickable 的区别这篇文章给大家,欢迎收藏Python资料网享受知识的乐趣

写在前面:

最近我在整理显性等待EC的方法的时候,忽然发现显性等待不止一种写法。我比较常用的是EC.presence_of_element_located 这个方法,但是居然发现还有其他的显性等待写法(Amazing!! )让我感兴趣的是

EC.element_to_be_clickableEC.presence_of_element_locatedEC.visibility_of_element_located这三个模块,因为它在我在解决 Exception 问题模块时,会用到的方法。于是让我产生了写这三者区别的想法。

这三者会用到的exception 出处:

  1. 【Python】selenium使用find_element时解决【StaleElementReferenceException】问题的方法
  2. 【Python】selenium 点击某个按钮 click() 出现的报错问题–ElementClickInterceptedException(全!)

这三个模块都是是 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的汇总


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐