testng.xml
<!DOCTYPE suite SYSTEM "
https://testng.org/testng-1.1.dtd">
<suite name="ParallelChromeCucumberTests" parallel="methods" data-provider-thread-count="2" verbose="2" share-thread-pool-for-data-providers="true">
<test name="ParallelChromeTests" enabled="true">
<classes>
<class name="com.digite.cloud.test.steps.CucumberChromeTestCombined"/>
</classes>
</test>
</suite>
webdriverfactory
package com.digite.actions.drivercapabilities;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Component
public class WebDriverFactory {
// Thread-safe driver management
private List<WebDriverFactory> webDriverThreadPool = Collections.synchronizedList(new ArrayList<>());
private ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<>();
@Value("${aws.env:
http://localhost:3000/}")
private String env;
@Value("${browser.mode:non-headless}")
private String browserMode;
// Constructor
public WebDriverFactory() {
}
// Create FirefoxDriver bean with prototype scope
@Bean(name = "firefoxDriver")
@Scope("prototype")
public WebDriver firefoxDriver() {
WebDriverManager.firefoxdriver().setup();
WebDriver firefoxDriver = new FirefoxDriver();
firefoxDriver.get(env);
threadLocalDriver.set(firefoxDriver);
return threadLocalDriver.get();
}
// Create ChromeDriver bean with prototype scope
@Bean(name = "chromeDriver")
@Scope("browserscope")
@Primary
public WebDriver chromeDriver() {
WebDriverFactory factory = new WebDriverFactory();
webDriverThreadPool.add(factory);
WebDriverManager.chromedriver().setup();
WebDriver chromeDriver = new ChromeDriver();
chromeDriver.get(env);
threadLocalDriver.set(chromeDriver);
return threadLocalDriver.get();
}
// Return the driver instance from ThreadLocal
public WebDriver getDriver() {
if (threadLocalDriver.get() == null) {
threadLocalDriver.set(chromeDriver());
}
return threadLocalDriver.get();
}
// Quit the driver instance and clean up
public void quitDriver() {
if (threadLocalDriver.get() != null) {
threadLocalDriver.get().quit();
threadLocalDriver.remove();
}
}
// Initialize driver objects for each thread
@BeforeSuite(alwaysRun = true)
public void instantiateDriverObject() {
WebDriverFactory factory = new WebDriverFactory();
webDriverThreadPool.add(factory);
}
// Get the current driver for the test
public WebDriver getDriverInstance() throws Exception {
return getDriver();
}
// Clear cookies after each test method
@AfterMethod(alwaysRun = true)
public void clearCookies() throws Exception {
getDriverInstance().manage().deleteAllCookies();
}
// Close all driver objects after the test suite completes
@AfterSuite(alwaysRun = true)
public void closeDriverObjects() {
for (WebDriverFactory factory : webDriverThreadPool) {
factory.quitDriver();
}
}
}
chromedriveroptionspackage com.digite.actions.drivercapabilities;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
//import static com.digite.actions.commands.Common.driver;
@Slf4j
public class ChromeDriverOptions {
public ChromeOptions setOptions(String mode){
log.info("ChromeDriver options are being set");
ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("disable-features=NetworkService");
options.addArguments("--remote-allow-origins=*");
if(mode.equalsIgnoreCase("headless")){
options.addArguments("headless");//to run on headless chrome browser on linux.Comment this line when running on local machine
}
options.addArguments("window-size=1920x1080");
options.setAcceptInsecureCerts(true);
options.addArguments("--enable-javascript");
options.addArguments("--disable-infobars");
options.addArguments("--disable-plugins");
options.addArguments("--disable-notifications");
options.addArguments("--disable-extensions");
options.addArguments("--disable-popup-blocking");
HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
options.addArguments("--test-type");
options.addArguments("start-maximized");
options.addArguments("--user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36");
options.addArguments("--disable-gpu");
options.addArguments("--disable-dev-shm-usage");
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable( LogType.PERFORMANCE, Level.ALL );
log.info("ChromeDriver options are successfully set");
return options;
}
}
browserscopeprocessor
package com.digite.actions.drivercapabilities;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class BrowserScopePostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
beanFactory.registerScope("browserscope",new BrowserScope());
}
}
browserscopeconfigpackage com.digite.actions.drivercapabilities;
import com.annotation.LazyConfiguration;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.CustomScopeConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BrowserScopeConfig{
@Bean
public BeanFactoryPostProcessor beanFactoryPostProcessor(){
return new BrowserScopePostProcessor();
}
}
browserscope
package com.digite.actions.drivercapabilities;
import org.openqa.selenium.NoSuchSessionException;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.support.SimpleThreadScope;
public class BrowserScope extends SimpleThreadScope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
Object driver = super.get(name, objectFactory);
if (driver instanceof RemoteWebDriver) {
try {
// Check if the session is valid
((RemoteWebDriver) driver).getSessionId();
} catch (NoSuchSessionException e) {
// If the session is stale, remove the instance and create a new one
super.remove(name);
driver = super.get(name, objectFactory); // Recreate if stale
}
} else if (driver == null) {
// If no driver exists, create a new one
driver = super.get(name, objectFactory);
}
return driver;
}
}
common.java
@PageFragment
@Component
public class Common extends ExceptionLogger {
private final Logger log = LoggerFactory.getLogger(Common.class);
public final WebDriver driver;
public final AndroidDriver a_driver = null;
public final ChromeDriver driver1 = null;
public WebElement local_element = null;
public final String VISIBILITY_OF_ELEMENT_LOCATED = "VISIBILITY_OF_ELEMENT_LOCATED";
public final String CLICKABILITY_OF_ELEMENT_LOCATED = "CLICKABILITY_OF_ELEMENT_LOCATED";
public final String PRESENCE_OF_ELEMENT_LOCATED = "PRESENCE_OF_ELEMENT_LOCATED";
public final String INVISIBILITY_OF_ELEMENT = "INVISIBILITY_OF_ELEMENT";
public final String IS_ALERT_PRESENT = "IS_ALERT_PRESENT";
public final String FRAME_TO_BE_AVAILABLE_AND_SWITCH_TO_IT = "FRAME_TO_BE_AVAILABLE_AND_SWITCH_TO_IT";
long startTime;
long endTime;
long duration;
By local_by = null;
String label = null;
public String moduleName = null;
// Constructor-based dependency injection
public Common(WebDriverFactory webDriverFactory) {
log.info("sdf");
driver = webDriverFactory.getDriver();
}
commonutilies
@PageFragment
public class CommonUtilities extends Common {
public CommonUtilities(WebDriverFactory webDriverFactory) {
super(webDriverFactory);
}
Properties common=PageObjectsFactory.loadProperties("commonUtilities.properties");
assignment.java
public class Assignment extends Common{
// private static final Object WebDriverFactory = ;
// CommonUtilities commonUtilities = new CommonUtilities(driver);
Properties discussionRepo= PageObjectsFactory.loadProperties("Discussion.properties");
Properties assignmentRepo= PageObjectsFactory.loadProperties("Assignment.properties");
public Assignment(WebDriverFactory webDriverFactory) throws Exception{
super(webDriverFactory);
}
assignmentsteps.java
@Autowired
private WebDriverFactory webDriverFactory;
private WebDriver driver;
public AssignmentSteps( ) {
Before(() -> {
driver = webDriverFactory.getDriver();
});
and there are two feature files,
,please help me with help of these codes