Java 从Maven命令行使用TestNG运行多个suiteXmlFile时,为什么Webdriver浏览器窗口不关闭?

Java 从Maven命令行使用TestNG运行多个suiteXmlFile时,为什么Webdriver浏览器窗口不关闭?,java,maven,selenium,jenkins,testng,Java,Maven,Selenium,Jenkins,Testng,我有40个Webdriver测试,分为两组——一组必须串行运行(其中每个测试都有元数据组标记“crm_import”),另一组可以并行运行。以下XML文件引用了这两个组: TestNG.xml <suite name = "Suite" thread-count="2" parallel="methods"> <test name = "TestSet"> <groups> <run> <ex

我有40个Webdriver测试,分为两组——一组必须串行运行(其中每个测试都有元数据组标记“crm_import”),另一组可以并行运行。以下XML文件引用了这两个组:

TestNG.xml

<suite name = "Suite" thread-count="2" parallel="methods">
<test name = "TestSet">
    <groups>
        <run>
            <exclude name = "crm_import"/>
        </run>
    </groups>
    <classes>
        <class name = "com.dcp.test.suite.TestSuite"/>
    </classes>
</test>
</suite>


TestNG_includeOnly.xml

<suite name = "Suite2" verbose="1" >
<test name = "TestSet">
    <groups>
        <run>
            <include name = "crm_import"/>
        </run>
    </groups>
    <classes>
        <class name = "com.dcp.test.suite.TestSuite"/>
    </classes>
</test>
</suite>
出现了两个问题

  • 两套都有
  • 当40个测试运行时,38个窗口保持打开状态
  • 如果我转到POM文件并注释掉一个套件或另一个套件,然后运行

    mvn clean test site
    
    …然后一切都很好--没有打开的窗口,并行测试并行运行

    如果您想知道如何打开和关闭浏览器,下面是TestSuite.java文件扩展的基类的框架

    public class TestSuiteBase implements IInvokedMethodListener {
    ...
    @Override
    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
        if (method.isTestMethod()) {
            System.setProperty("webdriver.firefox.marionette", "/opt/geckodriver"); 
            ProfilesIni profile = new ProfilesIni();
            String ffProfileName = properties.getProperty("ffProfileName");
            FirefoxProfile myprofile = profile.getProfile(ffProfileName);
            System.out.println("--> creating WebDriver instance..." + "Thread id = " + Thread.currentThread().getId());
            WebDriver driver = new FirefoxDriver(myprofile);
            LocalDriverManager.setWebDriver(driver);
        }
    }
    
    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
        if (method.isTestMethod()) {
            WebDriver driver = LocalDriverManager.getDriver();
            if (driver != null) {
                System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
                driver.quit();
            }
        }
    }
    

    如果你想知道我是从哪里得到这些建筑的,我是从这里借来的

    您共享的博客是我的博客:)

    如果您希望通过多个TestNG套件,那么您也许应该看看我的博客文章。这基本上可以解决你的问题

    对于您的问题#2,即您打开了多个浏览器窗口,您可能可以在调用后的
    方法中执行以下操作:

    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
        if (method.isTestMethod()) {
            WebDriver driver = LocalDriverManager.getDriver();
            if (driver != null) {
                System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
                driver.quit();
            }
            LocalDriverManager.setWebDriver(null);
        }
    }
    
    这里我们显式地取消当前线程的webdriver上下文


    我不太确定它是否真的能解决问题,但你可以试试这个,看看是否有帮助。

    使用
    @AfterGroup
    @afterest
    等东西怎么样?而不是监听器?我以前使用过这样的构造,但为了实现一个套件的并行处理,我切换到了监听器方案。当我运行测试时,我在afterInvocation()方法中看到了debug语句,所以它不像没有被调用,所以我不知道改变会带来什么好处。克里希南——非常感谢你给我额外的博文链接!这正是我修改POM文件所需要的,以便在命令行上接受一个可选的XML文件来指定要使用的XML文件。这基本上解决了这两个问题,但我也添加了LocalDriverManager的null化。实际上,我现在能够做的是在命令行
    mvn clean test-Dfile={一个XML文件或另一个}站点上指定。这很好,因为我可以将该行的两个版本放在单独的Jenkins作业中。然而,当我列出这两个XML文件(当然是逗号分隔的)时,它们都会运行,但这就是我最后使用剩余的浏览器会话的时候。更奇怪的是,我总共只运行了3个测试(2个并行测试,1个来自普通/串行测试集),但打开了4个浏览器。其中一个确实成功地关闭了。@JoeHennessey-在没有实际看到代码的情况下,很难确定问题所在。那么,您如何创建一个可复制的小项目,执行该项目以复制问题,并将其发布到github上,并与我们共享链接。
    
    public class TestSuiteBase implements IInvokedMethodListener {
    ...
    @Override
    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
        if (method.isTestMethod()) {
            System.setProperty("webdriver.firefox.marionette", "/opt/geckodriver"); 
            ProfilesIni profile = new ProfilesIni();
            String ffProfileName = properties.getProperty("ffProfileName");
            FirefoxProfile myprofile = profile.getProfile(ffProfileName);
            System.out.println("--> creating WebDriver instance..." + "Thread id = " + Thread.currentThread().getId());
            WebDriver driver = new FirefoxDriver(myprofile);
            LocalDriverManager.setWebDriver(driver);
        }
    }
    
    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
        if (method.isTestMethod()) {
            WebDriver driver = LocalDriverManager.getDriver();
            if (driver != null) {
                System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
                driver.quit();
            }
        }
    }
    
    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
        if (method.isTestMethod()) {
            WebDriver driver = LocalDriverManager.getDriver();
            if (driver != null) {
                System.out.println("After Test breakdown, quitting driver..." + "Thread id = " + Thread.currentThread().getId());
                driver.quit();
            }
            LocalDriverManager.setWebDriver(null);
        }
    }