2011-11-29 13 views
11

Actualmente estoy colaborando en una prueba de concepto usando Selenium 2/WebDriver con C# contra una aplicación ASP.NET MVC utilizando InternetExplorerDriver.¿Cómo puedo esperar de manera confiable las alertas de JavaScript usando Selenium2/WebDriver?

La aplicación utiliza un patrón estándar para notificar a los usuarios que se ha guardado un registro. Esto funciona mediante la configuración TempData para incluir "Registro guardado satisfactoriamente", y si TempData está presente en la Vista, la vista alertará al mensaje.

Al trabajar en pruebas de Selenium para esta funcionalidad, estamos recibiendo comportamiento inconstitant desde el código de prueba #/selenio por debajo de C:

 _driver.Navigate().GoToUrl(_baseUrl + "/Amraam/List"); 
     _driver.FindElement(By.LinkText("Create New")).Click(); 

     _driver.FindElement(By.Id("txtAmraamSerialNumber")).SendKeys("CC12345"); 

     var selectElement = new SelectElement(_driver.FindElement(By.Id("LocationId"))); 
     selectElement.SelectByText("Tamworth"); 
     _driver.FindElement(By.Id("btnSave")).Click(); 
     var wait = new WebDriverWait(_driver, defaultTimeout); 
     IAlert alert = wait.Until(drv => drv.SwitchTo().Alert()); 
     _alertText = alert.Text; 

     alert.Accept(); 
     Assert.That(_alertText, Is.EqualTo("Record successfully saved")); 

Aproximadamente el 50% de las veces, Selinium fallará con un

OpenQA.Selenium.NoAlertPresentException: No hay alerta activa

Tengo dificultades para encontrar una forma exacta de replicar el problema y me preocupa el aspecto de incoherencia. Si falla sistemáticamente, podemos depurar y rastrear el problema.

Respuesta

15

El manejo de alertas y avisos dentro de Selenium 2 es bastante nuevo y aún se encuentra en desarrollo activo. Probablemente sus fallas se deben a la sincronización, por lo que le sugiero que escriba un método de envoltura alrededor de la llamada a SwitchTo(). Alert() para que detecte OpenQA.Selenium.NoAlertPresentException e ignórelo hasta que expire el tiempo de espera.

Algo tan simple como esto debería funcionar:

private IAlert AlertIsPresent(IWebDriver drv) 
{ 
    try 
    { 
     // Attempt to switch to an alert 
     return drv.SwitchTo().Alert(); 
    } 
    catch (OpenQA.Selenium.NoAlertPresentException) 
    { 
     // We ignore this execption, as it means there is no alert present...yet. 
     return null; 
    } 

    // Other exceptions will be ignored and up the stack 
} 

Esta línea

IAlert alert = wait.Until(drv => drv.SwitchTo().Alert()); 

se convertiría entonces en

IAlert alert = wait.Until(drv => AlertIsPresent(drv)); 
+0

Saludos para eso. En realidad, trabajando más, descubrimos que esto no era realmente un problema con el selenio, pero en realidad con nuestra aplicación bajo prueba y el pedido de eventos de JavaScript con un clic de botón (no preguntes ...) De todos modos, el selenio se comportaba solo . @Naishy, ​​tu respuesta se ve muy bien, sin embargo, y lo hubiéramos intentado de otra manera, ¡salud! –

+0

Puede utilizar la sintaxis del grupo de métodos para hacer que la última línea sea un poco más sucinta; 'IAlert alert = wait.Until (AlertIsPresent);'. –

+1

Ahora puede usar ExpectedCondition.AlertIsPresent Ver: http://stackoverflow.com/a/24550934/200824 –

Cuestiones relacionadas