Wie überprüfe ich mit WebDriver, ob eine Warnung vorhanden ist?

77

Ich muss das Vorhandensein von Alert in WebDriver überprüfen.

Manchmal wird eine Warnung angezeigt, manchmal jedoch nicht. Ich muss zuerst überprüfen, ob die Warnung vorhanden ist, dann kann ich sie akzeptieren oder schließen, oder es wird angezeigt: Keine Warnung gefunden.

Yunfei Gu
quelle

Antworten:

85
public boolean isAlertPresent() 
{ 
    try 
    { 
        driver.switchTo().alert(); 
        return true; 
    }   // try 
    catch (NoAlertPresentException Ex) 
    { 
        return false; 
    }   // catch 
}   // isAlertPresent()

Überprüfen Sie den Link hier https://groups.google.com/forum/?fromgroups#!topic/webdriver/1GaSXFK76zY

ManMohan Vyas
quelle
2
In dem Link können Sie sehen, wie Sie das
Warnfenster
3
Die etwas falsche Antwort unten und die auf stackoverflow.com/questions/8244723/… sind ein viel besserer Weg, dies zu tun. Das Try / Catch-Modell protokolliert nicht nur klobig, sondern protokolliert auch, dass keine Warnung vorliegt.
Don Willis
4
ExpectedConditions.alertIsPresent()gibt Ihnen genau das gleiche, aber auf eine schönere Art und Weise und in nur einer Zeile :)
Nilesh
ExpectedConditions speichert nicht viel mehr Code als der einfache try catch.
sinisterrook
1
Ein Problem bei diesem Ansatz besteht darin, dass beim Überprüfen, ob die Warnung vorhanden ist, der Kontext auf die Warnung umgeschaltet wurde. Dies kann problematisch sein, wenn Sie es nicht erwarten.
JeffC
26

Mit der folgenden Option (C # -Implementierung, jedoch ähnlich in Java) können Sie feststellen, ob eine Ausnahme ohne Ausnahmen und ohne Erstellung des WebDriverWaitObjekts vorliegt.

boolean isDialogPresent(WebDriver driver) {
    IAlert alert = ExpectedConditions.AlertIsPresent().Invoke(driver);
    return (alert != null);
}
Lee Jensen
quelle
12

Ich würde vorschlagen, ExpectedConditions und alertIsPresent () zu verwenden . ExpectedConditions ist eine Wrapper-Klasse, die nützliche Bedingungen implementiert, die in der ExpectedCondition- Schnittstelle definiert sind .

WebDriverWait wait = new WebDriverWait(driver, 300 /*timeout in seconds*/);
if(wait.until(ExpectedConditions.alertIsPresent())==null)
    System.out.println("alert was not present");
else
    System.out.println("alert was present");
Nilesh
quelle
Fügen Sie nach "alertIsPresent ()" ein ".apply (driver)" hinzu oder machen Sie es richtig und verwenden Sie wait
Don Willis
Ich finde, dass dies eine TimeoutException auslöst.
Vince Bowdren
TimeoutException, wenn die erwartete Bedingung in einem bestimmten Timeout nicht erfüllt wurde. War Alert überhaupt vorhanden?
Nilesh
@ nilesh Links sind kaputt
Dev
7

Ich fand, dass das Fangen von Ausnahmen driver.switchTo().alert();in Firefox(FF V20 & Selen-Java-2.32.0) so langsam ist. "

Also wähle ich einen anderen Weg:

    private static boolean isDialogPresent(WebDriver driver) {
        try {
            driver.getTitle();
            return false;
        } catch (UnhandledAlertException e) {
            // Modal dialog showed
            return true;
        }
    }

Und es ist ein besserer Weg, wenn in den meisten Testfällen KEIN Dialog vorhanden ist (das Auslösen einer Ausnahme ist teuer).

andyf
quelle
Wenn ich eine C # -Implementierung Ihrer Funktion aufrufe, wird die Ausnahme ausgelöst, aber auch die Warnung geschlossen.
RMK
1
Trotzdem schließt es auch die Warnung, bis jetzt fand ich, dass dieser Ansatz am schnellsten ist, wenn es um die Erkennung von ExpectedConditions.alertIsPresent
Warnungen geht
Das Hauptproblem bei diesem Ansatz ist das Essen der Warnung. Wenn der Alarm nicht vorhanden ist driver.switchTo (). Alert () dauert es ungefähr 6-10 ms in FF 62
Pranoy Sarkar
6

Ich würde vorschlagen, ExpectedConditions und alertIsPresent () zu verwenden . ExpectedConditions ist eine Wrapper-Klasse, die nützliche Bedingungen implementiert, die in der ExpectedCondition- Schnittstelle definiert sind .

public boolean isAlertPresent(){
    boolean foundAlert = false;
    WebDriverWait wait = new WebDriverWait(driver, 0 /*timeout in seconds*/);
    try {
        wait.until(ExpectedConditions.alertIsPresent());
        foundAlert = true;
    } catch (TimeoutException eTO) {
        foundAlert = false;
    }
    return foundAlert;
}

Hinweis: Dies basiert auf der Antwort von nilesh, ist jedoch angepasst, um die TimeoutException abzufangen, die von der wait.until () -Methode ausgelöst wird.

Vince Bowdren
quelle
Noch ein Hinweis: In C # ist dies die WebDriverTimeoutException. Ich nehme an, das liegt daran, dass es eine System.TimeoutException-Klasse gibt, die leicht damit verwechselt werden könnte.
John Chesshir
2

Dieser Code prüft, ob die Warnung vorhanden ist oder nicht.

public static void isAlertPresent(){
    try{
    Alert alert = driver.switchTo().alert();
    System.out.println(alert.getText()+" Alert is Displayed"); 
    }
    catch(NoAlertPresentException ex){
    System.out.println("Alert is NOT Displayed");
    }
    }
Vishnu BS
quelle
2

ExpectedConditions ist veraltet, also:

        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
        wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.AlertIsPresent());

C # Selen 'ExpectedConditions ist veraltet'

CarolCiola
quelle
1

public boolean isAlertPresent () {

try 
{ 
    driver.switchTo().alert(); 
    system.out.println(" Alert Present");
}  
catch (NoAlertPresentException e) 
{ 
    system.out.println("No Alert Present");
}    

}}

Vikas
quelle
Fügen Sie eine detailliertere Beschreibung hinzu.
Mathews Sunny
1
public static void handleAlert(){
    if(isAlertPresent()){
        Alert alert = driver.switchTo().alert();
        System.out.println(alert.getText());
        alert.accept();
    }
}
public static boolean isAlertPresent(){
      try{
          driver.switchTo().alert();
          return true;
      }catch(NoAlertPresentException ex){
          return false;
      }
}
Naveen
quelle