wake-up-neo.net

Wie kann man warten, bis ein Element in Selenium vorhanden ist?

Ich versuche, Selenium auf ein Element warten zu lassen, das nach dem Laden der Seite dynamisch zum DOM hinzugefügt wird. Versuchte das:

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

Falls es hilft, hier ist fluentWait:

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

Aber es wirft ein NoSuchElementException - Sieht so aus, als würde presenceOfElement erwarten, dass das Element da ist, also ist dieses fehlerhaft. Dies muss Brot und Butter für Selen sein und möchte das Rad nicht neu erfinden ... könnte jemand eine Alternative vorschlagen, im Idealfall ohne mein eigenes Predicate zu rollen?

42
Steve Chambers

Sie müssen ignoring mit einer Ausnahme aufrufen, um sie zu ignorieren, während die WebDriver wartet. 

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

Weitere Informationen finden Sie in der Dokumentation zu FluentWait . Beachten Sie jedoch, dass diese Bedingung bereits in ExpectedConditions implementiert ist. Sie sollten sie also verwenden

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

Grundlegendes Tutorial zum Warten finden Sie hier .

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

sie können dies verwenden, bevor der gesamte Seitencode geladen wird und Würfe und Fehler ausgegeben werden. Zeit ist in Sekunden 

4
bhupendra

Lassen Sie mich Ihnen die Verwendung von Selenide library empfehlen. Ermöglicht das Schreiben viel genauer und lesbarer Tests. Es kann auf das Vorhandensein von Elementen mit viel kürzerer Syntax warten:

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

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

1
Andrei Solntsev

FluentWait wirft eine NoSuchElementException im Falle der Verwirrung

org.openqa.Selenium.NoSuchElementException;     

mit

Java.util.NoSuchElementException

im 

.ignoring(NoSuchElementException.class)
0
palandlom
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;

    }
0
Ashwini