Maison > Questions et réponses > le corps du texte
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.
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; }