Невозможно отловить исключение NoSuchElementException в пользовательском коде
Несмотря на то, что мой код заключен в блок попытки, я все равно получаю необработанное исключение: "Исключение типа 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;
}
1 ответ
Хотя вы используете лямбда-выражение как:
itemtext = wait.Until(d => d.FindElement(By.Id(elementId)).Text);
Лямбда-выражение по-прежнему полагается на FindElement()
метод.
FindElement Метод
Метод ISearchContext.FindElement находит первый IWebElement, используя данный метод.
Синтаксис:
IWebElement FindElement(
By by
)
Возвращаемое значение
Type: IWebElement
The first matching IWebElement on the current context.
Исключение: NoSuchElementException
Этот вариант использования
Как внутренний
FindElement Method()
не выполняется, следовательно, вы видите исключение NoSuchElementException.
Решение
В качестве решения вы можете обработать исключение, которое возникает, когда элемент не найден в
try-catch{}
блокировать следующим образом:
itemtext = wait.Until<IWebElement>((d) =>
{
try
{
return d.FindElement(By.Id(elementId).Text);
}
catch(NoSuchElementException e)
{
return null;
}
});
break;