Wie lässt man Selen warten, bis ein Element vorhanden ist?

Lesezeit: 3 Minuten

Benutzeravatar von Steve Chambers
Steve Kammern

Ich versuche, Selen dazu zu bringen, auf ein Element zu warten, das nach dem Laden der Seite dynamisch zum DOM hinzugefügt wird. Ich habe das versucht:

fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));

Falls es hilft, hier ist es fluentWait:

FluentWait fluentWait = new FluentWait<>(webDriver) {
    .withTimeout(30, TimeUnit.SECONDS)
    .pollingEvery(200, TimeUnit.MILLISECONDS);
}

Aber es wirft ein NoSuchElementException. Es sieht aus wie presenceOfElement erwartet, dass das Element vorhanden ist, also ist dies fehlerhaft. Dies muss Brot und Butter für Selen sein, und ich möchte das Rad nicht neu erfinden … Gibt es eine Alternative, idealerweise ohne mein eigenes zu rollen? Predicate?

Benutzeravatar von Petr Mensik
Peter Mensik

Sie müssen anrufen ignoring mit einer Ausnahme zu ignorieren, während die WebDriver Ich werde warten.

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(200, TimeUnit.MILLISECONDS)
        .ignoring(NoSuchElementException.class);

Siehe die Dokumentation von FließendWarte für mehr Informationen. Beachten Sie jedoch, dass diese Bedingung bereits implementiert ist Erwartete Bedingungenalso solltest du verwenden:

WebElement element = (new WebDriverWait(driver, 10))
   .until(ExpectedConditions.elementToBeClickable(By.id("someid")));

*Weniger Versionen von Selenium:

withTimeout(long, TimeUnit) has become withTimeout(Duration)
pollingEvery(long, TimeUnit) has become pollingEvery(Duration)

Der Code sieht also so aus:

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(Duration.ofSeconds(30)
        .pollingEvery(Duration.ofMillis(200)
        .ignoring(NoSuchElementException.class);

Eine grundlegende Anleitung zum Warten finden Sie hier hier.

  • entweder sollte es sein oder es sollte <> sein, wenn Sie Java 8 verwenden würde Ihnen einen Kompilierungsfehler geben.

    – Schek

    5. Mai 2017 um 3:44 Uhr

  • Es ist NICHT in ExpectedCondition implementiert … es ist in WebDriverWait. public WebDriverWait (WebDriver-Treiber, Uhr, Schläfer, langes timeOutInSeconds, langes sleepTimeOut) { super (Treiber, Uhr, Schläfer); this.withTimeout (timeOutInSeconds, TimeUnit.SECONDS); this.pollingEvery(sleepTimeOut, TimeUnit.MILLISECONDS); this.ignoring (NotFoundException.class); this.driver = Fahrer; }

    – Sugat Mankar

    17. Juni 2017 um 3:57 Uhr


Benutzeravatar von bhupendra
bhupendra

Verwenden:

WebDriverWait wait = new WebDriverWait(driver, 5)
wait.until(ExpectedConditions.visibilityOf(element));

Sie können dies verwenden, da einige Zeit vor dem Laden der gesamten Seite der Code ausgeführt wird und einen Fehler auslöst. Die Zeit wird in Sekunden angegeben.

Lassen Sie mich Ihnen die Verwendung empfehlen Selenid Bibliothek. Es ermöglicht das Schreiben von viel prägnanteren und lesbareren Tests. Es kann auf das Vorhandensein von Elementen mit viel kürzerer Syntax warten:

$("#elementId").shouldBe(visible);

Hier ist ein Beispielprojekt zum Testen der Google-Suche:
https://github.com/selenide-examples/google

  • Keine Chance, dass dies auf Python portiert wird?

    – franklin

    13. Februar 2016 um 18:00 Uhr

  • Es ist nach Python portiert. Siehe „Selene“-Python-Bibliothek.

    – Andrei Solntsev

    21. Februar 2017 um 21:42 Uhr

FluentWait löst im Falle der Verwirrung eine NoSuchElementException aus

org.openqa.selenium.NoSuchElementException;     

mit

java.util.NoSuchElementException

in

.ignoring(NoSuchElementException.class)

Benutzeravatar von Ashwini
Ashwini

public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {

    FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
        .pollingEvery(pollingSec, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class);

    for (int i = 0; i < 2; i++) {
        try {
            //fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title="We are processing through trillions of data events, this insight may take more than 15 minutes to complete."]")));
        fWait.until(ExpectedConditions.visibilityOf(element));
        fWait.until(ExpectedConditions.elementToBeClickable(element));
        } catch (Exception e) {

        System.out.println("Element Not found trying again - " + element.toString().substring(70));
        e.printStackTrace();

        }
    }

    return element;

    }

1436370cookie-checkWie lässt man Selen warten, bis ein Element vorhanden ist?

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

Privacy policy