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.

Advertisement

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), NONE

EAGER 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.