我目前正在通过执行以下操作来检查WebElement是否过时:
public static boolean isStale(WebElement element) {
try {
element.click();
return false;
} catch (StaleElementReferenceException sere) {
return true;
}
}
这与此问题的解决方案相同:
Check for a stale element using selenium 2?
然而,这对我来说似乎相当混乱。有没有更简洁的方法可以检查元素是否陈旧,而不必抛出并捕获异常?
(另外,作为一方,如果我必须坚持投掷和捕捉异常,有什么比点击/发送键/悬停以抛出异常更好吗?我可能有一个我不喜欢的WebElement&#39 ; t想要执行任何这些操作,因为它可能会无意中影响其他内容。)
答案 0 :(得分:22)
Webdriver本身也使用try / catch-construction来检查陈旧性。
来自org.openqa.selenium.support.ui.ExpectedConditions.java的:
public static ExpectedCondition<Boolean> stalenessOf(final WebElement element) {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver ignored) {
try {
// Calling any method forces a staleness check
element.isEnabled();
return false;
} catch (StaleElementReferenceException expected) {
return true;
}
}
@Override
public String toString() {
return String.format("element (%s) to become stale", element);
}
};
}
isEnabled()检查比使用单击操作更好 - 单击元素可能会导致不必要的副作用,您只想检查元素的状态。
答案 1 :(得分:10)
我知道这已经有了一个已接受的答案,而且我不知道你如何使用陈旧性检查的更大背景,但这可能对你或其他人有所帮助。您可以让ExpectedConditions.stalenessOf(WebElement)
为您完成工作。例如,
WebElement pageElement = driver.findElement(By.id("someId"));
WebDriverWait wait = new WebDriverWait(webDriver, 10);
// do something that changes state of pageElement
wait.until(ExpectedConditions.stalenessOf(pageElement));
在这种情况下,您不必执行pageElement.click()
等操作来触发检查。
从文档中,.stalenessOf()
等待元素不再附加到DOM。
参考文献:ExpectedConditions
答案 2 :(得分:1)
C#的经典语句,用于检查Web元素的陈旧性
protected bool IsStale
{
get { return ExpectedConditions.StalenessOf(webElement)(WebDriver); }
}
答案 3 :(得分:0)
我不完全明白你想做什么。你对'凌乱'的解决方案是什么意思?
也许你可以使用明确的等待条件stalenessOf与not结合使用。 但是每一个解决方案对我来说似乎都不稳定。
我所做的是,我在帮助类中有一个点击例程,这个想法就像:
public void ClickHelper(WebDriver driver, By by){
int counter = 1;
int max = 5;
while (counter <= max) {
try {
WebElement clickableWebElement = driver.findElement(by);
clickableWebElement.click();
return;
} catch (StaleElementReferenceException e) {
System.out.print("\nTry " + counter + " with StaleElementReferenceException:\n" + e.getMessage() + "\n");
}
versuche++;
}
throw new RuntimeException("We tried " + max + " times, but there is still an Exception. Check Log!");
}
小心,我刚刚通过简化自己的方法进入了这个(有更多的检查,我个人使用xpath而不是等等)。可能会有一些错字错误,但我想你会明白基本的想法。由于我使用这个Helpermethode,我不必关心welelements的陈旧性。您可以更改最大值,但我个人认为,如果网站不稳定,元素过时,我会与开发人员交谈,因为这不是一个好的网站。