使用Java检查Selenium WebDriver在页面上是否存在或显示元素的正确方法是什么?

时间:2012-09-05 06:40:06

标签: java selenium-webdriver junit4

我正在使用Selenium WebDriver测试Web应用程序,我想知道检查元素是否存在或显示的正确方法。我通常断言所有元素都存在于页面上,但它也会检查隐藏的元素,在这种情况下也需要检查元素是否仅在某些操作完成时才显示。例如,我单击一个链接,显示其他字段和标签,而之前它们是隐藏的。在这种情况下,我应该检查元素是否存在,以及是否在单击其他元素之前和之后显示它们。

我想知道哪种方法可以做到这一点。检查页面上的所有元素是否太多(假设我在页面中有一些按钮,文本字段,标签,链接等)?

为了讨论的目的,我想要包含一些代码片段。要检查页面上是否存在元素,请使用以下代码段:

public boolean isElementPresent(By by) {
    try {
        driver.findElement(by);
        return true;
    } catch (NoSuchElementException e) {
        return false;
    }
}

要检查元素是否显示,请使用以下代码段:

public boolean isElementDisplay(By by) {
    if (driver.findElement(by).isDisplayed()) {
        return true;
    } else
        return false;
}

测试此应用程序的一个目的是检查元素是否存在并正确显示。我在这做对了吗?请告诉我你的观点。我最近开始与Selenium WebDriver合作,并且是我公司中唯一一个这样做的人...我没有任何人可以求助。任何答案都表示赞赏。

5 个答案:

答案 0 :(得分:3)

它没有任何问题,除非你在一个首先不存在的元素上调用你的“checkIfDisplayed”方法,它将抛出异常。我会修改它:

public boolean checkIfDisplayed(By by) {
    if (isElementPresent(by) {
    if (driver.findElement(by).isDisplayed()) {
        return true;
    } else
        return false;
    } else
        return false;
}

(这可能不是编译的代码,我是C#man,但你应该明白我的意思)

它可能会有轻微的性能影响,但总体而言,无论如何,你所做的事情都非常好。

答案 1 :(得分:2)

要检查元素的存在,我宁愿使用

public boolean isElementPresent(By by)
{
   return driver.findElements(by).size() > 0
}

我真的不明白你的checkIfDisplayed函数背后的想法。它返回WebElemet的isDisplayed()方法返回的结果,而不添加任何新功能......

修改

到目前为止,Arran提供了最佳答案。只是稍微修改一下:

public boolean checkIfDisplayed(By by)
{
   List<WebElemet> elements = driver.findElements(by);
   return ((elements.size() > 0) && (elements[0].isDisplayed()));
}

但我相信最好是分别调用isElementPresent和isDisplayed。通过这种方式,您将知道测试失败的原因(如果它是由元素的存在或可见性引起的)

答案 2 :(得分:0)

我使用相同的方法(我的意思是相同的方法)。但了解两件事情很重要。 某些元素可以存在但不可见。 因此,为了验证元素是否存在,我们可以调用方法

 public boolean isElementPresent(By locatorKey) {
        try {
            driver.findElement(locatorKey);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }

但isElementPresent方法的缺点是它可以指出DOM模型中的元素在页面上不可见,因此无法通过webDriver访问。因此,在这种情况下,额外的检查可以帮助我们:

 driver.findElement(By.xpath(....)).isDisplayed()

希望事情现在明白了)

答案 3 :(得分:0)

我说你的第一种方法看起来很好。

如果findElement-call没有给你结果,那么第二个将给你带来麻烦。

如果找到了元素,您应该添加一个检查,然后检查它是否显示:

try {
      final WebElement elem = driver.findElement(by);
      elem.isDisplayed();
      return true;
    } catch (NoSuchElementException nse) {
      return false;
    }

另请注意:您忽略了多个元素与by实例给出的条件匹配的可能性。请参阅findElemts() method

答案 4 :(得分:0)

您还可以根据您的要求结合两种方法,如下所示,

if(driver.findElements(By.LOCATOR).size()>0)
{
    if(driver.findElement(By.LOCATOR).isDisplayed())
    { print "Element is present and displayed"; }
    else
    { print "Element is present but not displayed"; }
} 
else
{ print "Element is not present"; }