【发布时间】:2017-05-19 14:00:28
【问题描述】:
我会尽量提供尽可能多的信息。 我正在使用带有 Java.+Selenium 的 TestNG 框架 以下是我编写的 2 个自定义方法。
// Checks if a WebElement is present on the screen
public boolean isElementPresent(WebElement element) {
try {
element.isDisplayed();
return true;
} catch (RuntimeException e) {
return false;`
}
}
// Used to click on the desired element
public void clickWebElement(WebElement element) {
isElementPresent(element);
element.click();
}
protected void enterDataintoField(WebElement element,String fieldData) {
isElementPresent(element);
element.click();
element.clear();
element.sendKeys(fieldData);
}
现在假设有一个链接说登录。点击登录会打开一个页面,其中包含用户名和密码 2 个字段。下面的代码用于登录。(登录名、用户名、密码和 logoutBtn 是 webElements)
public void login(String username, String password)
{
try{
clickWebElement(Login);
//pause few seconds for page load
enterDataintoField(username, "Adam");
enterDataintoField(password, "mypassword");
//pause few seconds to login
Assert.assertTrue(isElementPresent(logoutBtn));
}catch({**ErrorType**} e){
//Some code here
}
}
现在是我的问题。如果我在上面的 catch 块中将 ErrorType 设置为 RuntimeException 则如果出现任何问题,例如未显示用户名字段或缺少登录按钮,那么这个 catch 块将能够抓住问题。但是这个 catch 块将无法捕获上面验证登录是否成功的 Assert 语句。
类似地,如果我使用上面的 AssertionError,那么 catch 块将能够捕获断言失败但无法捕获任何其他问题的场景。 因此,我需要一些关于我可以在这里做什么的建议。 我有数千行代码,所以 我不想在任何地方同时使用 RuntimeException 和 AssertionError 捕获块(如 2 个捕获块。我想要一个捕获块)
非常感谢任何其他建议或最佳实践。
【问题讨论】:
-
我的问题不一定在这一件事上。如果有更好的方法来使用 testng 做同样的事情,请不要犹豫。
-
你能详细说明你在 catch 块中做了什么吗?在测试场景中,通常仅当您想要断言异常本身时才需要捕获异常。例如,它是否是正确的异常类型,是您需要处理异常的数据集...
-
你的逻辑有缺陷。 isElementPresent 返回一个布尔值,但您并未对该结果采取行动,因此如果该元素不存在,它会从 try/catch 中返回 false,但由于您是从其他方法调用它,因此忽略结果并继续。应该更像 if (isElementPresent(element)) element.click();
-
不要那样做。以不同的方式捕获每个不同的事物,并且根本不捕获测试断言错误。断言错误是
Error类型,并不意味着被测试本身捕获,而是传递给测试报告机制。 -
详细说明。一旦我像示例 Assert.assertTrue(isElementPresent(logoutBtn));我立即调用像这样的“通过”报告方法“report.pass(“这一步通过”);而在 catch 块中,我有一个像这样的“失败”报告方法“report.fail(“这一步失败”); .因此,如果断言条件为真,它将转到报告传递,如果失败,它将转到调用报告失败的 catch 块