问题描述
Q1) 我在 Selenium-TestNG 中有一个现有的框架以及 Listeners 类。我使用 TestNG 的 @AfterTest 注释关闭浏览器:
@AfterTest
public void teardown()
{
driver.quit();
}
当我在没有黄瓜特征文件的情况下作为普通的旧 Selenium TestNG 运行时,Listeners 类的 onTestSuccess 方法工作得非常好:
public void onTestSuccess(ITestResult result)
{
test.log(Status.PASS,"Test case Passed");
try
{
String path = takeScreenshot(driver,"Pass/" + result.getInstanceName() + "/" + result.getmethod().getmethodName());
test.addScreenCaptureFromPath(path,result.getmethod().getmethodName());
}
catch (Exception e)
{
log.fatal("Exception in onTestSuccess Method of Listeners class");
log.fatal(e.getMessage() +" : " + e.getStackTrace());
System.out.println("Exception " + e.getMessage());
System.out.println("Exception " + e.getStackTrace());
}
}
当Test通过时,首先调用Listeners类的onTestSuccess()方法,然后调用teardown()方法。所以一切都很顺利。
现在我在黄瓜中使用这个特征文件:
Feature: logout feature
Background:
Given User is on Salesforce login page
@SmokeTest @Low @PositiveTest @logout
Scenario: logout of application
Given "RMUser" has logged into Salesforce application
When User clicks on logout button
Then Users is logged-out from the application
并使用@After钩子关闭浏览器:
@After
public void teardown() {
driver.quit();
}
现在,当我将此功能文件作为 TestNG 运行时,首先调用 Hooks 文件中的拆卸方法,然后调用 Listeners 类的 onTestSuccess() 方法,因此出现错误“异常会话 ID 为空。使用 WebDriver在我尝试使用驱动程序变量的行调用 quit() 之后?":
String path = takeScreenshot(driver,"Pass/" + result.getInstanceName() + "/" + result.getmethod().getmethodName());
如果在调用@After 钩子之前先调用 Listeners 类的 onTestSuccess() 方法,则可以解决此问题。
寻求一些解决方法或想法来解决 Cucumber 中的此问题。
Q2) 当作为普通 Selenimm-TestNG 运行时,Extent Reports 在报告中给出了正确的 TestName,但是当作为 TestNG Cucccumber 框架运行时,Extent 报告只将所有测试名称显示为“runScenario”。
如何让 ExtentReport 给出正确的特征文件场景名称,而不仅仅是“runScenario”
解决方法
我通过删除 driver.quit() 解决了 TestNG Listeners 类异常;来自 Hooks 类文件并将其放入 Listeners 类的 onTestStart 和 onTestFailure 方法中:
public void onTestSuccess(ITestResult result)
{
test.log(Status.PASS,"Test case Passed");
try
{
String path = takeScreenshot(driver,"Pass/" + result.getInstanceName() + "/" + result.getMethod().getMethodName());
test.addScreenCaptureFromPath(path,result.getMethod().getMethodName());
}
catch (Exception e)
{
log.fatal("Exception in onTestSuccess Method of Listeners class");
log.fatal(e.getMessage() +" : " + e.getStackTrace());
System.out.println("Exception " + e.getMessage());
System.out.println("Exception " + e.getStackTrace());
}
driver.quit();
}
public void onTestFailure(ITestResult result) {
test.log(Status.FAIL,"Test case Failed");
test.fail(result.getThrowable());
try
{
String path = takeScreenshot(driver,"Fail/" + result.getInstanceName() + "/" + result.getMethod().getMethodName());
test.addScreenCaptureFromPath(path,result.getMethod().getMethodName());
}
catch(Exception e)
{
log.fatal("Exception in onTestFailure Method of Listeners class");
log.fatal(e.getMessage() +" : " + e.getStackTrace());
System.out.println("Exception " + e.getMessage());
System.out.println("Exception " + e.getStackTrace());
}
driver.quit();
}
因为测试用例要么通过要么失败,因此控制总是在 onTestSuccess 或 onTestFailure 方法中,这将在测试用例完成执行后退出驱动程序。