3

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

4

5 回答 5

3

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

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

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

它可能会对性能产生轻微的影响,但总的来说你所做的一切都很好。

于 2012-09-06T08:48:40.720 回答
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 。这样你就会知道测试失败的原因(如果它是由元素的存在或可见性引起的)

于 2012-09-05T14:49:49.240 回答
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()

希望事情现在清楚了)

于 2012-09-05T15:37:20.673 回答
0

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

如果 findElement-call 不会给您任何结果,那么第二个会给您带来麻烦。

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

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

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

于 2012-09-06T09:14:18.760 回答
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"; }
于 2016-09-19T12:42:36.370 回答