web-dev-qa-db-fra.com

Comment attendre qu'un élément soit présent dans le sélénium?

J'essaie de faire en sorte que Selenium attend un élément ajouté dynamiquement au DOM après le chargement de la page. J'ai essayé ceci:

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

Si cela peut aider, voici fluentWait:

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

Mais cela jette une NoSuchElementException - on dirait que presenceOfElement s'attend à ce que l'élément soit là, donc c'est défectueux. Cela doit être du pain au beurre pour Selenium et vous ne voulez pas réinventer la roue ... quelqu'un pourrait-il suggérer une alternative, idéalement sans lancer ma propre Predicate?

42
Steve Chambers

Vous devez appeler ignoring avec exception à ignorer pendant que WebDriver attendra. 

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

Voir la documentation de FluentWait pour plus d’informations. Mais sachez que cette condition est déjà implémentée dans ExpectedConditions vous devez donc utiliser

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

Vous trouverez le didacticiel d’attente de base ici .

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

vous pouvez l'utiliser comme un certain temps avant que le chargement du code de la page entière soit exécuté, ainsi que des erreurs. le temps est en seconde 

4
bhupendra

Laissez-moi vous recommander d’utiliser Selenide library. Il permet d’écrire des tests beaucoup plus concis et lisibles. Il peut attendre la présence d'éléments avec une syntaxe beaucoup plus courte:

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

Voici un exemple de projet pour tester la recherche Google: https://github.com/selenide-examples/google

1
Andrei Solntsev

FluentWait lève une exception NoSuchElementException en cas de confusion

org.openqa.Selenium.NoSuchElementException;     

avec

Java.util.NoSuchElementException

dans 

.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