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

WebDriverWait.until.expected_conditions.presence_of_element_located not waiting for reloaded DOM

我有一个带有 2 个按钮的应用程序。按钮 A 将应用程序带到一个没有按钮的新页面,然后 returns 到有 2 个按钮的页面。我的自动化测试旨在点击按钮 A,等待应用程序前往新页面和 returns,然后点击按钮 B。

代码:

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

但是,我收到一个 StaleElementReferenceException,关于按钮 B 不再在 DOM 中。

显然,当应用程序位于新页面时,按钮 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, 120).until(
        expected_conditions. visibility_of_element_located((By.ID, "id_of_button_b"))
    )
    el05b.click()

visibility_of_element_located:Returns WebElement 一旦找到并可见。

  • 期望检查元素是否出现在页面的 DOM 上并且可见。可见性是指该元素不仅显示而且高度和宽度都大于0。

presence_of_element_located: Returns WebElement 如果元素出现在 DOM 上,甚至不可见。

  • 期望检查元素是否存在于页面的 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"))