我是自动化测试的新手,我对断言和验证感到很困惑。因为我正在使用TestNG,根据我的研究,我发现在webdriver中,我们没有验证,我们有硬性和软性的断言。但是当我搜索它时,我会得到所有混合答案。在任何地方我都找不到详细的例子。 对于软断言,我看到有人使用'customverification'但是当我尝试在我的程序中编写它时,我得到错误,要求创建一个类或接口。 有人可以帮助我。我正在通过互联网学习,所以很难得到正确的答案。 感谢
package revision;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Six {
WebDriver driver=new FirefoxDriver();
@Test
public void SandyOne() {
driver.get("file:///C:/Users/Sandeep%20S/Desktop/Test.html");
Assert.assertTrue(IsElementPresent(By.xpath("//input[@id='custom']")), "tab was missing");
driver.findElement(By.xpath("//input[@id='custom']")).sendKeys("abcd");
System.out.println("1st program");
System.out.println("blah 1");
System.out.println("blah 2");
}
public boolean IsElementPresent(By by) {
try {
driver.findElements(by);
return true;
} catch (org.openqa.selenium.NoSuchElementException e) {
return false;
}
}
}
答案 0 :(得分:1)
如果断言失败,测试将停止,验证测试将继续进行,并记录错误。
理想情况下,每个测试只有一个断言(例如,加载了正确的页面),在这种情况下,验证将用于检查该页面上的信息。 因此,如果未加载正确的页面,则检查页面上的内容是否正确是没有意义的。
您可以获得一个想法和一个视觉示例here。
答案 1 :(得分:1)
你的测试可能在这里失败了:
Assert.assertTrue(IsElementPresent(By.xpath("//input[@id='custom']")), "tab was missing");
因为IsElementPresent
返回false
。避免这种情况的一种方法是:
try {
Assert.assertTrue(IsElementPresent(By.xpath("//input[@id='custom']")), "tab was missing");
driver.findElement(By.xpath("//input[@id='custom']")).sendKeys("abcd");
}
catch (AssertionError ae) {
//ignore
}
但是,捕获错误是非常难看的代码。更好的方法是使用WebDriver.findElements(By by)
并检查结果列表是否为空。
答案 2 :(得分:0)
硬断言:一旦发现断言失败,测试执行就会停止。
软断言:即使发现断言失败,测试仍会继续执行。
e.g。你有3个断言语句Assert1,Assert2,Assert3
现在,如果Assert2在硬断言的情况下失败,测试将终止。 在软断言的情况下,它将转移到测试中的下一步,然后终止。
您需要将软断言实例化为:
SoftAssertions softAssertion = new SoftAssertions();
softAssertion.assertTrue(条件,消息)
在你给定的代码片段中,硬断言是有意义的,因为在找到输入框之前你无法移动到下一步发送文本。
答案 3 :(得分:0)
在给定的示例中,您不需要断言元素存在。如果它丢失了,那么findElement方法会抛出一个错误,你会知道它不在那里。
如果您有元素的ID,请使用它而不是xpath。这将使代码更具可读性和更快:
driver.findElement(By.Id("custom")).sendKeys("abcd");
建议使用PageObject模式并选择带注释的元素,而不是直接调用findElement方法,请参阅PageFactory:
public class TestPage {
@FindBy(id = "custom")
WebElement custom;
private WebDriver driver;
public TestPage (WebDriver driver) {
this.driver = driver;
PageFactory.initElements(driver, this);
}
public TestPage inputCustom(String txt) {
custom.sendKeys(txt);
return this;
}
}
@Test
public void SandyOne() {
// ...
TestPage page = new TestPage(driver);
page.inputCustom("abcd");
// ...
}