我正在将POM与Page Factory模式一起使用来测试我的应用程序。在执行测试期间,我随机获得staleElementException,即不在特定元素处。我知道可以通过放置ExpectedConditions.Refreshed(ExpectedCondition.VisiblityOfElement(Element))语句来处理,但是我的问题是我需要综合的东西来处理此异常,而不管它出现的元素如何。目前,如果它引发异常,那么只有我知道它可能会出现在这个地方。但是你们能建议我可以在每个元素之前使用的一些东西,以便如果出现它可以处理异常,否则它什么都不做。
public static boolean waitForElement(WebDriver driver, WebElement element, int maxWait) {
boolean statusOfElementToBeReturned = false;
WebDriverWait wait = new WebDriverWait(driver, maxWait);
try {
WebElement waitElement = wait.until(ExpectedConditions.visibilityOf(element));
if (waitElement.isDisplayed() && waitElement.isEnabled()) {
statusOfElementToBeReturned = true;
}
}
catch (Exception e) {
statusOfElementToBeReturned = false;
}
return statusOfElementToBeReturned;
}
答案 0 :(得分:0)
您可以使用经过测试和验证的解决方案,例如下面的Give。
for (int i=0; i<10; i++){
try{
WebElement e1 = driver.findelement(by.id("elementid"));
e1.click();\\do the respective operation on the element
break; \\break the for loop if element found in first
line.
}
catch(StaleReferenceException ex){
\\In case of element no found, driver will land in
this block.
}
}
尝试此解决方案,让我知道它是否对您有用,当驱动程序通过后在DOM中找不到元素引用或元素附加在DOM中时,就会发生过时的引用异常。
答案 1 :(得分:0)
这是由于访问了DOM中不再存在的元素。
此外,在不存在的元素上调用isDisplayed()函数将导致NoSuchElementException
所以我建议将您的代码重构为:
public static boolean waitForElement(WebDriver driver, By by, int maxWait) {
WebDriverWait wait = new WebDriverWait(driver, maxWait);
try {
WebElement waitElement = wait.until(ExpectedConditions.presenceOfElementLocated(by));
if (waitElement.isDisplayed() && waitElement.isEnabled()) {
return true;
}
} catch (Exception e) {
return false;
}
return false;
}
或者甚至更好地考虑实施Page Object Model design pattern,因为在这种情况下PageFactory将负责查找元素,等待元素等。