Запуск сьюта с классами в одном экземпляре браузера

Добрый день! Столкнулся с такой проблемой:
Есть проект Selenium+maven+testng+java; тесты запускаю параллельно; для каждого класса открывается свой экземпляр браузера хром. С такой конфигураций тесты выполняются успешно.
Поставлена задача запускать сьют классов с тестами в одном экземпляре браузера хром:

  • Меняю в классе BaseTest: @BeforeClass на @BeforeTest - здесь у меня инициализация ChromeDriver
  • Меняю в классе BaseTest: @AfterClass на @AfterTest - здесь у меня закрытие браузера

После этого запускаю сьют с 2мя наборами классов - открывается 2 браузера параллельно (как и ожидалось), первые классы с обоих наборов выполнились успешно, а следующие классы уже падают и похоже что из-за того что не передается driver в следующие классы.
Ребята, пожалуйста, помогите решить эту проблему.

public class BaseTest:

    protected WebDriver driver;

    @Parameters({"login","auth"})
    @BeforeTest (alwaysRun = true)
    public void setUpMain(final String login, final String auth) throws IOException, InterruptedException {

         if (System.getProperty("os.name").toLowerCase().contains("win")) {
             driverPath = "src/test/resources/chromedriver102.exe";
         }
         else {
             driverPath = "src/test/resources/chromedriverlinux102";
         }
        System.setProperty("webdriver.chrome.driver", driverPath);
        LoggingPreferences logs = new LoggingPreferences();
        logs.enable(LogType.BROWSER, Level.SEVERE);
        ChromeOptions options = new ChromeOptions();
        HashMap<String, Object> chromePref = new HashMap<>();
        chromePref.put("profile.default_content_settings.popups", 0);
        chromePref.put("download.default_directory", System.getProperty("user.dir"));
        options.setExperimentalOption("prefs", chromePref);
        options.addArguments("headless");
        options.addArguments("window-size=1800,1000");
        options.setCapability(CapabilityType.LOGGING_PREFS, logs);
        options.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);
        driver = new ChromeDriver(options);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10L, SECONDS);
        driver.get(System.getProperty("studio_url"));
        if (auth.equals("true")){
            projectBoard = auth(login);
        }
        Thread.sleep(1000);
    }  

    @BeforeTest (alwaysRun = true)
    public void setWaiter () {
        driver.manage().timeouts().implicitlyWait(10L, SECONDS);
    }

    @BeforeClass (alwaysRun = true)
    public void setUrl () throws InterruptedException {
        driver.get(System.getProperty("studio_url") + "project/");
        Thread.sleep(1000);
    }

StudioTests.xml:

suite name="Studio Tests" verbose="1" parallel="tests" thread-count="4"
<parameter name="browser" value="chrome"/>

<test name="admin">
    <classes>
        <class name="tests.project.Action"/>
        <class name="tests.DetaliedProjectPageTests"/>
    </classes>
</test>
<test name="superuser">
    <classes>
        <class name="tests.project.Action"/>
        <class name="tests.DetaliedProjectPageTests"/>
    </classes>
</test>

pom.xml:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.2</version>
                <configuration>
                    <parallel>tests</parallel>
                    <threadCount>2</threadCount>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                    <suiteXmlFiles>
                        <!--suppress UnresolvedMavenProperty -->
                        <suiteXmlFile>src/test/suites/${testSuite}.xml</suiteXmlFile>
                    </suiteXmlFiles>
                    <testFailureIgnore>true</testFailureIgnore>
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                    </argLine>
                    <systemPropertyVariables>
                        <resultsDirectory>target/allure-results</resultsDirectory>
                    </systemPropertyVariables>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>test</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>

TestClass DetaliedProjectPageTests.java

public class DetaliedProjectPageTests extends BaseTest {

    private DetailProjectPage detailProjectPage;
    private ProjectBoardPage projectBoardPage;
    private final int classPriority = 400;


    @BeforeClass(alwaysRun = true)
    public void preconditions () throws IOException {
        projectBoardPage = new ProjectBoardPage(driver);
        projectBoardPage.createProject();
        detailProjectPage = new DetailProjectPage(driver);
    }

    @Epic("Project page")
    @Feature("Manage pages")
    @Story("Duplicate page")
    @Test(priority = classPriority+1, description = "Duplication of the page")
    public void addDuplicateArticle() {
        int countArticlesBeforeDuplication = detailProjectPage.getCountArticles();
        detailProjectPage.clickArticleDuplicateBtn();
        int countArticlesAfterDuplication = detailProjectPage.getCountArticles();
        Assert.assertEquals(countArticlesBeforeDuplication + 1, countArticlesAfterDuplication, "Duplication of articles is not successful");
    }
....
....
    }

Я использую JUnit, но идея следующая.
Вы создаёте test suite:

StartDriver
Test1
Test2
StopDriver

Код в StartDriver

class StartDriver
{
protected static WebDriver driver;

@BeforeAll
static void setUpBeforeClass()
{
if (driver == null)
{
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
}
}
}

Проверка if гарантирует, что у вас только один раз создаётся объект ChromeDriver.
Test1, Test2 и StopDriver сабклассы StartDriver.

class Test1 extends StartServer
{
@Test
void openGoogleWebsite()
{
driver.get(“https://www.google.com/”);
assertEquals(“Google”, driver.getTitle());
}
}

class StopDriver extends StartServer
{
@Test
void tearDownAfterClass()
{
driver.quit();
}
}

Спасибо за ответ! Если driver = static, то driver без проблем передается из класса в класс при запуске тестов в один поток, а если запустить тесты параллельно - то происходит падение тестов по причине того что открывается для каждого сьюта свой браузер (это ожидаемо), но все тесты
пытаются выполниться только в одном браузере.
А если driver = НЕ static, то при параллельном запуске тестов открываются для каждого сьюта свой браузер (так и нужно), выполняются в каждом сьюте первый класс с тестами, а следующие классы в тесте падают по причине того что driver не передается с класса в класс…