我需要将 "wait.ignoring" 添加到 "ExpectedConditions.visibilityOfElementLocated"

where I need to add "wait.ignoring" to "ExpectedConditions.visibilityOfElementLocated"

我不明白以下的概念:

wait.ignoring(StaleElementReferenceException.class).until
 (ExpectedConditions.visibilityOfElementLocated(By.xpath("bla bla")));

换句话说,为什么我需要这个部分:

ignoring(StaleElementReferenceException.class)

ExpectedConditions.visibilityOfElementLocated

等到元素可见,这样它才不会过时。

简单来说你可以这样理解上面的代码。

ignoring(StaleElementReferenceException.class)

上面的ignore用于忽略wait执行时可能发生的特定异常。例如,在等待元素时,如果发生 StaleElementReferenceException,它将忽略异常并且不会将异常抛出到外部。

在两种情况之一中抛出陈旧元素引用异常,第一种比第二种更常见:

  1. 该元素已被完全删除。
  2. 该元素不再附加到 DOM。

Stale Element Reference Exception Documentation

告诉 FluentWait 的实例(WebDriverWait 所基于的实例​​)忽略异常的一般效果是,如果在轮询 DOM 时发生此类异常,它将继续轮询,而不是让异常逐渐增加。

ExpectedConditions.visibilityOfElementLocated 的特定情况下,显式忽略 StaleElementReferenceException 没有任何好处,因为 ExpectedConditions.visibilityOfElementLocated 已经 忽略了它。如果元素陈旧,其中有一个 explicit try... catch... block 将使它成为 return null。我不知道旧版本的 Selenium 是否没有这个 try... catch... 块。也许对于某些早期版本的 Selenium,有必要明确告诉 FluentWait 忽略此异常。

waits till the element is visible so that it is not stale.

ExpectedConditions.visibilityOfElementLocated 可能必须处理过时的元素。它分两步执行测试:

  1. 获取与用户传递的定位器相对应的WebElement

  2. 对该元素调用 .isDisplayed()

在这两个步骤之间,DOM可能会发生变化,使得第一步获取的元素已经过时(==不再in 文档)到第二步运行时。这是一个非常小的 window 风险,但它存在,因此必须加以处理。