Façons d'éviter les erreurs "StaleElementReferenceException" dans Selenium
P粉920835423
P粉920835423 2023-08-21 17:47:18
0
2
625
<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粉920835423
P粉920835423

répondre à tous(2)
P粉899950720

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.

P粉343141633

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;
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal