Performance metrics via DevTools in Selenium Java - Build an Automation Script
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.v115.performance.Performance; import org.openqa.selenium.devtools.v115.performance.model.Metric; import org.openqa.selenium.devtools.v115.page.Page; import org.openqa.selenium.devtools.v115.page.model.LifecycleEvent; import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedCondition; import java.time.Duration; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class PerformanceMetricsTest { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); ChromeOptions options = new ChromeOptions(); ChromeDriver driver = new ChromeDriver(options); DevTools devTools = driver.getDevTools(); devTools.createSession(); // Enable performance domain devTools.send(Performance.enable()); // Navigate to the page driver.get("https://example.com"); // Wait for load event fired WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(webDriver -> { List<LifecycleEvent> lifecycleEvents = devTools.send(Page.getLifecycleEvents()); return lifecycleEvents.stream().anyMatch(e -> e.getName().equals("load")); }); // Get performance metrics List<Metric> metrics = devTools.send(Performance.getMetrics()); // Convert list to map for easy lookup Map<String, Double> metricsMap = metrics.stream() .collect(Collectors.toMap(Metric::getName, Metric::getValue)); // Assertions if (!metricsMap.containsKey("FirstContentfulPaint")) { throw new AssertionError("Missing FirstContentfulPaint metric"); } if (!metricsMap.containsKey("DomContentLoaded")) { throw new AssertionError("Missing DomContentLoaded metric"); } if (!metricsMap.containsKey("LoadEvent")) { throw new AssertionError("Missing LoadEvent metric"); } if (metricsMap.get("FirstContentfulPaint") <= 0) { throw new AssertionError("FirstContentfulPaint metric value is not greater than zero"); } if (metricsMap.get("DomContentLoaded") <= 0) { throw new AssertionError("DomContentLoaded metric value is not greater than zero"); } if (metricsMap.get("LoadEvent") <= 0) { throw new AssertionError("LoadEvent metric value is not greater than zero"); } System.out.println("Performance metrics collected successfully:"); System.out.println(metricsMap); driver.quit(); } }
This Java Selenium test uses ChromeDriver and the Chrome DevTools Protocol (CDP) to collect performance metrics.
First, it sets up ChromeDriver and creates a DevTools session.
It enables the Performance domain to access performance metrics.
Then it navigates to the target URL and waits explicitly for the page load event to ensure the page is fully loaded.
After that, it collects the performance metrics and converts them into a map for easy access.
The test asserts that key metrics like FirstContentfulPaint, DomContentLoaded, and LoadEvent exist and have values greater than zero, indicating valid timings.
Finally, it prints the metrics and closes the browser.
This approach uses explicit waits and CDP commands properly, following best practices for reliable and maintainable test automation.
Now add data-driven testing to collect performance metrics for three different URLs: 'https://example.com', 'https://wikipedia.org', and 'https://github.com'.
Practice
Solution
Step 1: Understand DevTools role in Selenium
DevTools integration allows Selenium to collect browser performance data like load times.Step 2: Identify the purpose of performance metrics
Performance metrics help measure page speed and resource usage to improve user experience.Final Answer:
To measure page load speed and browser performance -> Option DQuick Check:
Performance metrics = page speed measurement [OK]
- Confusing performance metrics with element locators
- Thinking DevTools handles alerts
- Assuming screenshots are related to performance
Solution
Step 1: Identify the correct DevTools command for performance
The Performance domain in DevTools is enabled by calling Performance.enable().Step 2: Check other options for correctness
devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); enables Network, not Performance. driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(10)); sets timeout, and B loads a page.Final Answer:
devTools.send(Performance.enable()); -> Option AQuick Check:
Enable performance with Performance.enable() [OK]
- Using Network.enable() instead of Performance.enable()
- Confusing timeout settings with performance enabling
- Calling driver.get() instead of enabling metrics
metrics.getMetrics()?
DevTools devTools = driver.getDevTools(); devTools.createSession(); devTools.send(Performance.enable()); PerformanceMetrics metrics = devTools.send(Performance.getMetrics()); System.out.println(metrics.getMetrics().get(0).getName());
Solution
Step 1: Understand Performance.getMetrics() return type
It returns a PerformanceMetrics object containing a list of Metric objects, each with a name and value.Step 2: Analyze metrics.getMetrics().get(0).getName()
This accesses the first Metric's name, which is a String describing the metric.Final Answer:
A String representing the name of the first performance metric -> Option CQuick Check:
getName() returns String metric name [OK]
- Assuming getName() returns a number
- Confusing metrics with WebElements
- Expecting a boolean from getMetrics()
DevTools devTools = driver.getDevTools(); devTools.send(Performance.enable()); devTools.createSession();
Solution
Step 1: Check the order of DevTools commands
Session must be created before sending any DevTools commands like Performance.enable().Step 2: Verify method usage
Calling Performance.enable() before createSession() causes an error because no session exists yet.Final Answer:
createSession() must be called before sending commands -> Option BQuick Check:
Call createSession() first, then enable performance [OK]
- Calling enable() before createSession()
- Thinking Performance.enable() needs parameters
- Assuming DevTools is unsupported in ChromeDriver
Solution
Step 1: Enable performance monitoring before page load
Performance must be enabled before loading the page to capture all metrics during load.Step 2: Load the page and then retrieve metrics filtering for 'DomContentLoaded'
After page load, get metrics and select the 'DomContentLoaded' metric to measure load time.Final Answer:
Enable performance, load page, then get metrics and filter for 'DomContentLoaded' -> Option AQuick Check:
Enable first, load page, then get metrics [OK]
- Enabling performance after page load misses metrics
- Getting metrics before loading page
- Relying only on timeout settings for load time
Ready to prove it?
Pass the test and this pattern moves unknown
