WebDriver和C# - NoSuchElementexception

时间:2012-06-05 14:37:34

标签: c# selenium webdriver

我有以下代码用于从给定列表中选择一个选项,它通常可以工作,但有时它会在第二个if上失败并出现NoSuchElement异常。我的印象是,如果它没有找到元素,它只会再次回到循环中。我相信这个解释很简单......任何人都可以启发我吗?

    public static void selectFromList(String vList, String vText, IWebDriver driver)
    {
        for (int sec = 0; ; sec++)
        {
            System.Threading.Thread.Sleep(2500);
            if (sec >= 10) Debug.Fail("timeout : " + vList);
            if (driver.FindElement(By.Id(ConfigurationManager.AppSettings[vList])).Displayed) break;
        }
        new SelectElement(driver.FindElement(By.Id(ConfigurationManager.AppSettings[vList]))).SelectByText(vText);
    }

3 个答案:

答案 0 :(得分:4)

不必尝试捕获每个实例,为什么不创建一个帮助/扩展方法来为您处理。这里返回元素,如果不存在则返回null。然后你可以简单地为.exists()使用另一种扩展方法。

IWebElement element = driver.FindElmentSafe(By.Id(“the id”));

    /// <summary>
    /// Same as FindElement only returns null when not found instead of an exception.
    /// </summary>
    /// <param name="driver">current browser instance</param>
    /// <param name="by">The search string for finding element</param>
    /// <returns>Returns element or null if not found</returns>
    public static IWebElement FindElementSafe(this IWebDriver driver, By by)
    {
        try
        {
            return driver.FindElement(by);
        }
        catch (NoSuchElementException)
        {
            return null;
        }
    }

bool exists = element.Exists();

    /// <summary>
    /// Requires finding element by FindElementSafe(By).
    /// Returns T/F depending on if element is defined or null.
    /// </summary>
    /// <param name="element">Current element</param>
    /// <returns>Returns T/F depending on if element is defined or null.</returns>
    public static bool Exists(this IWebElement element)
    {
        if (element == null)
        { return false; }
        return true;
    }

答案 1 :(得分:2)

您可以尝试this问题中的一个答案:

public static IWebElement FindElement(this IWebDriver driver, String vList, String vText, int timeoutInSeconds)
{

    By selector = By.Id(ConfigurationManager.AppSettings[vList])
    if (timeoutInSeconds > 0)
    {
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
        return wait.Until(drv => drv.FindElement(selector));
    }
    return driver.FindElement(selector);
}

答案 2 :(得分:1)

好吧,我是Java家伙,所以我不会为你提供代码,而是算法:

  • 您的代码(我认为)应检查,如果元素显示,如果没有,请等待额外的2.5秒
  • 失败的原因是,有时显示元素需要超过前2.5秒。在这种情况下,检查元素是否显示将抛出异常

所以,基本上你应该在for循环中做一些异常处理并捕获这个异常而什么都不做。在Java中,它由trycatch块完成。但是因为我不知道C#你必须知道它是如何用这种语言完成的