我在一些輔助方法中打包了一些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;
}
});
在這種情況下,適當的異常被捕獲。謎團已揭開!
我無法說出您的異常處理問題,但通常我使用getElements()檢查缺少的元素,並在結果列表中檢查大小爲0。 –
@BobPaulin這正是我的計劃。 – cori
@cori,在這樣的時代,看看Selenium的來源:http://selenium.googlecode.com – Arran