how to interact with the browser's developer tools during automation tests that are running in a distributed Selenium Grid environment, using Docker?
package GenericUtils;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.v130.network.Network;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import io.github.bonigarcia.wdm.WebDriverManager;
public class BaseClass {
public FileUtility fLib = new FileUtility();
public WebDriverUtility wLib = new WebDriverUtility();
public ExcelUtility eLib = new ExcelUtility();
public JavaUtility jLib = new JavaUtility();
public WebDriver driver;
public static WebDriver sdriver = null;
public String USERNAME;
public String PASSWORD;
public String INVALIDUSERNAME;
public String INVALIDPASSWORD;
@BeforeSuite
public void bSuite() {
}
@BeforeClass
public void launchBrowser() throws Throwable {
// Read data from property file
String BROWSER = fLib.getPropertyKeyValue("Browser");
String URL = fLib.getPropertyKeyValue("url");
String REMOTE = fLib.getPropertyKeyValue("remote"); // New property to decide remote or local execution
if (REMOTE.equalsIgnoreCase("yes")) {
// Configure for Selenium Grid
if (BROWSER.equalsIgnoreCase("chrome")) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-debugging-port=9222");
driver = new RemoteWebDriver(new URL("
http://localhost:4444/wd/hub"), options);
if (driver instanceof ChromeDriver) {
ChromeDriver chromeDriver = (ChromeDriver) driver;
DevTools devTools = chromeDriver.getDevTools();
devTools.createSession(); // Create a DevTools session
// Enable the Network domain to capture network events
devTools.send(org.openqa.selenium.devtools.v85.network.Network.enable(Optional.of(1000000), Optional.of(1000000), Optional.of(1000000)));
// Capture network responses
devTools.addListener(org.openqa.selenium.devtools.v85.network.Network.responseReceived(), response -> {
String url = response.getResponse().getUrl();
int statusCode = response.getResponse().getStatus();
System.out.println("URL: " + url + " | Status Code: " + statusCode);
if (statusCode == 200) {
System.out.println("Network request to " + url + " succeeded with status 200 OK.");
} else {
System.out.println("Network request to " + url + " failed with status " + statusCode);
}
});
} else {
System.out.println("Driver is not an instance of ChromeDriver.");
}
} else if (BROWSER.equalsIgnoreCase("edge")) {
EdgeOptions options1 = new EdgeOptions();
options1.addArguments("--remote-debugging-port=9222");
driver = new RemoteWebDriver(new URL("
http://localhost:4444/wd/hub"), options1);
if (driver instanceof EdgeDriver) {
EdgeDriver edgeDriver = (EdgeDriver) driver;
DevTools devTools = edgeDriver.getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.of(1000000), Optional.of(1000000), Optional.of(1000000)));
devTools.addListener(Network.responseReceived(), response -> {
String url = response.getResponse().getUrl();
int statusCode = response.getResponse().getStatus();
System.out.println("URL: " + url + " | Status Code: " + statusCode);
if (statusCode == 200) {
System.out.println("Network request to " + url + " succeeded with status 200 OK.");
} else {
System.out.println("Network request to " + url + " failed with status " + statusCode);
}
});
} else {
System.out.println("DevTools is only supported for EdgeDriver.");
}
} else if (BROWSER.equalsIgnoreCase("firefox")) {
EdgeOptions options2 = new EdgeOptions();
driver = new RemoteWebDriver(new URL("
http://localhost:4444/wd/hub"), options2);
} else {
System.out.println("Invalid browser specified for remote execution.");
return;
}
System.out.println("===========Browser Launch on Selenium Grid Successfully===========");
} else {
// Local execution
if (BROWSER.equalsIgnoreCase("edge")) {
EdgeOptions options = new EdgeOptions();
WebDriverManager.edgedriver().setup();
HashMap<String, Object> edgePrefs = new HashMap<>();
edgePrefs.put("download.default_directory", System.getProperty("user.dir") + "\\Download-Files");
edgePrefs.put("profile.default_content_settings.popups", 0);
edgePrefs.put("profile.default_content_setting_values.automatic_downloads", 1);
EdgeOptions options2 = new EdgeOptions();
options2.setExperimentalOption("excludeSwitches", new String[] {"enable-automation"});
options2.setExperimentalOption("prefs", edgePrefs);
driver = new EdgeDriver();
if (driver instanceof EdgeDriver) {
EdgeDriver edgeDriver = (EdgeDriver) driver;
DevTools devTools = edgeDriver.getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.of(1000000), Optional.of(1000000), Optional.of(1000000)));
devTools.addListener(Network.responseReceived(), response -> {
String url = response.getResponse().getUrl();
int statusCode = response.getResponse().getStatus();
System.out.println("URL: " + url + " | Status Code: " + statusCode);
if (statusCode == 200) {
System.out.println("Network request to " + url + " succeeded with status 200 OK.");
} else {
System.out.println("Network request to " + url + " failed with status " + statusCode);
}
});
} else {
System.out.println("DevTools is only supported for EdgeDriver.");
}
} else if (BROWSER.equalsIgnoreCase("chrome")) {
WebDriverManager.chromedriver().setup();
System.setProperty("webdriver.chrome.driver", "./drivers/chromedriver.exe");
HashMap<String, Object> prefs = new HashMap<>();
prefs.put("download.default_directory", System.getProperty("user.dir") + "\\Download-Files");
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
options.setExperimentalOption("w3c", true);
options.setExperimentalOption("excludeSwitches", new String[] {"enable-automation"});
driver = new ChromeDriver(options);
if (driver instanceof ChromeDriver) {
ChromeDriver chromeDriver = (ChromeDriver) driver;
DevTools devTools = chromeDriver.getDevTools();
devTools.createSession();
devTools.send(Network.enable(Optional.of(1000000), Optional.of(1000000), Optional.of(1000000)));
devTools.addListener(Network.responseReceived(), response -> {
String url = response.getResponse().getUrl();
int statusCode = response.getResponse().getStatus();
System.out.println("URL: " + url + " | Status Code: " + statusCode);
if (statusCode == 200) {
System.out.println("Network request to " + url + " succeeded with status 200 OK.");
} else {
System.out.println("Network request to " + url + " failed with status " + statusCode);
}
});
} else {
System.out.println("DevTools is only supported for EdgeDriver.");
}
} else if (BROWSER.equalsIgnoreCase("firefox")) {
WebDriverManager.firefoxdriver().setup();
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", System.getProperty("user.dir") + "\\Download-Files");
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/xlsx");
profile.setPreference("pdfjs.disabled", true);
FirefoxOptions options = new FirefoxOptions();
options.setProfile(profile);
driver = new FirefoxDriver(options);
}else if (BROWSER.equalsIgnoreCase("safari")) {
WebDriverManager.safaridriver().setup();
driver = new SafariDriver();
}else
{
System.out.println("Invalid browser specified for local execution.");
return;
}
System.out.println("===========Browser Launch Locally Successfully===========");
}
// Common configurations
wLib.maximiseWindow(driver);
wLib.waitUntilPageLoad(driver);
driver.get(URL);
sdriver = driver; // Assigning to static driver
}
@BeforeMethod
public void loginToApp() throws Throwable {
//read data from property file
USERNAME = fLib.getPropertyKeyValue("username");
PASSWORD = fLib.getPropertyKeyValue("password");
INVALIDUSERNAME = fLib.getPropertyKeyValue("invalidusername");
INVALIDPASSWORD = fLib.getPropertyKeyValue("invalidpassword");
System.out.println("=============login sucessfull===========");
}
@AfterMethod
public void logoutApp() {
//sign out of home page
System.out.println("==========sign out sucessfull==========");
}
@AfterClass
public void closeBrowser() {
//driver.quit();
System.out.println("=====Browser close sucessfull============");
}
@AfterSuite
public void closeDB() {
System.out.println("=============DB connection closed sucessfully======");
}
}
code is running successfully in grid but not getting any details in console
Please help!!