Error del controlador de web: “No hay alerta presente” después de que se lanza la excepción UnexpectedAlertPresentException

Estoy tratando de probar una aplicación web que estoy desarrollando. Estoy usando el controlador de Firefox contra Firefox 22.0.

En un momento dado, puede aparecer un diálogo modal (un indicador de Javascript ()). Si lo hace, quiero ingresar un texto y luego descartarlo (haga clic en Aceptar).

Aquí está el código relevante:

try: if button.text == "Run": button.click() except UnexpectedAlertPresentException: alert = self.driver.switch_to_alert() print alert.text alert.send_keys('8080') alert.dismiss() 

Se está UnexpectedAlertPresentException la UnexpectedAlertPresentException . Sin embargo, tan pronto como intenta ejecutar print alert.text , obtengo:

 `NoAlertPresentException: Message: u'No alert is present'`. 

Si alert.send_keys la statement de impresión, se infla en alert.send_keys con:

 `WebDriverException: Message: u'fxdriver.modals.find_(...) is null'` 

No lo entiendo ¿No está la NoAlertPresentException por definición, en contradicción con la excepción UnexpectedAlertPresentException que se generó e hizo que el bloque de excepción se ejecutara en primer lugar?

Edición: Además, por mi vida no puedo encontrar ninguna documentación sobre la UnexpectedAlertPresentException en http://selenium.googlecode.com/svn/trunk/docs/api/py/index.html#documentation

Edit 2: Esto es lo que tengo ahora:

 try: if button.text == "Run": button.click() alert = self.driver.switch_to_alert() alert.send_keys('1111') alert.dismiss() except NoAlertPresentException: pass 

Sin embargo, todavía estoy viendo esto:

 WebDriverException: Message: u'fxdriver.modals.find_(...) is null' 

en la línea alert.send_keys('8080') . Supongo que no entiendo por qué switch_to_alert() no lanza NoAlertPresent si no hay una alerta … que es lo que supongo que indica WebDriverException .

Creo que Selenium cierra alertas inesperadas. Aparentemente, puede cambiar la forma en que el controlador de Firefox trata las alertas inesperadas: ¿Cómo manejar una alerta con la capacidad “UnexpectedAlertBehaviour” en Selenium?

Como alternativa, puede verificar si hay una alerta antes de actuar (después de todo, si desea manejar la alerta no es inesperado), por lo que (Java):

 try { Alert alert = _driver.switchTo().alert(); //do stuff with alert } catch (final NoAlertPresentException e) { //do non-alert stuff } 

Puede que no sea el mejor progtwigdor de Python, porque empecé con eso hace una semana. Me encargué de crear una pequeña función que acepte CUALQUIER alerta, y también lo haré con más alertas.

Si cambiamos el IF a WHILE en la línea -2 (segundo desde la cola), también podemos manejar confirmaciones / alertas consecutivas. Usando IF puede manejar las respuestas de confirm () Usando WHILE puede manejar todas las alertas (). Si la alerta se encuentra en un tiempo límite, debe intentar “omitir” la alerta () en el momento correcto.

Me las arreglé para agregar 2 controladores de excepciones, para omitir las alertas de Reino Unido () y también para detener cuando no hay alerta () presente.

 import selenium from selenium import webdriver import os import time from selenium.common.exceptions import UnexpectedAlertPresentException from selenium.common.exceptions import NoAlertPresentException os.system("pkill php") os.system("php -S localhost:2222 alert.html &") fire = webdriver.Firefox() fire.get("http://localhost:2222") global alert def alert_accept(): try: alert = fire.switch_to_alert() print "Aler text:" + alert.text alert.accept() print "Alert detected, accept it" return True except UnexpectedAlertPresentException: print "Hum..., continue?" return False except NoAlertPresentException: print "No alert here" return False while alert_accept() == True: alert_accept() 

No puedes probarlo con ningún sitio web. He hecho un html local con algunas alertas diferentes para investigar un poco sobre eso.

Código HTML:

     

En realidad, el WHILE y el IF manejan la página completa, supongo que debido al tiempo de espera. Si pones todo en onces lo hace.

Estoy bastante seguro de que esto se puede hacer usando esperas implícitas y las condiciones esperadas con un código más corto. Si echa un vistazo a la fuente de alert_is_present no verá nada más que un bash: bloque con retorno verdadero / falso.

Para mi caso, necesito hacer clic en el botón Cargar sin seleccionar Archivo y verificar que venga un mensaje de alerta o no. Pero en mi caso, al hacer clic en el botón Cargar, viene la siguiente excepción selenium.common.exceptions.UnexpectedAlertPresentException: Texto de alerta: Mensaje: diálogo modal presente En mi caso, alert.accept o alert.dismiss no funciona Así que lo hice para presionar la tecla Tab y seleccione el botón Cargar y presione la tecla Intro a través del código Python. Su funcionamiento perfecto.