Невозможно отловить исключение 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;
Другие вопросы по тегам