2011-07-28 72 views
31

Estoy escribiendo pruebas para una aplicación web usando selenium webDriver y me encontré con un escenario en el que cuando intento cerrar el navegador aparece una ventana emergente que dice "¿Estás seguro?". confirme que quiere irse; los datos ingresados ​​se perderán ". con 2 botones: Dejar página y permanecer en la páginaSelenium WebDriver cómo cerrar el navegador emergente

¿Cómo hago clic en esos botones?

Respuesta

20
((JavascriptExecutor) _driver) 
      .executeScript("window.onbeforeunload = function(e){};"); 

resolvió el problema para mí

+0

¿Conoces la solución para ruby ​​on rails? – beornborn

+0

¡Gracias! ¡Trabajó para mi! – Darxis

+2

Esto simplemente elimina el enlace emergente, no hace clic en un botón. – James

-2

Pon una de ellas antes de que el evento click:

selenium.chooseCancelOnNextConfirmation() 

selenium.chooseOkOnNextConfirmation() 
+0

que funcione para Selenio RC pero no para WebDriver – Maalamaal

+0

@ ethan.thomason: Creo cartel quiere la respuesta para WebDriver, no para Selenio RC. Entonces, su respuesta no es precisa –

1

No está seguro de cuál es la estructura de la ventana emergente que ha utilizado. Aquí hay algunos que pueden funcionar para usted si ha utilizado una ventana emergente.

Si es una alerta. que puede probar:

driver.SwitchTo().Alert() 

Si es una ventana que aparece a continuación:

driver.SwitchTo().Window(<windowname>) 

Para iFrame:

driver.SwitchTo().Frame("iFrmLinks") 

Una vez que obtenga a través de cualquiera de los tres entonces usted puede acceder a todos sus elementos internos.

Saludos Tahir

+0

¿Cómo regresar a la ventana original desde Alerta/Ventana/Marco? –

+0

Dado el texto presentado por OP, la ventana emergente probablemente sea una alerta. – oneloop

0

puede intentar utilizar los eventos del teclado. Entonces, una vez que aparece la ventana emergente:

Pestaña en el botón "Aceptar".

driver.Keyboard.PressKey(Keys.Tab); 

Tendrá que jugar para ver cuántas prensas de pestañas se requieren.

A continuación, pulse espacio.

driver.Keyboard.PressKey(Keys.Space); 

Sí que es una especie de truco, pero WebDriver es todavía muy inmaduro.

EDITAR: Esto funcionará para ventanas emergentes "reales", pero como dijo otra persona que responde, tal vez no para cosas raras en la página. Básicamente, si puede tabular manualmente el botón de cierre, este método debería funcionar.

15
IAlert alert = driver.SwitchTo().Alert(); 

alert.Accept(); //for two buttons, choose the affirmative one 
// or 
alert.Dismiss(); //to cancel the affirmative decision, i.e., pop up will be dismissed and no action will take place 
+1

No funciona en Chrome. –

11

Puede interactuar con alertas y similares mediante el Alert API. El cambio a la alerta y confirmar que se vería así (en Java):

Alert alert = driver.switchTo().alert(); 
alert.accept(); 

Esto también se explica en el Selenium FAQ.

6
def close_all_popups(driver): 
    driver.window_handles 
    for h in driver.window_handles[1:]: 
     driver.switch_to_window(h) 
     driver.close() 
    driver.switch_to_window(driver.window_handles[0]) 
+0

¿está dirigido a cerrar ventanas emergentes del navegador, en lugar de descartar las alertas de JavaScript? porque no funciona para este último ... – hwjp

0

Tengo el mismo problema cuando tengo forma de campos y "hacer la edición de" botón de enviar, porque cuando Selenio IDE de auto-clic en la función de JavaScript, que se encarga de desactivar la ventana de confirmación (o salir de la página todavía en él), no se necesita el evento de mouse "mouseup" que significa window.confirm todavía funciona y la prueba de auto-pass fue fallida.Mi solución es anular la función de Javascript window.onbeforeload en este caso (no es necesario preguntar si sabemos que lo hacemos cuando grabamos la prueba en Selenium IDE). Puede ejecutar la secuencia de comandos de anulación en el IDE de Selnium antes de hacer clic en el botón "Guardar" (o algo similar) a través de selenium.runScript - simplemente debe deshabilitar la ventana de confirmación.

Command: runScript 
    Target: {window.onbeforeunload=function(e){};} 
0

Debe controlar las alertas inesperadas con try catch blocks. Poner su código en bloque try y coger el 'UnhandledAlertException'

Ejemplo:

try{ 
    ..... 
    ..... 
    code here 
}catch(UnhandledAlertException e){ 
    driver.switchto().alert().dismiss(); 
} 
Cuestiones relacionadas