问题描述
即使我的代码包含在try块中,我仍然遇到未处理的异常, “ OpenQA.Selenium.NoSuchElementException类型的异常在WebDriver.dll中发生,但未在用户代码中处理。
代码如下:
try
{
webdriverwait wait = new webdriverwait(driver,TimeSpan.FromSeconds(timeout));
switch (findBy)
{
case SeleniumFindBy.ById:
itemtext = wait.Until(d => d.FindElement(By.Id(elementId)).Text);
break;
case SeleniumFindBy.ByName:
itemtext = wait.Until(d => d.FindElement(By.Name(elementId)).Text);
break;
case SeleniumFindBy.ByLinkText:
itemtext = wait.Until(d => d.FindElement(By.LinkText(elementId)).Text);
break;
case SeleniumFindBy.ByPartialLinkText:
itemtext = wait.Until(d => d.FindElement(By.PartialLinkText(elementId)).Text);
break;
case SeleniumFindBy.ByXPath:
itemtext = wait.Until(d => d.FindElement(By.XPath(elementId)).Text);
break;
case SeleniumFindBy.CssSelector:
itemtext = wait.Until(d => d.FindElement(By.CssSelector(elementId)).Text);
break;
}
}
catch (OpenQA.Selenium.NoSuchElementException ex)
{
LastError = elementId + "," + ex.Message;
}
catch (Exception ex)
{
LastError = elementId + "," + ex.Message;
}
解决方法
尽管您将lambda表达式用作:
itemtext = wait.Until(d => d.FindElement(By.Id(elementId)).Text);
lambda表达式仍然依赖于FindElement()
方法。
FindElement方法
ISearchContext.FindElement方法使用给定的方法查找第一个IWebElement。
语法:
IWebElement FindElement(
By by
)
返回值
Type: IWebElement
The first matching IWebElement on the current context.
此用例
由于内部FindElement Method()
失败,因此您会看到 NoSuchElementException 。
解决方案
作为解决方案,您可以按如下方式处理在try-catch{}
块中找不到元素时引发的异常:
itemtext = wait.Until<IWebElement>((d) =>
{
try
{
return d.FindElement(By.Id(elementId).Text);
}
catch(NoSuchElementException e)
{
return null;
}
});
break;