当前位置: 首页 > 知识库问答 >
问题:

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

尹小云
2023-03-14

Q1)我在Selenium-TestNG中有一个现有的框架以及Listeners类。我使用testng的@aftertest注释关闭浏览器:

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

这里,Listeners类的onTestSuccess方法在我作为没有cucumber特性文件的普通旧Selenium TestNG运行时工作得非常好:

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());
        }
    }

当测试通过时,首先调用Listeners类的onTestSuccess()方法,然后调用teardown()方法。所以一切都很顺利。

现在我在Cucumber中使用这个特性文件

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文件中的teardown方法,然后调用Listeners类的onTestSuccess()方法,因此我得到错误“Exception Session ID is null.在调用quit()后使用WebDriver?”在我尝试使用驱动变量的行处:

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

寻求一些变通办法或想法来解决这个问题在cucumber。

Q2)当作为普通的Selenimm-TestNG运行时,Stepte Reports在报告中提供正确的TestName,但当作为TestNG Cuccumber框架运行时,Stepte Reports只是将所有测试名称显示为“runScenary”。

如何使ExtentReport给出正确的特性文件方案名称,而不仅仅是“runscrena”

共有1个答案

柴正祥
2023-03-14

我通过删除driver.quit()解决了TestNG Listeners类异常;并将其放在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();
    }

由于testcase要么通过,要么失败,因此控制总是来自onTestSuccess或onTestFailure方法,这将在testcase完成执行后退出驱动程序。

 类似资料:
  • 我的问题有两个方面。要解决的错误是,当我使用自定义路由重用策略时,当我使用implements重写angular路由器类RouteReuseStrategy时,该策略不会被触发,当我使用extends关键字时,我会出现以下异常, 我的生成设置的详细信息: > 使用gulp编译 gulp.task(“compile”,()=>{let tsResult=gulp.src(“app/**/*.ts”)

  • 我正在尝试学习python来处理一个测试项目。是否有一种方法可以在python测试框架中实现类似功能的TestNG侦听器。 侦听器有诸如OnTestFailure()、OnTestSuccess、OnStart()等方法,当您想要做某些事情时,这些方法非常有用。 比方说,一个测试用例失败了,您想执行一些操作,比如截图。然后你可以只在一个地方写,而不是在每个测试方法中都写。

  • 第十三章介绍了如何开发一个Web框架,通过介绍MVC、路由、日志处理、配置处理完成了一个基本的框架系统,但是一个好的框架需要一些方便的辅助工具来快速的开发Web,那么我们这一章将就如何提供一些快速开发Web的工具进行介绍,第一小节介绍如何处理静态文件,如何利用现有的twitter开源的bootstrap进行快速的开发美观的站点,第二小节介绍如何利用前面介绍的session来进行用户登录处理,第三小

  • 我有三个SQS FIFO队列,其中每个队列在EC2实例中都有一个数据投影侦听器守护进程,作为docker pod(SQL Server、PostgreSQL、Elastic Search等) 所有队列的设置如下(死信队列稍后设置)。 这都是我使用DynamoDB流设计的事件源架构的一部分= 启用以避免队列中的重复消息,因为Lambda路由器中的任何队列总是可能出现错误。 现在,我还将每条消息的设置

  • 问题内容: 我有一个ArrayList,它向其中动态添加了一些对象,并且有一个JButton。运行我的程序时ArrayList为空,并且JButton设置为setEnabled(false)。我想在ArrayList中有2个或更多元素时启用我的按钮,如果ArrayList有一项或为空则再次禁用它。我该如何实现? 问题答案: 没有任何种类的通知机制。 我建议您编写自己的实现,该实现将委托给私有的实现

  • 我正在使用cucumber框架进行移动应用程序测试。在pom.xml中,我给出了下面这个插件来运行TestClass.java--它有上传应用程序最新apk版本的代码。Main方法存在于这个TestClass中。我需要在实际测试执行之前运行这个。如果我使用pom.xml-->mvn clean test运行,我会得到这个错误。ClassNotFoundExpection总是与pom.xml一起抛出