Answer
Chrome DevTools Protocol (CDP) in Selenium 4
CDP allows Selenium tests to communicate directly with Chrome''s DevTools, enabling capabilities impossible with standard WebDriver commands.
Setup
Java
ChromeDriver driver = new ChromeDriver();
DevTools devTools = driver.getDevTools();
devTools.createSession();
1. Mock Network Conditions (Throttling)
Java
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
devTools.send(Network.emulateNetworkConditions(
false, // offline
100, // latency (ms)
500 * 1024, // downloadThroughput (bytes/sec = 500KB/s)
200 * 1024, // uploadThroughput
Optional.of(ConnectionType.CELLULAR3G)
));
driver.get("https://automateqa.online");
2. Block Specific URLs / Requests
Java
devTools.send(Network.setBlockedURLs(List.of("*.png", "*.jpg", "analytics.js")));
driver.get("https://example.com"); // loads without images/analytics
3. Capture Console Logs
Java
devTools.addListener(Log.entryAdded(), entry -> {
System.out.println("[" + entry.getLevel() + "] " + entry.getText());
});
driver.get("https://example.com");
4. Capture Network Requests/Responses
Java
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
devTools.addListener(Network.responseReceived(), response -> {
System.out.println("URL: " + response.getResponse().getUrl());
System.out.println("Status: " + response.getResponse().getStatus());
});
5. Override Geolocation
Java
devTools.send(Emulation.setGeolocationOverride(
Optional.of(51.5074), // London latitude
Optional.of(-0.1278), // London longitude
Optional.of(1) // accuracy
));
driver.get("https://maps.google.com");
6. Emulate Device (Mobile)
Java
Map<String, Object> deviceMetrics = new HashMap<>();
deviceMetrics.put("width", 375);
deviceMetrics.put("height", 812);
deviceMetrics.put("mobile", true);
deviceMetrics.put("deviceScaleFactor", 3);
driver.executeCdpCommand("Emulation.setDeviceMetricsOverride", deviceMetrics);
7. Set Authentication Headers
Java
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
String credentials = Base64.getEncoder().encodeToString("admin:password".getBytes());
devTools.send(Network.setExtraHTTPHeaders(
new Headers(Map.of("Authorization", "Basic " + credentials))
));
8. Get Performance Metrics
Java
devTools.send(Performance.enable(Optional.empty()));
List<Metric> metrics = devTools.send(Performance.getMetrics());
metrics.forEach(m -> System.out.println(m.getName() + ": " + m.getValue()));
