TestNG无法在AfterClass方法中关闭Selenium Browser

时间:2014-06-26 23:15:38

标签: java junit selenium-webdriver cucumber testng

场景是这样的: 运行我的Cucumber功能的TestNG测试运行器。 有一个包含WebBrowsers的静态共享Selenium WebDriver池。 在TestNG测试结束时,我想关闭我的浏览器,所以我正在使用@AfterClass注释。 进行调用,代码运行以关闭浏览器,但实际上它们实际上并没有。

如果我在调用后添加Thread.sleep一秒钟,浏览器就会关闭。

JUnit测试运行器设法每次都关闭浏览器。关于TestNG有什么特别的(错误的)?


链接到违规的测试运动员在这里:

https://github.com/OliverCulleyDeLange/Cucumber_Selenium_Hamcrest/blob/master/src/test/java/uk/co/oliverdelange/testrunners/testng/TestNGCucumberRunner.java

随意克隆并亲自查看结果。


违反测试跑步者的代码:

package uk.co.oliverdelange.testrunners.testng;

import cucumber.api.CucumberOptions;
import cucumber.api.testng.AbstractTestNGCucumberTests;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import uk.co.oliverdelange.webbrowser.BrowserPool;

@CucumberOptions(tags = "~@Ignore",
        features = "src/test/resources/uk/co/oliverdelange/cucumber/",
        glue = "uk.co.oliverdelange.cucumber.tests",
        format = {"pretty","html:CucumberReports/html/","json:CucumberReports/cucumber.json"},
        monochrome = true
)
public class TestNGCucumberRunner extends AbstractTestNGCucumberTests {
    @BeforeClass
    public static void beforeClass() {
        System.out.println("Do stuff here before the cucumber tests happen");
    }

    @AfterClass
    public static void afterClass() { //FIXME why is this not being called?
        System.out.println("Do stuff here after the cucumber tests happen");
        System.out.println("Like shutting down all the web browsers...");
        BrowserPool.closeAll();
        //FIXME: JUnit manages to close the browser before closing the tests, but somehow TestNG doesn't - what!?
    }
}

1 个答案:

答案 0 :(得分:0)

我从未见过有人在AfterClass方法的单个调用中调用关闭webdriver实例的组/池。通常,人们所做的是在BeforeTest中实例化浏览器,然后在AfterTest方法中使用.quit调用关闭单个非静态类webdriver成员。所以,我的第一印象是,看着你的代码,你正在做一些非标准和实验性的事情。 TestNG非常棒,它可以为您提供流程,并且在这种情况下很容易跟踪webdriver实例。我不会再使用JUnit ......在我了解TestNG之后,我确信它远远优于它。

例如:

  
      
  1. 您可以将可选的Object [] arg传递给使用BeforeMethod注释的方法,并且可以从中检索参数   即将传递给测试方法,例如在调用obj.start时打开浏览器的WebDriver帮助程序对象(在数据提供程序方法中生成)。天才。

  2.   
  3. 您可以将ITestResult传递给AfterTest方法,然后从结果中获取内容并使用该信息发布过程内容,例如   完成测试后发送SauceLabs REST请求以将测试作业标记为已通过。

  4.