python Selenium : wait until an element is no longer stale?

标签 python unit-testing selenium automation python-unittest

我有一种情况,我想等到一个元素不再过时,即直到一个元素连接到 DOM。以下等待选项以某种方式不起作用:

self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
self.wait.until(EC.presence_of_element_located((By.ID, "elementID")))

存在其相反的等待函数,该函数等待直到元素变得陈旧,即:

self.wait.until(EC.staleness_of((By.ID, "elementID")))

但我希望它等到元素不再陈旧,即直到它连接到 DOM。我怎样才能实现这个功能?

编辑:这里有一个解决方案:here但我正在寻找任何其他更好的方法。

最佳答案

陈旧元素是您存储的元素引用,它不再有效,因为页面、页面的一部分或可能只是元素被刷新。一个简单的例子

element = driver.find_element_by_id("elementID")
# do something that refreshes the page
element.click()

此处 element.click() 将抛出陈旧元素异常,因为引用在刷新之前存储但在之后使用(单击)刷新。在这种情况下,该引用不再有效。一旦引用过时,它就永远不会变得“过时”……该引用将永远无法再次使用。解决该问题的唯一方法是再次存储引用。

注意:您的代码示例对于 .staleness_of() 不正确。它采用 Web 元素引用,而不是定位器。您需要一个现有的引用来等待它过时。参见 the docs .

现在要解决问题...您需要等待刷新完成,然后获取新的引用

element = driver.find_element_by_id("elementID")
# do something that refreshes the element
self.wait.until(EC.staleness_of(element))
element = self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
# do something with element

Waiting for the element to become stale 等待元素引用丢失,这意味着元素已更改/刷新。一旦我们知道元素已经改变,我们现在就可以获得对它的新引用。在这种情况下,等待元素变得可见。我们现在有一个新的引用存储在我们的变量中,我们可以在没有陈旧元素异常的情况下使用它。

关于 python Selenium : wait until an element is no longer stale?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46968770/

相关文章:

java - 运行单元测试时 RmiRegistry 创建多次

c - 基本单元测试和 C,我如何开始?

python URL处理问题

ruby - 如何检查在另一个方法 rspec 中调用的方法的返回值?

python - PRAW/Tweepy 过滤关键字

java - 程序化浏览性能问题

java - Selenium WebDriver + Java - 如何为 Firefox 配置代理设置?

selenium - 参数异常 - 传递了主要参数,但在启动 Selenium Grid 节点时,您的 arg 类中未定义主要参数

python - Django 监听器听不到信号

Python 将宏添加到现有 XLSM