Maison  >  Questions et réponses  >  le corps du texte

Façons d'éviter les erreurs "StaleElementReferenceException" dans Selenium

<p>J'implémente de nombreux tests Selenium en Java - parfois, mes tests échouent à cause de <code>StaleElementReferenceException</code>. </p> <p>Pouvez-vous suggérer des moyens de rendre les tests plus stables ? </p>
P粉920835423P粉920835423425 Il y a quelques jours587

répondre à tous(2)je répondrai

  • P粉899950720

    P粉8999507202023-08-22 15:30:51

    J'ai eu ce problème une fois, mais à mon insu, BackboneJS fonctionnait sur la page et remplaçait l'élément sur lequel j'essayais de cliquer. Mon code est le suivant.

    driver.findElement(By.id("checkoutLink")).click();

    C'est bien sûr fonctionnellement le même que le code ci-dessous.

    WebElement checkoutLink = driver.findElement(By.id("checkoutLink"));
    checkoutLink.click();

    De temps en temps, il arrive que javascript remplace l'élément checkoutLink entre la recherche et le clic, c'est-à-dire.

    WebElement checkoutLink = driver.findElement(By.id("checkoutLink"));
    // javascript替换了checkoutLink
    checkoutLink.click();

    Cela entraîne une StaleElementReferenceException lorsque vous essayez de cliquer sur le lien. Je n'ai trouvé aucun moyen fiable de dire à WebDriver d'attendre la fin de l'exécution du javascript, c'est donc ainsi que j'ai fini par le résoudre.

    new WebDriverWait(driver, timeout)
        .ignoring(StaleElementReferenceException.class)
        .until(new Predicate<WebDriver>() {
            @Override
            public boolean apply(@Nullable WebDriver driver) {
                driver.findElement(By.id("checkoutLink")).click();
                return true;
            }
        });

    Ce code continuera à essayer de cliquer sur le lien, en ignorant l'exception StaleElementReferenceException, jusqu'à ce que le clic réussisse ou que le délai d'attente soit atteint. J'aime cette solution car elle élimine les tracas liés à l'écriture d'une logique de nouvelle tentative et utilise uniquement les constructions intégrées de WebDriver.

    répondre
    0
  • P粉343141633

    P粉3431416332023-08-22 13:04:24

    Cela se produit si les manipulations DOM ayant lieu sur la page rendent temporairement l'élément inaccessible. Pour faire face à ces situations, vous pouvez essayer d'accéder à l'élément plusieurs fois dans une boucle jusqu'à ce qu'une exception soit finalement levée.

    Essayez d'utiliser cette excellente solution de darrelgrainger.blogspot.com :

    public boolean retryingFindClick(By by) {
        boolean result = false;
        int attempts = 0;
        while(attempts < 2) {
            try {
                driver.findElement(by).click();
                result = true;
                break;
            } catch(StaleElementException e) {
            }
            attempts++;
        }
        return result;
    }

    répondre
    0
  • Annulerrépondre