it-swarm.com.de

Entspricht waitForVisible / waitForElementPresent in Selenium WebDriver-Tests mit Java?

Mit "HTML" Selenium-Tests (erstellt mit Selenium IDE oder manuell)) können Sie einige sehr nützliche Befehle wie WaitForElementPresent oder WaitForVisible.

<tr>
    <td>waitForElementPresent</td>
    <td>id=saveButton</td>
    <td></td>
</tr>

Beim Codieren von Selenium-Tests in Java (Webdriver/Selenium RC - ich bin mir der Terminologie hier nicht sicher), ist etwas Ähnliches eingebaut ?

Zum Beispiel, um zu überprüfen, ob ein Dialogfeld (das sich erst nach einiger Zeit öffnet) angezeigt wird ...

WebElement dialog = driver.findElement(By.id("reportDialog"));
assertTrue(dialog.isDisplayed());  // often fails as it isn't visible *yet*

Was ist der sauberste robuste Weg, um eine solche Prüfung zu codieren?

Hinzufügen von Thread.sleep() -Aufrufen überall wäre hässlich und zerbrechlich, und das Rollen Ihrer eigenen while-Schleifen scheint auch ziemlich umständlich zu sein ...

53
Jonik

implizite und explizite Wartezeiten

Implizites Warten

Eine implizite Wartezeit besteht darin, WebDriver anzuweisen, das DOM für einen bestimmten Zeitraum abzufragen, wenn versucht wird, ein oder mehrere Elemente zu finden, wenn diese nicht sofort verfügbar sind. Die Standardeinstellung ist 0. Nach dem Festlegen wird die implizite Wartezeit auf die Lebensdauer der WebDriver-Objektinstanz festgelegt.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Explizites Warten + erwartete Bedingungen

Eine explizite Wartezeit ist der Code, den Sie definieren, um auf das Auftreten einer bestimmten Bedingung zu warten, bevor Sie mit dem Code fortfahren. Der schlimmste Fall ist Thread.sleep (), wodurch die Bedingung auf eine genaue Wartezeit festgelegt wird. Es gibt einige praktische Methoden, mit denen Sie Code schreiben können, der nur so lange wartet, wie erforderlich. WebDriverWait in Kombination mit ExpectedCondition ist eine Möglichkeit, dies zu erreichen.

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.id("someid")));
95
Petr Janeček
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

Dies wartet bis zu 10 Sekunden, bevor eine TimeoutException ausgelöst wird, oder wenn das Element gefunden wird, wird es in 0 - 10 Sekunden zurückgegeben. WebDriverWait ruft die ExpectedCondition standardmäßig alle 500 Millisekunden auf, bis sie erfolgreich zurückgegeben wird. Eine erfolgreiche Rückgabe ist für ExpectedCondition. Typ ist Boolean. Rückgabe wahr oder nicht null. Rückgabewert für alle anderen ExpectedCondition-Typen.


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

Element ist anklickbar - es wird angezeigt und aktiviert.

From WebDriver-Dokumentation: Explizite und implizite Wartezeiten

8
user1710861

Nun, die Sache ist, dass Sie wahrscheinlich nicht wollen, dass der Test auf unbestimmte Zeit läuft. Sie möchten einfach länger warten, bis die Bibliothek feststellt, dass das Element nicht vorhanden ist. In diesem Fall besteht die eleganteste Lösung darin, implizites Warten zu verwenden, das genau dafür ausgelegt ist:

driver.manage().timeouts().implicitlyWait( ... )
0
Mike Kwan

Eine andere Möglichkeit, auf einen bestimmten Höchstwert zu warten, besteht darin, 10 Sekunden zu warten, bis das Element wie folgt angezeigt wird:

(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver d) {
                return d.findElement(By.id("<name>")).isDisplayed();

            }
        });
0
Veeksha A V