用于在Java中捕获异常的循环

时间:2015-09-21 08:35:56

标签: java selenium selenium-webdriver

我有一些代码,其中未捕获预期的异常。我试图找到一个大部分时间都陈旧的元素。所以我循环60次尝试获取元素之前我得到一个元素未找到异常。它没有打印出它捕获异常,即使我仍然得到陈旧的元素异常。

public static WebElement DropDown(WebDriver driver) throws InterruptedException
{
    WebElement element = null;
    for (int i = 0; i < 60; i++)
    {
        try
        {
            element = driver.findElement(By.cssSelector("html body div.navbar.navbar-inverse.main-navbar "));
            break;
        }
        catch (org.openqa.selenium.StaleElementReferenceException e)
        {
            System.out.println("Caught an Staleelement exception");
        }

        Thread.sleep(1000);
    }

    return element;
}

2 个答案:

答案 0 :(得分:2)

我认为这里有不止一个问题。

首先,我希望你能给我们你的堆栈跟踪。我假设,异常被抛到别处,堆栈跟踪会告诉我们在哪里。

其次,在您编写了“element”变量之后,您调用break;语句,该语句将离开您的循环,因此不会抛出任何异常。 你可以自己检查一下。我假设你的for循环将在第一次迭代时退出。

因此删除break;语句。

编辑:如果您正在运行单元测试,我可以打赌您在程序的实际方法中捕获了stalemateException(而不是测试)。如果异常被捕获,那么您的测试方法将不会收到它,因为它已被捕获。一个简单的尝试,看看是否是这种情况是在被捕获后再次抛出异常。例如:

catch (org.openqa.selenium.StaleElementReferenceException  e) {

    throw e;
}

但是不要将你的异常抛到你的Main类!抓住任何地方,可以处理异常。

答案 1 :(得分:0)

这是您的方法的替代方案。你基本上等待60秒(可自定义)元素变得陈旧。我从你的CSS选择器中拿出一点点,因为你(通常)不需要指定该元素在HTMLBODY标签中。

public static WebElement DropDown(WebDriver driver)
{
    WebDriverWait wait = new WebDriverWait(driver, 60);
    WebElement element = driver.findElement(By.cssSelector("div.navbar.navbar-inverse.main-navbar"));
    wait.until(ExpectedConditions.stalenessOf(element));
    return element;
}