无法在用户代码中捕获NoSuchElementException

问题描述

即使我的代码包含在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.

例外: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;