Yes, Selenium WebDriver can handle pop-ups and alerts. These user prompts are common in web applications, and Selenium provides a way to interact with them.
Handling JavaScript Alerts, Confirmations, and Prompts
JavaScript has three types of popup boxes: alert, confirmation, and prompt boxes. Selenium WebDriver can handle these using the Alert
interface. Here are the methods provided by the Alert
interface:
accept()
: Clicks the "Ok" button in alerts or confirmation prompts.dismiss()
: Clicks the "Cancel" button in confirmation prompts.getText()
: Retrieves the text of the alert, confirmation, or prompt.sendKeys(String stringToSend)
: Sends text to a prompt.
Python Example
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Assuming you have already initialized the WebDriver `driver`
driver.get("http://example.com/page_with_alert")
# Wait for the alert to be displayed and store it in a variable
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
# Store the alert text in a variable
alert_text = alert.text
# Press the 'Ok' button
alert.accept()
# If it's a confirmation box, you could also dismiss it
# alert.dismiss()
# If it's a prompt, you could send keystrokes to it
# alert.send_keys("Sample text")
JavaScript Example
In JavaScript, Selenium WebDriver bindings are provided by the selenium-webdriver
package. Here's how you could handle an alert in JavaScript:
const {Builder, By, until, Alert} = require('selenium-webdriver');
(async function example() {
let driver = await new Builder().forBrowser('firefox').build();
try {
await driver.get('http://example.com/page_with_alert');
// Wait for the alert to be displayed
await driver.wait(until.alertIsPresent());
// Store it in a variable
let alert = await driver.switchTo().alert();
// Store the alert text in a variable
let alertText = await alert.getText();
// Press the 'Ok' button
await alert.accept();
// If it's a confirmation box, you could also dismiss it
// await alert.dismiss();
// If it's a prompt, you could send keystrokes to it
// await alert.sendKeys('Sample text');
} finally {
await driver.quit();
}
})();
Handling Window-based Pop-ups
If the pop-up is a new window or tab, you can handle it by switching to that window using the switchTo().window()
method and then interacting with the elements within it.
Python Example
# Get the current window handle
main_window_handle = driver.current_window_handle
# Click the link that opens a new window
driver.find_element(By.ID, "popup_link").click()
# Wait for the new window or tab
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
# Loop through until we find a new window handle
for handle in driver.window_handles:
if handle != main_window_handle:
driver.switch_to.window(handle)
break
# Now you can interact with the pop-up
# ...
# Close the pop-up if you need to
driver.close()
# Switch back to the main window
driver.switch_to.window(main_window_handle)
JavaScript Example
// Get the current window handle
let mainWindowHandle = await driver.getWindowHandle();
// Click the link that opens a new window
await driver.findElement(By.id('popup_link')).click();
// Wait for the new window or tab
await driver.wait(async () => (await driver.getAllWindowHandles()).length === 2, 10000);
// Loop through until we find a new window handle
let allWindowHandles = await driver.getAllWindowHandles();
for(let handle of allWindowHandles) {
if(handle !== mainWindowHandle) {
await driver.switchTo().window(handle);
break;
}
}
// Now you can interact with the pop-up
// ...
// Close the pop-up if you need to
await driver.close();
// Switch back to the main window
await driver.switchTo().window(mainWindowHandle);
Remember to add proper exception handling and to test these scripts thoroughly, as pop-up behavior may vary based on browser settings and the specific implementation of the pop-up in the web application.