2012-12-21 41 views
2

我在一些輔助方法中打包了一些Selenium2 API調用,但是即使我正在捕獲它們,預期的異常也沒有被處理。下面的代碼:Try/Catch不處理來自Selenium2的異常FindElement

public static bool IsElementPresent(this IWebDriver driver, By by) 
{ 
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5)); 
    wait.IgnoreExceptionTypes(new Type[] { typeof(WebDriverException) }); 
    try 
    { 
     wait.Until(drvr => drvr.FindElement(by)); 
     return true; 
    } 
    catch (NoSuchElementException) 
    { 
     return false; 
    } 
    catch (System.TimeoutException) 
    { 
     return false; 
    } 
} 

在某些情況下,我測試對抗元素我希望是存在的,所以我趕NoSuchElementException異常並返回false;調用代碼看起來類似:

bool areYouThere = IsElementPresent(driver, By.CssSelector("li[name=elementThatsNotInTheDom"); 

wait.Until(drvr => drvr.FindElement(by));呼籲停止在調試器與「NoSuchElementException異常是由用戶代碼未處理的消息」,但我清楚地處理該異常。

這不是一個關鍵問題,因爲我不打算在我的最終解決方案中使用這種模式 - 我主要是玩弄不同的想法,並且有更好的方法來做到這一點,但我很好奇爲什麼當我明確處理它時,這個例外是未處理的。

編輯

有趣的是,即使我添加了一個通用的

catch (Exception) { 
    return false; 
} 

它仍然未捕獲的方法。

EDIT 2

其實我上面說錯 - 通用的異常最終被抓住了,但是當它到達那裏它作爲一個WebDriverTimeoutException。

這裏是阿哈!瞬間:

WebDriverWait.Until()只拋出WebDriverTimeoutException; .Net docs不完整,但Ruby docs稍微有啓發性。所以我認爲發生的事情是lambda引發了我期望的異常類,並且在適當的等待期後,WebDrierWait.Until()拋出WebDriverTimeoutException。我可以通過我的try/catch塊移動到拉姆達,正是如此證實了這一點:

wait.Until(drvr => { 
    try { 
     drvr.FindElement(by); 
     return true; 
    } catch (OpenQA.Selenium.NotFoundException) { 
     return false; 
    } catch (System.TimeoutException) { 
     return false; 
    } catch (Exception) { 
     return false; 
    } 
}); 

在這種情況下,適當的異常被捕獲。謎團已揭開!

+2

我無法說出您的異常處理問題,但通常我使用getElements()檢查缺少的元素,並在結果列表中檢查大小爲0。 –

+0

@BobPaulin這正是我的計劃。 – cori

+0

@cori,在這樣的時代,看看Selenium的來源:http://selenium.googlecode.com – Arran

回答

0

這可能是一個長鏡頭,但唯一的想法是,也許兩個NoSuchElementException類之間存在名稱衝突,並且您正在處理可從名稱空間訪問的代碼,而代碼正在拋出另一個。

+0

好想法,但不是;他們都是OpenQA.Selenium.NoSuchElementExeption。爲了安全起見,我想完全限定它,並試圖捕獲OpenQA.Selenium.NotFoundException,它是NoSuchElementException的父類 - 在任何情況下都沒有喜悅.... – cori