You should use WebDriverWait
with some expected condition. For example,
WebDriverWait wait = new WebDriverWait(driver, 5); // sets timeout to 5 seconds
wait.until(...); // Use ExpectedCondition to set the condition you need to check for (i.e. element to be clickable, frame to be visible, etc.)
// Do your thing.
The until
method will return an object type relative to the function passed. For example, until(ExpectedConditions.elementToBeClickable(...));
will return a WebElement
object you can use to exert an action on (like clicking on it).
Lastly, you should wrap those lines in a try/catch and handle the TimeoutException
the wait method will throw if the condition never arises.
To summarize, structurally, your code should look something like this:
// instantiate the WebDriver
...
int timeoutMax = 2; // The maximum number of seconds you wish to wait before timing out (let's assume 2 seconds is reasonable for your case)
try {
By checkboxLocator = By.id("checkboxID"); // Locate element by some criteria (id, css, xpath). Using by ID for illustration purposes only
By buttonLocator = By.id("buttonID"); // same as above
By popupLocator = By.id("frameid"); // same as above
WebDriverWait wait = new WebDriverWait(driver, timeoutMax);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(popupLocator)); // assuming it is an iframe
// The next lines will not be executed if the "Don't display this again" and clicking "OK" were clicked before (locating the frame will timeout because it not be visible)
WebElement checkbox = wait.until(ExpectedConditions.elementToBeClickable(checkboxLocator));
WebElement okBtn = wait.until(ExpectedConditions.elementToBeClickable(checkboxLocator));
checkbox.click();
okBtn.click();
driver.switchTo().defaultContent(); // Switch back to default window
} catch (TimeoutException exc) {
// Handle exception (i.e. log a warning) - This should be thrown as long as the modal dialog doesn't become visible
// If modal dialog ever becomes visible again, clicking on the checkbox and OK button will be executed again.
}
Something like this should work. Of course, this make some assumptions that might not be true for your case. However, if you use the right locating technique for your modal dialog, you should be able to:
- Locate the modal window (use By class to locate it)
- Use
WebDriverWait
to setup your timeout conditions
- Tell the driver to switch to it (if this times out, skip steps 3, 4, and 5)
- Locate the checkbox and OK buttons
- Click the checkbox and the OK button in that order
- Tell the driver to switch back to the main window
- Continue with your test