【问题标题】:WebDriverWait.until.expected_conditions.presence_of_element_located not waiting for reloaded DOMWebDriverWait.until.expected_conditions.presence_of_element_located 不等待重新加载 DOM
【发布时间】:2021-10-03 04:19:59
【问题描述】:

我有一个带有 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, 120).until(
        expected_conditions.presence_of_element_located((By.ID, "id_of_button_b"))
    )
    el05b.click()

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

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

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

【问题讨论】:

  • 你可以试试visibility_of_element_located而不是presence_of_element_located?
  • 成功了。您能否将其发布为答案,以便我将此问题标记为已回答?
  • 当然.. 我会发布一个答案 :) 很高兴它有帮助

标签: selenium appium webdriverwait python-appium


【解决方案1】:

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

尝试将presence_of_element_located 替换为visibility_of_element_located。


visibility_of_element_located 和 presence_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()

【讨论】:

    【解决方案2】:

    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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多