Compruebe si existe alguna alerta de uso de selenium con python

Estoy intentando escribir una prueba con selenium en lenguaje python para una página web que administra usuarios. En esta página, alguien puede agregar un rol para los usuarios y, si existe un rol al agregarlo, se genera una alerta. No sé si la alerta es una alerta de javascript o un elemento de la página web. Quiero verificar automáticamente la existencia de la alerta, ya que la verificación del rol en la lista desperdicia tiempo y tiene una carga enorme. Intenté esto:

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" 

Pero no funcionó y obtuve el “UnexpectedAlertPresentException”. También probé esto:

 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()) 

Pero tengo la misma excepción. Además, traté de acceder a la alerta con firebug para comprobar si puedo obtener acceso a sus propiedades, pero el clic derecho estaba desactivado. Necesito una solución muy rápidamente, incluso en otros idiomas. Puedo entender el enfoque de todos modos. Apreciaré cualquier ayuda.

Lo que hago es establecer un retraso condicional con WebDriverWait justo antes del punto en el que espero ver la alerta, luego cambiarlo, de esta manera:

 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 ) esperará por lo menos 3 segundos para que aparezca una alerta compatible.

Sé que esta es una respuesta demasiado tardía y que ha resuelto esta pregunta hace años, pero todavía quiero publicar mi análisis y hallazgos para posibles referencias de futuros lectores.

Estoy trabajando en un proyecto de desarrollo de sitio web de Django, y actualmente hay un error que una vez que se abre una página web en particular, aparece un cuadro de mensaje de error. Mi entorno es:

  • Django 1.8
  • Python 2.7
  • Selenio 2.46.0

Leí el documento aquí sobre “UnexpectedAlertPresentException”, y dice:

Se lanza cuando aparece una alerta inesperada.

Generalmente se genera cuando un modo esperado está bloqueando el formulario webdriver ejecutando más comandos.

He probado en mi proyecto y mis conclusiones son:

  • Cuando el cuadro de alerta está activo, los métodos find_element_by_X pueden tener éxito.
  • El click () o send_keys () fallarán con la “UnexpectedAlertPresentException”.

Por lo tanto, creo que el bloque try...catch no funciona porque la excepción “UnexpectedAlertPresentException” aparece en la línea de

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

Esto también significa que el cuadro de alerta puede aparecer tan pronto como esta página abra la página web:

 browser.get("url") 

En otras palabras, podría haber un problema oculto más profundo que causó que el cuadro de alerta se abriera tan pronto como se abriera la página. Es posible que tengas que arreglar ese problema primero.

Otra cosa es: asumiendo que el cuadro de alerta apareció después de esta línea:

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

Entonces alert = browser.switch_to_alert() debería funcionar bien sin excepción, lo que contradice lo que describe aquí. Esto también me hizo pensar que el problema es tan temprano como la línea browser.get("url") .

No estoy muy seguro de cómo la solución seleccionada lo ayudó a resolver el problema porque mi análisis muestra que el problema se encuentra en un lugar diferente. De todos modos, no estoy pidiendo que se vuelva a seleccionar la solución aceptada. Solo quiero compartir mis pensamientos para futuros lectores. Discúlpese en caso de que haya pasado por alto o malinterpretado algo en esta pregunta que hizo que mi análisis fuera incorrecto (y que desperdicie su tiempo leyendo esto :-).

En java lo hacemos así.

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

Esperará implícitamente la alerta si la alerta no está presente, lanzará ‘La alerta no está presente, Exceptio’, que podemos capturar y seguir adelante.

Espero eso ayude.