5

我有以下代码用于从给定列表中选择一个选项,它通常可以工作,但有时它会在第二个 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);
    }
4

3 回答 3

6

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

IWebElement element = driver.FindElmentSafe(By.Id("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;
        }
    }

布尔存在 = 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;
    }
于 2013-08-05T15:15:02.557 回答
2

您可以尝试这个SO question 的答案之一:

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);
}
于 2012-06-05T15:02:45.707 回答
1

好吧,我是 Java 人,所以我不会提供代码,而是提供算法:

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

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

于 2012-06-05T14:47:32.450 回答