Headless execution in Selenium Java - Build an Automation Script
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class HeadlessGoogleTitleTest { public static void main(String[] args) { // Set ChromeOptions to enable headless mode ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); // Use new headless mode for Chrome 109+ WebDriver driver = new ChromeDriver(options); try { driver.get("https://www.google.com"); // Wait up to 10 seconds for title to be 'Google' WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(ExpectedConditions.titleIs("Google")); // Assert the title is exactly 'Google' String actualTitle = driver.getTitle(); if (!"Google".equals(actualTitle)) { throw new AssertionError("Expected title 'Google' but found '" + actualTitle + "'"); } System.out.println("Test passed: Page title is 'Google'"); } finally { driver.quit(); // Ensure browser closes } } }
This code uses ChromeOptions to enable headless mode, so the browser runs without opening a window. This is useful for running tests on servers or CI systems.
We create a WebDriver instance with these options, then navigate to Google.
We use WebDriverWait with ExpectedConditions.titleIs to wait until the page title is exactly 'Google'. This avoids timing issues.
Then we assert the title matches exactly. If not, we throw an error to fail the test.
Finally, we close the browser in a finally block to ensure cleanup even if the test fails.
This approach follows best practices: explicit waits, proper resource cleanup, and using headless mode correctly.
Now add data-driven testing to verify page titles for three different URLs: https://www.google.com, https://www.bing.com, and https://www.duckduckgo.com
Practice
headless mode?Solution
Step 1: Understand headless mode concept
Headless mode means running browser tests without showing the browser window on screen.Step 2: Identify the main purpose
This mode is mainly used to run tests faster and on servers where no display is available.Final Answer:
To run tests without opening the browser window -> Option AQuick Check:
Headless mode = No browser window [OK]
- Thinking headless slows down tests
- Confusing headless with mobile testing
- Assuming headless always shows screenshots
Solution
Step 1: Recall correct syntax for headless mode
In Selenium Java, headless mode is enabled by adding the argument "--headless" to ChromeOptions.Step 2: Check each option
Only ChromeOptions options = new ChromeOptions(); options.addArguments("--headless"); uses the correct method and argument syntax.Final Answer:
ChromeOptions options = new ChromeOptions(); options.addArguments("--headless"); -> Option BQuick Check:
Use addArguments("--headless") to enable headless [OK]
- Using incorrect argument names like "headless-mode"
- Trying to call non-existent methods like enableHeadless()
- Assuming setHeadless(true) exists in ChromeOptions
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");
System.out.println(driver.getTitle());
driver.quit();Solution
Step 1: Understand headless mode behavior
Headless mode runs browser without UI but still loads pages and executes scripts normally.Step 2: Analyze code output
The code loads example.com and prints its title. This works fine in headless mode.Final Answer:
Prints the page title of https://example.com without opening a browser window -> Option CQuick Check:
Headless loads page and gets title correctly [OK]
- Assuming headless mode disables page loading
- Thinking getTitle() returns empty in headless
- Expecting visible browser window in headless mode
ChromeOptions options = new ChromeOptions();
options.addArguments("headless");
WebDriver driver = new ChromeDriver(options);
driver.get("https://example.com");Solution
Step 1: Check argument syntax for headless mode
The correct argument to enable headless mode is "--headless" with two dashes, not "headless".Step 2: Verify other code parts
Using ChromeOptions with ChromeDriver and calling get() is valid. No casting needed.Final Answer:
The argument should be "--headless" with two dashes -> Option AQuick Check:
Use "--headless" argument exactly [OK]
- Using single dash or no dash in headless argument
- Thinking ChromeOptions can't be passed to ChromeDriver
- Believing get() is disabled in headless mode
Solution
Step 1: Recall how to enable headless mode in Chrome and Firefox
In Selenium Java, Chrome uses addArguments("--headless") to enable headless mode. FirefoxOptions has a setHeadless(true) method.Step 2: Match correct methods for each browser
Use ChromeOptions.addArguments("--headless") for Chrome and FirefoxOptions.setHeadless(true) for Firefox correctly uses addArguments for Chrome and setHeadless for Firefox.Final Answer:
Use ChromeOptions.addArguments("--headless") for Chrome and FirefoxOptions.setHeadless(true) for Firefox -> Option DQuick Check:
Chrome uses addArguments, Firefox uses setHeadless [OK]
- Using setHeadless(true) for Chrome which does not exist
- Using incorrect argument like "headless" without dashes for Firefox
- Mixing methods between browsers incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
