Before locators and waits, every Selenium framework needs reliable browser setup: launching each browser, choosing it from configuration, headless and incognito runs, notifications, window sizes, cookies, timeouts and clean shutdown. These Selenium browser practice exercises cover all of it, each with a solution and what to check. They fit before the other exercise sets, such as locators and dropdowns.
Exercise 1: Launch Chrome, maximise, open a URL and quit
WebDriver driver = new ChromeDriver(); // Selenium Manager resolves the driver (Selenium 4.6+)
driver.manage().window().maximize();
driver.get("https://the-internet.herokuapp.com/");
System.out.println(driver.getTitle());
driver.quit();Check: the title prints and no browser or driver process is left running.
Exercise 2: Repeat for Firefox and Edge, and validate the page loaded
WebDriver driver = new FirefoxDriver(); // or new EdgeDriver()
driver.get("https://the-internet.herokuapp.com/");
new WebDriverWait(driver, Duration.ofSeconds(10)).until(d ->
((JavascriptExecutor) d).executeScript("return document.readyState").equals("complete"));
assertTrue(driver.findElement(By.tagName("h1")).isDisplayed());
Exercise 3: get() vs navigate().to(), back, forward and refresh
driver.get("https://the-internet.herokuapp.com/");
driver.navigate().to("https://the-internet.herokuapp.com/login");
driver.navigate().back(); assertTrue(driver.getCurrentUrl().endsWith(".com/"));
driver.navigate().forward(); assertTrue(driver.getCurrentUrl().endsWith("/login"));
driver.navigate().refresh();Both get() and navigate().to() load a page and wait according to the page load strategy; navigate() adds history methods.
Exercise 4: Choose the browser from a config file
Properties p = new Properties();
try (InputStream in = new FileInputStream("src/test/resources/config.properties")) { p.load(in); }
String browser = System.getProperty("browser", p.getProperty("browser", "chrome"));
WebDriver driver = switch (browser.toLowerCase()) {
case "firefox" -> new FirefoxDriver();
case "edge" -> new EdgeDriver();
default -> new ChromeDriver();
};Check: mvn test -Dbrowser=firefox overrides the file.
Exercise 5: Choose the browser from testng.xml (cross-browser runs)
<suite name="CrossBrowser" parallel="tests" thread-count="3">
<test name="Chrome"><parameter name="browser" value="chrome"/><classes><class name="tests.HomeTest"/></classes></test>
<test name="Firefox"><parameter name="browser" value="firefox"/><classes><class name="tests.HomeTest"/></classes></test>
<test name="Edge"><parameter name="browser" value="edge"/><classes><class name="tests.HomeTest"/></classes></test>
</suite>@Parameters("browser")
@BeforeMethod
public void setUp(@Optional("chrome") String browser) { driver.set(DriverFactory.create(browser)); }
Exercise 6: Run Chrome headless
ChromeOptions o = new ChromeOptions();
o.addArguments("--headless=new", "--window-size=1920,1080");
WebDriver driver = new ChromeDriver(o);Always set a window size in headless mode; the default viewport is small and changes layouts. Firefox: new FirefoxOptions().addArguments("-headless").
Exercise 7: Open Chrome in incognito mode
new ChromeDriver(new ChromeOptions().addArguments("--incognito"));Each WebDriver session already uses a fresh, temporary profile, so incognito mainly matters when you test incognito-specific behaviour.
Exercise 8: Disable browser notification pop-ups
ChromeOptions o = new ChromeOptions();
o.addArguments("--disable-notifications");
// or deny via preferences: 2 = block
o.setExperimentalOption("prefs", Map.of("profile.default_content_setting_values.notifications", 2));
Exercise 9: Set a custom window size and position
driver.manage().window().setSize(new Dimension(375, 812)); // phone-sized viewport
driver.manage().window().setPosition(new Point(0, 0));
assertEquals(driver.manage().window().getSize().getWidth(), 375);For real mobile emulation in Chrome, use ChromeOptions.setExperimentalOption("mobileEmulation", Map.of("deviceName", "iPhone 12 Pro")).
Exercise 10: Delete cookies and reload; delete cookies before login
driver.get("https://the-internet.herokuapp.com/login");
driver.manage().deleteAllCookies();
driver.navigate().refresh();
// read, add and delete individual cookies
driver.manage().addCookie(new Cookie("consent", "yes"));
assertNotNull(driver.manage().getCookieNamed("consent"));
driver.manage().deleteCookieNamed("consent");
Exercise 11: Set page load, script and implicit timeouts
driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30));
driver.manage().timeouts().scriptTimeout(Duration.ofSeconds(10));
// prefer explicit waits over implicitlyWait in frameworks
Exercise 12: Change the page load strategy
ChromeOptions o = new ChromeOptions();
o.setPageLoadStrategy(PageLoadStrategy.EAGER); // NORMAL (default), EAGER (DOM ready), NONEEAGER can speed up pages with heavy images or ads, but you must then wait explicitly for what you need.
Exercise 13: Accept insecure certificates and set a download folder
ChromeOptions o = new ChromeOptions();
o.setAcceptInsecureCerts(true);
o.setExperimentalOption("prefs", Map.of(
"download.default_directory", System.getProperty("user.dir") + "/downloads",
"download.prompt_for_download", false));
Exercise 14: Use WebDriverManager, or rely on Selenium Manager
Since Selenium 4.6, Selenium Manager downloads the right driver automatically, so new ChromeDriver() just works. WebDriverManager (WebDriverManager.chromedriver().setup()) is still useful on older Selenium versions or for its extra features such as Docker browsers.
Exercise 15: Close one window vs quit the browser
String main = driver.getWindowHandle();
driver.switchTo().newWindow(WindowType.TAB).get("https://example.com");
driver.close(); // closes only the current tab
driver.switchTo().window(main); // must switch back before continuing
driver.quit(); // ends the whole session
Exercise 16: Take a screenshot and capture browser info
File png = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
Files.copy(png.toPath(), Path.of("screens/home.png"), StandardCopyOption.REPLACE_EXISTING);
Capabilities caps = ((HasCapabilities) driver).getCapabilities();
System.out.println(caps.getBrowserName() + " " + caps.getBrowserVersion());
FAQs
Do I still need WebDriverManager in Selenium 4?
Not for basic driver setup: Selenium Manager (built in since 4.6) downloads matching drivers automatically. WebDriverManager remains useful for older versions and some advanced features.
Why set a window size in headless mode?
Headless browsers start with a small default viewport, which can hide elements or switch the site to a mobile layout; setting 1920×1080 keeps behaviour consistent with headed runs.