繁体   English   中英

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

[英]Which is the correct way to check if an element is present or displayed on a page with Selenium WebDriver using Java?

我正在使用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合作,并且是我公司中唯一一个这样做的人...我没有任何人可以求助。 任何答案都表示赞赏。

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

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

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

它可能会有轻微的性能损失,但总的来说你正在做的事情完全没问题。

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

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

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

编辑

到目前为止,雅兰提供了最好的答案。 只是稍微修改一下:

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

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

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

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

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

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

希望事情现在明白了)

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

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

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

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

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

您也可以根据您的要求将这两种方法结合起来 ,如下所示,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM