使用ExpectedConditions类断言元素不存在

时间:2015-02-13 16:47:12

标签: java selenium selenium-webdriver

我试图进入利用ExpectedConditions类进行与Selenium相关的断言的练习,但是我找不到断言给定元素的事实上的最佳实践是不存在的。我试图使用这样的东西......

Assert.assertFalse(ExpectedConditions.presenceOfElementLocated(By.xpath(myXpath)).apply(driver1));

但是这当然不会编译,因为presenceOfElementLocated会返回一个Web元素而不是一个布尔值,我觉得这很令人沮丧。你推荐什么作为实现我的目标的最佳实践?

编辑:转换为Java的问题的接受答案...

public static boolean elementXpathPresent(WebDriver driver,String elementXpath) {
    try {
        WebDriverWait wait = new WebDriverWait(driver,10);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath(elementXpath)));
    } catch (TimeoutException e) {
        return false;
    }   
    return true;
}

3 个答案:

答案 0 :(得分:2)

好吧,如果没有ExpectedConditions匹配选择器,那么使用NoSuchElementException最终会抛出element。在这种情况下,您可能希望对ExpectedConditions使用try catch,或者只使用findElements()size()来查看它是否找到任何元素。请参阅我的回答here

这是您的另一个选择。用C#编写但很容易转换

/// <summary>
/// 
/// </summary>
/// <returns></returns>
public bool Test()
{
    try
    {
        new WebDriverWait(Driver, TimeSpan.FromSeconds(10)).Until(
            ExpectedConditions.ElementExists(By.XPath("MyXpath")));
    }
    catch (NoSuchElementException)
    {
        return false;
    }

    return true;

}

/// <summary>
/// 
/// </summary>
public void Assertion()
{
    Assert.IsTrue(Test());
}

答案 1 :(得分:2)

检查元素不存在的最简单方法是使用复数形式的findElement函数(即findElements)并检查返回的元素列表的长度。如果元素不存在,则列表的大小为0.

Assert.assertTrue(driver.findElements(By.xpath(myXpath)).size() == 0);

使用显式等待此测试是否有意义取决于您的应用程序。大多数情况下,当我检查缺少元素时,我有一个使用显式等待的早期测试。例如,如果我想检查对搜索表的更改是否清空表,我首先检查表是否已完成刷新,然后然后检查它是否为空。前一项检查需要明确的等待,后一项检查不需要。

答案 2 :(得分:0)

接受的答案是一种很好的方法(这是我喜欢用Selenium进行断言的方式)。但您也可以ExpectedConditions.not()使用Assert.true()来断言元素不存在:

Assert.assertTrue(
    ExpectedConditions.not(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(myXpath))).apply(driver1));