Testen Sie mit Selenium WebDriver, ob ein Element vorhanden ist

Lesezeit: 8 Minuten

Benutzeravatar des Testers
Tester

Gibt es eine Möglichkeit zu testen, ob ein Element vorhanden ist? Irgendein findElement Methode würde in einer Ausnahme enden, aber das ist nicht das, was ich will, denn es kann sein, dass ein Element nicht vorhanden ist und das ist in Ordnung. Das ist kein Versagen des Tests, also kann eine Ausnahme nicht die Lösung sein.

Ich habe diesen Beitrag gefunden: Selenium C# WebDriver: Warten Sie, bis das Element vorhanden ist.

Aber das ist für C#, und ich bin nicht sehr gut darin. Wie würde der Code in Java lauten? Ich habe es in ausprobiert Finsternisaber ich habe es nicht richtig in den Java-Code bekommen.

Dies ist der Code:

public static class WebDriverExtensions{
    public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){

        if (timeoutInSeconds > 0){
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }
}

  • Ich habe ein paar Methoden, die sehr effektiv bei der Suche nach einem Objekt funktionieren, aber es hängt davon ab, was Sie damit machen wollen. Möchten Sie beispielsweise nach dem Element suchen, bis es existiert, möchten Sie danach suchen, bis es nicht mehr existiert, oder möchten Sie einfach versuchen, es zu finden?

    – CBRRacer

    3. November 2011 um 17:10 Uhr


  • Java ist C# sehr ähnlich. Ich denke, eines der Hauptprobleme, auf die Sie hier stoßen, ist in Java, es ist WebElement anstelle von IWebElement

    – CBRRacer

    3. November 2011 um 17:12 Uhr

  • Kennen Sie die implizite Wartemethode? Wenn Sie dies zu Beginn des Tests einrichten, müssen Sie nie auf die Existenz eines Elements prüfen, da es den impliziten Wartewert zum Abfragen verwendet. Wenn es diesen Wert jedoch überschreitet, wird eine Ausnahme ausgelöst

    – Bob Evans

    3. November 2011 um 18:56 Uhr

  • Hier ist mein Beitrag über WebDriverWait in Java: WebDriverWait

    Benutzer1047795

    15. November 2011 um 14:36 ​​Uhr

  • Wenn beide Fälle in Ordnung sind, kann dies für die Testleistung problematisch sein, da sich die Wartezeit für das Warten auf ein Element, von dem Sie nicht erwarten, dass es vorhanden ist, wirklich summiert. Ich habe ein paar Hacks verwendet, um die Wartezeit zu umgehen, aber ich muss noch eine wirklich saubere Lösung dafür finden.

    – mrfreester

    3. November 2014 um 22:26 Uhr

Benutzeravatar von el roso
el rose

Verwenden findElements Anstatt von findElement.

findElements gibt anstelle einer Ausnahme eine leere Liste zurück, wenn keine übereinstimmenden Elemente gefunden werden.

Um zu überprüfen, ob ein Element vorhanden ist, können Sie dies versuchen

Boolean isPresent = driver.findElements(By.yourLocator).size() > 0

Dies gibt true zurück, wenn mindestens ein Element gefunden wird, und false, wenn es nicht existiert.

Die offizielle Dokumentation empfiehlt diese Methode:

findElement sollte nicht verwendet werden, um nach nicht vorhandenen Elementen zu suchen, verwenden Sie stattdessen findElements(By) und bestätigen Sie die Antwort der Länge Null.

  • Dadurch wird viel Zeit für die Ausführung Ihrer Tests benötigt. Sie können diese Technik nicht überall anwenden.

    – Juritsch

    25. Oktober 2012 um 15:13 Uhr

  • @Droogans – Ich werde Ihren Tests keine Zeit hinzufügen. Der Grund dafür ist, dass die standardmäßige implizite Wartezeit immer noch 0 ist. Wenn Sie die standardmäßige implizite Wartezeit erhöhen, stimme ich dem zu, aber das scheint hier nicht der Fall zu sein.

    – Djangofan

    14. Januar 2015 um 18:56 Uhr

  • Guter Anruf Djangofan! Ich habe diese Strategie erfolgreich angewendet, indem ich die implizite Wartezeit der Treiber-Timeouts auf Null gesetzt und dann wieder auf den vorherigen Wert geändert habe.

    – Schmirgel

    27. Mai 2015 um 17:18 Uhr


  • Dies führte zu einer NoSuchElementFound-Ausnahme, was schade ist, da ich gehofft hatte, dies zu verwenden, um zu vermeiden, dass diese Ausnahme in einem bestimmten Fall abgefangen wird.

    Benutzer3864935

    4. August 2015 um 8:54 Uhr

  • Viel einfacher ist die Verwendung von: if(driver.getPageSource().contains(“Ein Text in der Seite”)){} Wenn die Seite diesen Text enthält, dann ist die Bedingung wahr, oder sie ist falsch und Sie können codieren entsprechend.

    – Pradyot

    20. November 2018 um 10:01 Uhr

Benutzeravatar von Dennis
Dennis

Verwenden Sie eine private Methode, die einfach nach dem Element sucht und bestimmt, ob es vorhanden ist, wie folgt:

private boolean existsElement(String id) {
    try {
        driver.findElement(By.id(id));
    } catch (NoSuchElementException e) {
        return false;
    }
    return true;
}

Das wäre ganz einfach und macht den Job.

