Testen Sie mit Selenium WebDriver, ob ein Element vorhanden ist
Lesezeit: 8 Minuten
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
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
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
Dennis
Verwenden Sie eine private Methode, die einfach nach dem Element sucht und bestimmt, ob es vorhanden ist, wie folgt:
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
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:
WebDriver-Variable. // Annehmen von driver_variable als Treiber.
Das Element, das Sie überprüfen werden. Sollte von der By-Methode bereitgestellt werden. // Bsp.: By.id(“id”)
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;
}
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!
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
14336000cookie-checkTesten Sie mit Selenium WebDriver, ob ein Element vorhanden istyes
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