我不明白这个概念:
wait.ignoring(StaleElementReferenceException.class).until
(ExpectedConditions.visibilityOfElementLocated(By.xpath("bla bla")));
换句话说,为什么我需要这个部分:
ignoring(StaleElementReferenceException.class)
,而
ExpectedConditions.visibilityOfElementLocated
等待元素可见,这样它就不会陈旧。
答案 0 :(得分:2)
简单来说,你可以像这样理解上面的代码。
ignoring(StaleElementReferenceException.class)
以上忽略用于忽略执行等待时可能发生的特定异常。例如,在StaleElementReferenceException发生时等待元素时,它将忽略该异常并且不会将异常抛出到外部。
在两种情况之一中引发陈旧元素引用异常,第一种情况比第二种情况更常见:
答案 1 :(得分:1)
告诉FluentWait
实例(这是WebDriverWait
基于什么)忽略异常的一般效果是,如果在轮询DOM时发生此类异常,它将继续轮询而不是让异常涓涓细流。
在ExpectedConditions.visibilityOfElementLocated
的特定情况下,明确忽略StaleElementReferenceException
没有任何好处,因为ExpectedConditions.visibilityOfElementLocated
已经忽略它。如果元素过时,则会在其中explicit try... catch...
block使其返回null
。我不知道旧版本的Selenium是否没有这个try... catch...
块。也许对于某些早期版本的Selenium,有必要明确告诉FluentWait
忽略此异常。
等待元素可见,这样它就不会陈旧。
ExpectedConditions.visibilityOfElementLocated
可能必须处理过时的元素。它分两步执行测试:
获取与用户通过的定位器对应的WebElement
。
在此元素上调用.isDisplayed()
。
在这两个步骤之间,可以更改DOM以使第一步中获取的元素在第二步中已经过时(==不再在文档中)一步一步。这是一个非常小的风险窗口,但它存在,因此必须处理。