问题

这个问题在这里已有答案:

  • Selenium WebDriver - 测试元素是否存在20个答案

如何检查Web驱动程序是否存在元素?

真正使用try catch是唯一可行的方法吗?

boolean present;
try {
   driver.findElement(By.id("logoutLink"));
   present = true;
} catch (NoSuchElementException e) {
   present = false;
}

#1 热门回答(183 赞)

你也可以这样做:

driver.findElements( By.id("...") ).size() != 0

这节省了令人讨厌的尝试/捕获


#2 热门回答(44 赞)

我同意迈克的答案,但是如果找不到可以打开/关闭的元素,则会有一个隐含的3秒等待,如果你执行此操作很多很有用:

driver.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS);
boolean exists = driver.findElements( By.id("...") ).size() != 0
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

如果你正在运行大量测试,那么将其放入实用程序方法应该可以提高性能


#3 热门回答(6 赞)

正如评论所述,这是在C#而不是Java,但想法是一样的。我已经广泛研究了这个问题,最终问题是,当元素不存在时,FindElement总是返回异常。没有重载选项允许你获取null或其他任何内容。这就是我更喜欢这种解决方案的原因。

  • 返回一个元素列表,然后检查列表大小是否有效,但是你会失去这种功能。即使集合大小为1,也不能对链接集合执行.click()。
  • 你可以声明该元素存在但通常会停止你的测试。在某些情况下,我有一个额外的链接点击取决于我如何到达该页面,我想点击它,如果它存在或否则继续。
  • 如果你没有设置超时驱动程序,它只会很慢。管理()。超时().ImplicitlyWait(TimeSpan.FromSeconds(0));
  • 创建方法后,它实际上非常简单和优雅。通过使用FindElementSafe而不是FindElement,我没有"看到"丑陋的try / catch块,我可以使用简单的Exists方法。这看起来像这样:IWebElement myLink = driver.FindElementSafe(By.Id("myId"));
    if(myLink.Exists)
    {
       myLink.Click();
    }

以下是扩展IWebElement和IWebDriver的方法
IWebDriver.FindElementSafe

/// <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;
        }
    }

IWebElement.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;
    }

你可以使用多态来修改FindElement的IWebDriver类实例,但从维护的角度来看这是一个坏主意。


原文链接