如何处理随机发生的staleElementException。就我而言,它会随机抛出异常

时间:2019-07-19 08:45:32

标签: selenium-webdriver

我正在将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;
}

2 个答案:

答案 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将负责查找元素,等待元素等。