Python Selenium:等到元素不再陈旧?

Haz*_*ziq 9 python selenium automation unit-testing python-unittest

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

self.wait.until(EC.visibility_of_element_located((By.ID, "elementID")))
self.wait.until(EC.presence_of_element_located((By.ID, "elementID")))
Run Code Online (Sandbox Code Playgroud)

存在其相反的等待函数,它会等待元素变得陈旧,即:

self.wait.until(EC.staleness_of((By.ID, "elementID")))
Run Code Online (Sandbox Code Playgroud)

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

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

Jef*_*ffC 6

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

element = driver.find_element_by_id("elementID")
# do something that refreshes the page
element.click()
Run Code Online (Sandbox Code Playgroud)

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

注意:您的代码示例不适用于.staleness_of(). 它需要一个 web 元素引用,而不是一个定位器。您需要一个现有的引用来等待它过时。请参阅文档

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

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
Run Code Online (Sandbox Code Playgroud)

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


Sha*_*aiz -2

WebDriverWait(browser, waitTime).until(EC.presence_of_element_located(
                (By.XPATH or By.id or w/e you want, " xpath or id name")))
Run Code Online (Sandbox Code Playgroud)