问题描述
我有一个带有 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_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,"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"))