Unexpected alert handling in Selenium Java - Build an Automation Script
import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.NoAlertPresentException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class UnexpectedAlertHandlingTest { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); WebDriver driver = new ChromeDriver(); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); try { // Navigate to form page driver.get("https://example.com/form"); // Enter username WebElement usernameInput = wait.until(ExpectedConditions.elementToBeClickable(By.id("username"))); usernameInput.sendKeys("testuser"); // Click submit button WebElement submitBtn = driver.findElement(By.id("submitBtn")); submitBtn.click(); // Wait briefly for alert presence try { wait.until(ExpectedConditions.alertIsPresent()); Alert alert = driver.switchTo().alert(); alert.accept(); } catch (NoAlertPresentException e) { // No alert appeared, continue } // Verify URL changed to success page wait.until(ExpectedConditions.urlToBe("https://example.com/form-success")); String currentUrl = driver.getCurrentUrl(); if (!"https://example.com/form-success".equals(currentUrl)) { throw new AssertionError("Expected URL to be https://example.com/form-success but was " + currentUrl); } System.out.println("Test passed: Unexpected alert handled and success page loaded."); } finally { driver.quit(); } } }
This test script uses Selenium WebDriver with Java to automate the manual test case.
First, it opens the form page and waits until the username input is clickable, then enters 'testuser'.
Next, it clicks the submit button.
After clicking, it waits explicitly for an alert to appear. If an alert appears, it switches to it and accepts it. If no alert appears, it catches the exception and continues without failing.
Finally, it waits until the URL changes to the expected success page URL and asserts this condition. If the URL is not as expected, it throws an assertion error.
The test ends by quitting the browser.
This approach uses explicit waits and proper exception handling to manage unexpected alerts gracefully.
Now add data-driven testing with 3 different usernames to submit the form and handle alerts
Practice
Solution
Step 1: Understand unexpected alerts impact
Unexpected alerts block the browser and stop test execution if not handled.Step 2: Purpose of handling alerts
Handling alerts allows the test to continue smoothly without interruption.Final Answer:
To prevent tests from stopping abruptly due to unhandled pop-ups -> Option AQuick Check:
Unexpected alerts stop tests = Handle alerts [OK]
- Thinking alerts only slow tests, not stop them
- Confusing alert handling with browser resizing
- Assuming alerts are for logging only
Solution
Step 1: Identify correct alert switching syntax
The correct method to switch to alert is driver.switchTo().alert()Step 2: Accept the alert
Calling accept() on the alert confirms it and closes the pop-up.Final Answer:
driver.switchTo().alert().accept(); -> Option CQuick Check:
Switch to alert then accept = driver.switchTo().alert().accept() [OK]
- Reversing switchTo() and alert() calls
- Using dismiss() instead of accept() when accept is needed
- Calling sendKeys() without parameters
driver.findElement(By.id("submit")).click();
driver.switchTo().alert().dismiss();
driver.findElement(By.id("next")).click();Solution
Step 1: Click triggers alert
Clicking submit may cause an alert to appear unexpectedly.Step 2: Alert is dismissed explicitly
driver.switchTo().alert().dismiss() closes the alert, allowing further actions.Step 3: Next element interaction
After dismissing alert, clicking next proceeds without interruption.Final Answer:
The alert will be dismissed and the next button clicked successfully -> Option DQuick Check:
Dismiss alert then continue = success [OK]
- Assuming alert auto-dismisses without code
- Expecting accept() instead of dismiss() here
- Ignoring NoAlertPresentException possibility
try {
driver.findElement(By.id("save")).click();
} catch (NoAlertPresentException e) {
driver.switchTo().alert().accept();
}Solution
Step 1: Understand exception usage
NoAlertPresentException occurs when alert is not present but code tries to switch to alert.Step 2: Analyze catch block logic
Alert handling code is wrongly placed inside catch for NoAlertPresentException, which means alert is not present.Step 3: Correct approach
Alert handling should be in try block or catch should handle different exception like UnhandledAlertException.Final Answer:
Alert handling code is inside catch for wrong exception -> Option BQuick Check:
Catch wrong exception for alert handling = error [OK]
- Catching NoAlertPresentException to handle alert
- Placing alert.accept() inside catch for missing alert
- Confusing accept() and dismiss() usage
Solution
Step 1: Understand unexpected alert during click
Clicking the button may cause an unexpected alert, throwing UnhandledAlertException.Step 2: Use try-catch to handle alert and retry click
Catch UnhandledAlertException, accept alert, then retry clicking the button to ensure action completes.Step 3: Verify other options
driver.findElement(By.id("btn")).click(); driver.switchTo().alert().accept(); and C do not handle exceptions; try { driver.switchTo().alert().accept(); } catch (NoAlertPresentException e) { driver.findElement(By.id("btn")).click(); } tries alert first which may not exist before click.Final Answer:
try { driver.findElement(By.id("btn")).click(); } catch (UnhandledAlertException e) { driver.switchTo().alert().accept(); driver.findElement(By.id("btn")).click(); } -> Option AQuick Check:
Catch alert exception, accept, retry click = safe handling [OK]
- Not retrying click after alert acceptance
- Handling alert before click without exception
- Catching wrong exception types
Ready to prove it?
Pass the test and this pattern moves unknown
