将我的 selenium TestNG 框架扩展到 Cucumber 后,监听器出现错误

Getting error in listeners after extending my selenium TestNG framework to Cucumber

Q1) 我在 Selenium-TestNG 中有一个现有框架以及监听器 class。我使用 TestNG 的 @AfterTest 注释关闭浏览器:

 @AfterTest
    public void teardown()
    {
        driver.quit();
    } 

当我 运行 作为没有黄瓜功能文件的普通旧 Selenium TestNG 时,Listeners class 的 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通过后,先调用Listenersclass的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 class 的 onTestSuccess() 方法,因此我得到错误“Exception Session ID is null. Using WebDriver after calling quit()?" 在我尝试使用驱动程序变量的行:

String path = takeScreenshot(driver, "Pass/" + result.getInstanceName() + "/" + result.getMethod().getMethodName()); 

如果在调用@After 钩子之前先调用 Listeners class 的 onTestSuccess() 方法,则可以解决此问题。

寻求一些解决方法或想法来解决 Cucumber 中的这个问题

Q2) 当 运行ing 作为普通的 Selenimm-TestNG 时,Extent Reports 在报告中给出了正确的 TestName 但是当 运行ning 作为 TestNG Cuccumber 框架时,Extent 报告只显示所有测试名称作为“运行场景”。

如何让 ExtentReport 给出正确的特征文件场景名称而不仅仅是“运行Scenario”

我通过删除 driver.quit(); 解决了 TestNG 侦听器 class 异常;来自 Hooks class 文件并将其放入 Listeners class:

的 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 方法中进行,这将在测试用例执行完成后退出驱动程序。