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_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()
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"))
我有一个带有 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_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()
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"))