Check if any alert exists using selenium with python

Question:

I’m trying to write a test with selenium in python language for a web page that manages users. In this page someone can add role for users and if a role exists while adding it, an alert raises. I don’t know if the alert is a javascript alert or an element of the web page. I want to automatically check the existence of the alert, because checking for the role in the list wastes time and has an enormous load. I tried this:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
try:
    alert = browser.switch_to_alert()
    alert.accept()
    print "alert accepted"
except:
    print "no alert"

But it didn’t work and I got the “UnexpectedAlertPresentException”.
I also tried this:

browser = webdriver.Firefox()
browser.get("url")
browser.find_the_element_by_id("add_button").click()
s = set(browser.window_handles)
s.remove(browser.current_window_handle)
browser.switch_to_window(s.pop()) 

But I got the same exception.
Additionally, I tried to access the alert with firebug to check if I can get access with its properties, but right click was disabled.
I need a solution very quickly, even in other languages. I can understand the approach anyway.
I will appreciate any help.

Asked By: Zeinab Abbasimazar

||

Answers:

What I do is to set a conditional delay with WebDriverWait just before the point I expect to see the alert, then switch to it, like this:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

browser = webdriver.Firefox()
browser.get("url")
browser.find_element_by_id("add_button").click()

try:
    WebDriverWait(browser, 3).until(EC.alert_is_present(),
                                   'Timed out waiting for PA creation ' +
                                   'confirmation popup to appear.')

    alert = browser.switch_to.alert
    alert.accept()
    print("alert accepted")
except TimeoutException:
    print("no alert")

WebDriverWait(browser,3) will wait for at least 3 seconds for a supported alert to appear.

Answered By: A.R.

In java we do it like this

WebDriverWait wait3 = new WebDriverWait(driver, 7000);
wait3.until(ExpectedConditions.alertIsPresent());
driver.switchTo().alert().accept();

It will implicitly wait for alert if alert is not present it will throw ‘Alert is not present Exceptio’ which we can catch and move ahead.

Hope it helps.

Answered By: Abhishek Singh

I know this is a too late answer and you have solved this question years ago, but I still want to post my analysis and findings for possible future readers’ reference.

I am working on a Django website development project, and currently there is a bug that once a particular web page is opened, an error message box is popped up. My environment is:

  • Django 1.8
  • Python 2.7
  • Selenium 2.46.0

I read the document here about the “UnexpectedAlertPresentException”, and it says:

Thrown when an unexpected alert is appeared.

Usually raised when when an expected modal is blocking webdriver form executing any more commands.

I tested in my project and my findings are:

  • When the alert box is up, the find_element_by_X methods can succeed.
  • The click() or send_keys() will fail with the “UnexpectedAlertPresentException”.

Therefore, I think the try...catch block doesn’t work because the “UnexpectedAlertPresentException” is thrown in the line of

browser.find_the_element_by_id("add_button").click()

This also means that the alert box may appear as soon as the web page is opened by this line:

browser.get("url")

In other words, there might be a problem hidden deeper behind that caused the alert box up as soon as the page is opened. You may need to fix that problem first.

Another thing is: Assuming the alert box showed up after this line:

browser.find_the_element_by_id("add_button").click()

Then the alert = browser.switch_to_alert() should work well with no exception thrown, which contradicts to what you describe here. This also made me think that the problem is as early as the browser.get("url") line.

I’m not very sure how the selected solution helped you solve the problem because my analysis shows the problem lies in a different place. Anyway, I am not asking for reselecting the accepted solution. I just want to share my thoughts for future readers. Apologize in case that I overlooked or misunderstood something in this question which caused my analysis to be wrong (and which wastes your time reading this :-).

Answered By: yaobin
alert = self.driver.switch_to.alert
    if alert.is_displayed():
        alert.accept()
Answered By: Ricardo Valbuena

Try this short solution using explicit wait method.

try:
    wait.until(EC.alert_is_present())
    driver.switch_to.alert.accept()
    print("Alert accepted")
except:
    print("no Alert found")
Answered By: Amar Kumar