Pouvez-vous créer une méthode générique ou réutilisable pour l'attente explicite en Java et Selenium?


VpnT:

Pouvons-nous créer une méthode générique ou réutilisable pour l'attente explicite en Java et Selenium?

utiliser les conditions attendues comme, visibilitéOfElementLocated, presenceOfElementLocated, elementToBeClickable

Toute aide est appréciée.

Merci

Julien:

Vous pouvez totalement. Je prends cela d'une autre réponse que j'ai écrite ici: Selenium java SafariDriver attend que la page se charge après le clic

public ExpectedCondition<Boolean> myCustomCondition(/* some arguments from the outside */) {
return new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            // Check something on the page and return either true or false,
            // this method will be run repeatedly until either the time
            // limit is exceeded, or true is returned
        }

        public String toString() {
            return "a description of what this is waiting for";
        }
    };
}

Emballer cela dans une fonction est la manière la plus courante de mon expérience. Mais le point à savoir ici est que vous souhaitez obtenir une instance de ExpectedConditionqui fournit une implémentation pour les méthodes apply () et toString ().

apply() ne doit retourner true que lorsque la condition est satisfaite.

Voici un exemple simple et réel:

public ExpectedCondition<Boolean> waitForElementToHaveText(final WebElement element, final String expectedText) {
    return new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver driver) {
            try {
                return element.getText().equals(expectedText);
            } catch (Exception e) {
                return false; // catchall fail case
            }
        }

        public String toString() {
            return "an element to have specific text";
        }
    };
}

Cela peut être utilisé comme:

WebDriverWait wait = new WebDriverWait(driver, maxSecondsToWait);
wait.until(waitForElementToHaveText(anElement, "my visible text"));

Éditer:

Quelques remarques supplémentaires, si vous remarquez que le type générique déclaré qui ExpectedConditionutilise est Boolean, cela signifie que vous voulez retourner vrai ou faux pour déterminer si la condition est remplie. Mais null fonctionne également comme une alternative à false. Donc, une autre façon de le faire est de déclarer que vous ExpectedConditionavez un type générique WebElementet de retourner null lorsque la condition n'est pas remplie.

public static ExpectedCondition<WebElement> waitForElementToContainText(final String cssSelector, final String visibleText) {
    return new ExpectedCondition<WebElement>() {
        @Override
        public WebElement apply(WebDriver webDriver) {
            WebElement anElement = webDriver.findElement(By.cssSelector(cssSelector);
            if (anElement.getText().contains(visibleText)) {
                return anElement; // Condition passed
            }
            return null; // Condition failed
        }

        public String toString() {
            return "first occurance of text '" + visibleText + "' in element " + cssSelector;
        }
    };
}

Bien sûr, l'un ou l'autre de ces exemples pourrait utiliser <Boolean>ou <WebElement>et voudrait simplement choisir une valeur de retour appropriée pour cela.

Articles connexes