使用 ExpectedConditions 断言元素不存在 Class

Asserting Element Not Present Using ExpectedConditions Class

我正在尝试使用 ExpectedConditions class 来执行与 Selenium 相关的断言,但我无法找到断言给定元素不存在的事实上的最佳实践.我正在尝试使用这样的东西......

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

但这当然不会编译,因为 presenceOfElementLocated returns 是 WebElement 而不是布尔值,这让我很沮丧。你推荐什么作为实现我想要的最佳实践?

编辑: 接受的问题答案转换为 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;
}

好吧,如果没有 element 匹配当前的选择器,使用 ExpectedConditions 最终会抛出 NoSuchElementException。在那种情况下,您可能想使用带有 ExpectedConditions 的 try catch 或简单地使用 findElements()size() 来查看它是否找到任何元素。看我的回答

这是您的另一种选择。用 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());
}

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

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

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

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

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