将我的 selenium TestNG 框架扩展到 Cucumber

问题描述

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 when run in cucumber framework

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