2011-11-23 28 views
34

Deseo detectar si una alerta aparece o no. Actualmente estoy usando el siguiente código:Manejo de alertas en Selenium WebDriver (selenio 2) con Java

try { 
     Alert alert = webDriver.switchTo().alert(); 

     // check if alert exists 
     // TODO find better way 
     alert.getText(); 

     // alert handling 
     log().info("Alert detected: {}" + alert.getText()); 
     alert.accept(); 
    } catch (Exception e) { 
    } 

El problema es que si no hay una alerta en el estado actual de la página web, se espera un periodo específico de tiempo hasta que se alcanza el tiempo de espera y, a continuación, se emite una excepción y, por lo tanto, el rendimiento es realmente malo.

¿Hay una mejor manera, tal vez un controlador de eventos de alerta que puedo usar para alertas de ocurrencia dinámica?

Respuesta

69

Esto es lo que funcionó para mí utiliza espera explícita de aquí WebDriver: Advanced Usage

public void checkAlert() { 
    try { 
     WebDriverWait wait = new WebDriverWait(driver, 2); 
     wait.until(ExpectedConditions.alertIsPresent()); 
     Alert alert = driver.switchTo().alert(); 
     alert.accept(); 
    } catch (Exception e) { 
     //exception handling 
    } 
} 
+1

Eso es interesante y podría hacer el truco. ¿Es posible establecer el tiempo de espera del método de espera en cero? – Alp

0

Usted podría intentar

try{ 
     if(webDriver.switchTo().alert() != null){ 
      Alert alert = webDriver.switchTo().alert(); 
      alert.getText(); 
      //etc. 
     } 
    }catch(Exception e){} 

Si eso no funciona, puede probar con bucle a través de todos los identificadores de ventana y ver si existe la alerta. No estoy seguro de si la alerta se abre como una nueva ventana con selenio.

for(String s: webDriver.getWindowHandles()){ 
//see if alert exists here. 
} 
+0

Lamentablemente, ambas soluciones no funcionan. El primero es tan lento como mi código porque ya crea la excepción al tener un tiempo de espera excedido. El segundo no reconoce alertas. – Alp

+0

Lo siento, valió la pena intentarlo jajaja. –

+0

@Reid Mac: tu respuesta funcionó para mí. – djangofan

15

Escribir el siguiente método:

public boolean isAlertPresent() { 
    try { 
     driver.switchTo().alert(); 
     return true; 
    } // try 
    catch (Exception e) { 
     return false; 
    } // catch 
} 

Ahora, se puede comprobar si la alerta está presente o no por utilizando el método escrito anteriormente como se indica a continuación:

if (isAlertPresent()) { 
    driver.switchTo().alert(); 
    driver.switchTo().alert().accept(); 
    driver.switchTo().defaultContent(); 
} 
3
 
Alert alert = driver.switchTo().alert(); 

alert.accept(); 

También puede rechazar el cuadro de alerta:

 

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

alert().dismiss(); 
2
try 
    { 
     //Handle the alert pop-up using seithTO alert statement 
     Alert alert = driver.switchTo().alert(); 

     //Print alert is present 
     System.out.println("Alert is present"); 

     //get the message which is present on pop-up 
     String message = alert.getText(); 

     //print the pop-up message 
     System.out.println(message); 

     alert.sendKeys(""); 
     //Click on OK button on pop-up 
     alert.accept(); 
    } 
    catch (NoAlertPresentException e) 
    { 
     //if alert is not present print message 
     System.out.println("alert is not present"); 
    } 
Cuestiones relacionadas