Почему окна браузера Webdriver не закрываются при запуске нескольких файлов suiteXmlFile с помощью TestNG из командной строки Maven?

У меня есть 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>

Эти две ссылки в файле POM следующим образом:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8</version>
<configuration>
    <suiteXmlFiles>
        <suiteXmlFile>testng.xml</suiteXmlFile>
        <suiteXmlFile>testng-includeOnly.xml</suiteXmlFile>
    </suiteXmlFiles>
    ...
</configuration>

Поскольку мне нужно запустить их из Jenkins, когда я получаю схему работы, я использую версию командной строки, чтобы запустить их, используя следующее, чтобы попытаться просто запустить параллельный набор:

mvn clean test -DsuiteXmlFile=testng.xml site

Возникают две проблемы…

  1. Он выполняет оба набора
  2. При выполнении 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();
        }
    }
}

Если вам интересно, откуда у меня эта архитектура, я позаимствовал ее здесь… https://rationaleemotions.wordpress.com/2013/07/31/parallel-webdriver-executions-using-testng/

1 ответ

  1. Ваш общий блог — это мой блог 🙂

    Если вы должны были смотреть на прохождение в нескольких комплектах TestNG, то вы, возможно, должны взглянуть на этот пост в блоге. Это должно в основном заботиться о вашей проблеме № 1.

    Для вашей проблемы #2, т. е. у вас открыто несколько окон браузера, вы могли бы, возможно, сделать следующее в вашем afterInvocationметоде :

    @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 текущего потока.

    Я не совсем уверен, что его действительно собирается исправить проблему, но вы могли бы попробовать это и посмотреть, если это поможет.