WebDriverWait.until.expected_conditions.presence_of_element_located 不等待重新加载 DOM

问题描述

我有一个带有 2 个按钮的应用。按钮 A 将应用带到一个没有按钮的新页面,然后返回到有 2 个按钮的页面。我的自动化测试是点击按钮 A,等待应用前往新页面并返回,然后点击按钮 B。

代码

    el05a = webdriverwait(driver,120).until(
        expected_conditions.presence_of_element_located((By.ID,"id_of_button_a"))
    )
    el05a.click()
    el05b = webdriverwait(driver,"id_of_button_b"))
    )
    el05b.click()

但是,我收到了关于按钮 B 不再位于 DOM 中的 StaleElementReferenceException。

显然,当应用程序处于新页面时,按钮 B 不会在 DOM 中,但是为什么我的代码不知道等待按钮 B 的存在?我认为presence_of_element_located 意味着代码将被暂停,直到元素被定位。

我知道这可以在“技术上”用 time.sleep 模块修补,但我正在努力避免这种情况。

解决方法

根据您的查询,它似乎就像您检查 presence_of_element_located 一样,它只检查它的存在,而不检查元素的可见性。

尝试用 presence_of_element_located 替换 visibility_of_element_located


visibility_of_element_locatedpresence_of_element_located 之间有区别。

1)visibility_of_element_located

检查元素是否存在于页面的 DOM 上并且可见。基本上它会测试我们正在寻找的元素是否存在以及在页面上可见。

2)presence_of_element_located

检查一个元素是否存在于页面的 DOM 上。基本上它会测试我们正在寻找的元素是否存在于页面的某个地方。

代码:

 el05a = WebDriverWait(driver,120).until(
        expected_conditions. visibility_of_element_located((By.ID,"id_of_button_a"))
    )
    el05a.click()
    el05b = WebDriverWait(driver,"id_of_button_b"))
    )
    el05b.click()
,

visibility_of_element_located:一旦 WebElement 被定位并可见,就返回它。

  • 期望检查元素是否存在于页面的 DOM 上并且可见。可见性意味着元素不仅被显示,而且其高度和宽度都大于 0。

presence_of_element_located:如果元素存在于 DOM 上并且甚至不可见,则返回 WebElement。

  • 期望检查某个元素是否存在于页面的 DOM 上。这并不一定意味着该元素是可见的。

请改成

expected_conditions.presence_of_element_located((By.ID,"id_of_button_a"))

expected_conditions.visibility_of_element_located((By.ID,"id_of_button_a"))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...