Sie könnten sogar noch weiter gehen und eine nehmen By elementLocator als Parameter, wodurch Probleme beseitigt werden, wenn Sie das Element mit etwas anderem als einer ID finden möchten.

  • Ja, das ist der richtige Weg. Verstehe nicht, warum Leute auf diese Weise ignorieren und übereinstimmende Elemente zählen, um zu sehen, ob das Ergebnis 0 ist.

    – Ralf Lavalle

    14. August 2014 um 5:54 Uhr

  • Nun, ich muss sagen, dass die Verwendung von Ausnahmen zur Regulierung des Programmflusses nicht der beste Weg ist.

    – Denis

    14. August 2014 um 11:13 Uhr


  • Häh? Es war dein Vorschlag! Dies ist ein guter Weg, wenn Ihr Test erwartet, dass das Element nicht gefunden wird. Wie Sie zeigen, geben Sie einfach null zurück und assert.isnull oder isnotnull, was eine sinnvolle Methode ist, um zu testen, ob ein Ding existiert.

    – Ralf Lavalle

    14. August 2014 um 22:56 Uhr

  • Falls ich die Frage falsch interpretiert habe: “Gibt es eine Möglichkeit zu testen, ob ein Element vorhanden ist?” falsch, ich würde gerne erfahren, warum Sie anderer Meinung sind, ob dies eine legitime Antwort ist oder nicht.

    – Denis

    12. Januar 2015 um 20:32 Uhr

  • Vielleicht möchten Sie die Wartezeit verkürzen. Wenn das Element nicht vorhanden ist, müssen Sie jetzt “30 Sekunden” warten, bevor die Funktion “false” zurückgibt

    – Jason Smiley

    5. Oktober 2015 um 19:06 Uhr

Benutzeravatar von Tango Ben
Tango Ben

Ich habe festgestellt, dass dies für Java funktioniert:

WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);

  • presenceOfElementLocated löst eine Ausnahme aus, wenn das Element bei einem bestimmten Versuch nicht gefunden wird. Um dies zu vermeiden, fügen Sie a hinzu wait.ignoring(NoSuchElementException.class); Anweisung zwischen der ersten und zweiten Zeile.

    – Steve Kammern

    22. Januar 2014 um 14:03 Uhr

public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds)
{
    WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
    wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds
    return driver.findElement(by);
}

Versuchen Sie Folgendes: Rufen Sie diese Methode auf und übergeben Sie 3 Argumente:

  1. WebDriver-Variable. // Annehmen von driver_variable als Treiber.
  2. Das Element, das Sie überprüfen werden. Sollte von der By-Methode bereitgestellt werden. // Bsp.: By.id(“id”)
  3. Zeitlimit in Sekunden.

Beispiel: waitForElementPresent(driver, By.id(“id”), 10 );

public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) {

        WebElement element; 

        try{
            driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() 

            WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
            element = wait.until(ExpectedConditions.presenceOfElementLocated(by));

            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait
            return element; //return the element
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return null; 
    }

Benutzeravatar von Peter Mortensen
Peter Mortensen

Ich hatte das gleiche Problem. Für mich werden je nach Berechtigungsstufe eines Benutzers einige Links, Schaltflächen und andere Elemente nicht auf der Seite angezeigt. Ein Teil meiner Suite war das Testen der Elemente, die sollte fehlen, fehlen. Ich habe Stunden damit verbracht, das herauszufinden. Endlich habe ich die perfekte Lösung gefunden.

Es weist den Browser an, nach allen angegebenen Elementen zu suchen. Wenn es dazu kommt 0, das heißt, es wurden keine Elemente basierend auf der Spezifikation gefunden. Dann lasse ich den Code eine *if-Anweisung ausführen, um mich wissen zu lassen, dass er nicht gefunden wurde.

Das ist in C#also müssten Übersetzungen gemacht werden Java. Aber es sollte nicht zu schwer sein.

public void verifyPermission(string link)
{
    IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link));
    if (adminPermissions.Count == 0)
    {
        Console.WriteLine("User's permission properly hidden");
    }
}

Es gibt auch einen anderen Weg, den Sie einschlagen können, je nachdem, was Sie für Ihren Test benötigen.

Das folgende Snippet prüft, ob ein ganz bestimmtes Element auf der Seite vorhanden ist. Abhängig von der Existenz des Elements lasse ich den Test an if else ausführen.

Wenn das Element existiert und auf der Seite angezeigt wird, habe ich console.write lass es mich wissen und mach weiter. Wenn das fragliche Element vorhanden ist, kann ich den benötigten Test nicht ausführen, was der Hauptgrund dafür ist, dass dies eingerichtet werden muss.

Wenn das Element nicht vorhanden ist und nicht auf der Seite angezeigt wird, habe ich das else im if else test ausführen lassen.

IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE"));
// If the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute what’s in the else statement
if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){
    // Script to execute if element is found
} else {
    // Test script goes here.
}

Ich weiß, dass ich mit der Antwort auf die OP etwas spät bin. Hoffentlich hilft das jemandem!

Benutzeravatar von Amstel Bytes
Amstel-Bytes

Das funktioniert bei mir:

 if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
    //THEN CLICK ON THE SUBMIT BUTTON
}else{
    //DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}

  • Hier gibt es das gleiche Problem: Was wäre, wenn das Element “//*[@id=’submit’]” existiert nicht? Dann wird eine Ausnahme ausgelöst, daher wird die if-Bedingung niemals ausgewertet

    – Bryan_C

    14. August 2017 um 18:54 Uhr

1433600cookie-checkTesten Sie mit Selenium WebDriver, ob ein Element vorhanden ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy