Ich arbeite ab und zu mit Automatisierung und habe ein Problem. Im Allgemeinen enthält mein Code eine Logik, in der ich prüfen muss, ob ein Element vorhanden ist. Der nächste Schritt hängt vom Ergebnis der Überprüfung ab. Basisinstrumente von Selenium geben jedoch nur boolean true zurück, andernfalls NoSuchElementException. Aber ich brauche "falsch".

Wie in meinem vorherigen Projekt verwende ich jetzt einen einfachen Wrapper, um dieses Problem zu lösen:

private boolean isDisplayedOnPage(WebElementFacade wef){
    try{
        return wef.isDisplayed();
    } catch (NoSuchElementException nsee){
        return false;
    }
}

Es funktioniert perfekt, aber die Verwendung der Ausnahme verwirrt mich. Außerdem habe ich über "Warten" gelesen, aber es wird auch nicht "Falsch" zurückgegeben. Ich kann nur die Ausnahme ignorieren. Gibt es eingebaute Instrumente zur Lösung dieses Problems in Selen? Oder kann jemand einen eleganteren Weg anbieten, um es zu lösen?

1
Bogdan Pisarenko 19 Jän. 2019 im 17:50

3 Antworten

Beste Antwort

Einer der Grundpfeiler der unformatierten WebDriver-API ist die Erwartung, dass der Benutzer den Status des DOM für die zu automatisierende Seite kennt. Dies bedeutet, dass in der Logik der API das Aufrufen von findElement mithilfe eines Locators eines Elements, das nicht vorhanden ist, eine Ausnahmebedingung darstellt, wodurch das Auslösen einer Ausnahme absolut legitim ist. Man könnte zwar argumentieren, dass die in das API-Verhalten eingebaute Erwartung fehlerhaft ist, aber das geht über den Rahmen dieser Antwort hinaus. Wenn Sie eine boolesche Logik benötigen, um festzustellen, ob ein Element vorhanden ist, benötigen Sie eine Wrapper-Methode, wie Sie bereits festgestellt haben. Innerhalb dieser Wrapper-Methode haben Sie zwei Möglichkeiten:

  1. Verwenden Sie findElement und fangen Sie die NoSuchElementException. Beachten Sie, dass die Verwendung von WebDriverWait diese Ausnahme implizit für Sie abfängt, also ein semantisches Äquivalent.

  2. Verwenden Sie findElements (beachten Sie das "s"), das eine leere Liste zurückgibt, ohne eine Ausnahme auszulösen, wenn das Element nicht vorhanden ist.

3
JimEvans 19 Jän. 2019 im 16:34
Boolean bool = my_driver.findElements(By.id("my element id")).size()>0;

Das wird dir helfen.

3
Baran SAHİN 19 Jän. 2019 im 18:28

Eine unreine Problemumgehung könnte darin bestehen, das DOM auf eine eindeutige Zeichenfolge zu überprüfen, die Ihr WebElement symbolisiert, und dann in einen Booleschen Wert zu schreiben, wenn er gefunden werden kann.

Diese Schleife überprüft 60 Mal jede Sekunde das DOM auf die Zeichenfolge und aktualisiert die Seite, wenn nichts gefunden wurde:

for (int i= 0; i <60; i++){
  String pageSource = browser.getPageSource().toString();
  boolean elementThere = pageSource.contains("uniqueStringOfElement");
if (elementThere){
  browser.WebElement.click()
  break;
 } 
else {
  Thread.sleep(1000); 
  browser.navigate().refresh();
 }
}
0
slowlert 6 März 2020 im 15:09