with tables example python testing selenium alertdialog window-handles

tables - Compruebe si existe alguna alerta usando selenio con python



selenium tables (3)

Estoy intentando escribir una prueba con selenio 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, porque verificar el rol en la lista es una pérdida de tiempo y 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 la "UnexpectedAlertPresentException". También intenté 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 verificar si puedo acceder con sus propiedades, pero el clic derecho estaba deshabilitado. Necesito una solución muy rápidamente, incluso en otros idiomas. Puedo entender el enfoque de todos modos. Apreciaré cualquier ayuda.


En Java lo hacemos así

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

Implícitamente esperará la alerta si la alerta no está presente arrojará ''Alerta no está presente Exceptio'' que podemos atrapar y seguir adelante.

Espero eso ayude.


Lo que hago es establecer un retraso condicional con WebDriverWait justo antes del punto en que espero ver la alerta, luego cambiar a ella, así:

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_the_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á al menos 3 segundos para que aparezca una alerta compatible.


Sé que esta es una respuesta demasiado tardía y ustedes han resuelto esta pregunta hace años, pero aún quiero publicar mis 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 here sobre "UnexpectedAlertPresentException" y dice:

Lanzado cuando aparece una alerta inesperada.

Por lo general, se genera cuando un modal esperado bloquea el formulario de webdriver ejecutando más comandos.

Probé en mi proyecto y mis hallazgos son:

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

Por lo tanto, creo que el bloque try...catch no funciona porque la "UnexpectedAlertPresentException" se arroja 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 se abra la página web con esta línea:

browser.get("url")

En otras palabras, puede haber un problema oculto más profundo que provocó que el cuadro de alerta se active tan pronto como se abra la página. Es posible que deba solucionar ese problema primero.

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

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

Entonces la alert = browser.switch_to_alert() debería funcionar bien sin excepción, lo cual contradice lo que usted 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 te ayudó a resolver el problema porque mi análisis muestra que el problema radica en un lugar diferente. De todos modos, no estoy pidiendo volver a seleccionar la solución aceptada. Solo quiero compartir mis pensamientos para futuros lectores. Discúlpame por si pasé por alto o malentendí algo en esta pregunta que hizo que mi análisis fuera erróneo (y que pierdas el tiempo leyendo esto :-).