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

时间:2015-10-20 20:25:13

标签: java selenium selenium-webdriver selenium-chromedriver

我不明白这个概念:

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

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

ignoring(StaleElementReferenceException.class)

,而

ExpectedConditions.visibilityOfElementLocated

等待元素可见,这样它就不会陈旧。

2 个答案:

答案 0 :(得分:2)

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

ignoring(StaleElementReferenceException.class)

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

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

  1. 该元素已被完全删除。
  2. 该元素不再附加到DOM。
  3. Stale Element Reference Exception Documentation

答案 1 :(得分:1)

告诉FluentWait实例(这是WebDriverWait基于什么)忽略异常的一般效果是,如果在轮询DOM时发生此类异常,它将继续轮询而不是让异常涓涓细流。

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

  

等待元素可见,这样它就不会陈旧。

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

  1. 获取与用户通过的定位器对应的WebElement

  2. 在此元素上调用.isDisplayed()

  3. 在这两个步骤之间,可以更改DOM以使第一步中获取的元素在第二步中已经过时(==不再文档中)一步一步。这是一个非常小的风险窗口,但它存在,因此必须处理。