2015-09-21 95 views
0

我有一些代碼,其中預期的異常沒有被捕獲。我試圖找到一個大部分時間都會過時的元素。所以我循環60次嘗試獲取元素之前我得到一個元素未發現異常。即使我仍然收到一個陳舊的元素異常,它也不會打印出它捕獲到異常。For循環捕獲Java中的異常

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

你最有可能趕上一個不同的'Exception'類... – Codebender

+0

org.openqa.selenium.StaleElementReferenceException:{「消息」:「元素不緩存存在」} 是例外即時得到當測試失敗時。 –

+2

在這種情況下,異常被引發到別處.. [檢查你的stacktrace以查明位置](http://stackoverflow.com/q/3988788/2775450)並調試它... – Codebender

回答

2

我認爲這裏有不止一個問題。

首先,我希望你給我們你的堆棧跟蹤。我猜,這個異常是在其他地方拋出的,堆棧跟蹤會告訴我們在哪裏。第二,在你寫完你的「element」變量之後,你會調用一個break;語句,這將會離開你的循環,因此不會拋出異常。 你可以自己檢查一下。我假設你的for循環將在第一次迭代時退出。

因此刪除break;聲明。

編輯:如果您正在運行單元測試,我可以打賭你在程序的實際方法(而不是測試)中發現了stalemateException。如果發現異常,那麼您的testmethod將不會收到它,因爲它已被捕獲。一個簡單的嘗試,看看是否屬於這種情況是在發現異常後再拋出異常。例如:

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

    throw e; 
} 

但是不要把你的異常提升到你的Main類!在任何可以處理異常的地方抓住它。

+0

事情是我張貼的代碼工作正常。 (當我想讓它突破時,它會中斷)。這個問題來自我想單擊元素的時候。似乎它想讓我嘗試並抓住它。歡呼我能夠調試這個問題,它現在可以工作。 –

+0

很好聽:) –

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; 
}