我有一些代码,其中未捕获预期的异常。我试图找到一个大部分时间都陈旧的元素。所以我循环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;
}
答案 0 :(得分:2)
我认为这里有不止一个问题。
首先,我希望你能给我们你的堆栈跟踪。我假设,异常被抛到别处,堆栈跟踪会告诉我们在哪里。
其次,在您编写了“element
”变量之后,您调用break;
语句,该语句将离开您的循环,因此不会抛出任何异常。
你可以自己检查一下。我假设你的for循环将在第一次迭代时退出。
因此删除break;
语句。
编辑:如果您正在运行单元测试,我可以打赌您在程序的实际方法中捕获了stalemateException(而不是测试)。如果异常被捕获,那么您的测试方法将不会收到它,因为它已被捕获。一个简单的尝试,看看是否是这种情况是在被捕获后再次抛出异常。例如:
catch (org.openqa.selenium.StaleElementReferenceException e) {
throw e;
}
但是不要将你的异常抛到你的Main类!抓住任何地方,可以处理异常。
答案 1 :(得分:0)
这是您的方法的替代方案。你基本上等待60秒(可自定义)元素变得陈旧。我从你的CSS选择器中拿出一点点,因为你(通常)不需要指定该元素在HTML
和BODY
标签中。
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;
}