Мы можем достичь этого с помощью параллельных тестов + Selenium Grid. Вы можете упомянуть в testng. xml file
<suite name="regression" thread-count="2" parallel="tests">
<test name="sanity">
<classes>
<class name="com.orangehrm.tests.Test1"></class>
</classes>
</test>
<test name="smoke pack" >
<classes>
<class name="com.orangehrm.tests.Test2"></class>
</classes>
</test>
</suite>
В java есть класс ThreadLocal, который позволяет создавать переменные, которые могут быть прочитаны или записаны одним и тем же потоком. Таким образом, даже если два потока обращаются к одному и тому же коду, но два потока не могут видеть друг друга.
Вы можете использовать синхронизированный метод, который будет создавать экземпляр драйвера и запускать браузер. Как то так
public class WDBase {
private static ThreadLocal<RemoteWebDriver> th=new ThreadLocal<RemoteWebDriver>();
public static synchronized void setDriver(String browserName) throws MalformedURLException {
System.setProperty("webdriver.chrome.driver", "././drivers/chromedriver.exe");
ChromeOptions coptions=new ChromeOptions();
th.set(new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), coptions));
}
public static synchronized RemoteWebDriver getDriver(){
return th.get();
}
public static synchronized void launchBrowser(String browserName) throws IOException {
setDriver(browserName);
prop=PropertyReader.readProperties();
getDriver().manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
getDriver().manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
getDriver().manage().window().maximize();
getDriver().get(prop.getProperty("url"));
}
public static synchronized void killBrowser() {
if (driver!=null)
th.get().close();
th.get().quit();
}
}