我试图进入利用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;
}
答案 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));