web-dev-qa-db-fra.com

Selenium Webdriver avec Java: élément non trouvé dans le cache - la page a peut-être changé depuis la recherche

J'initialise une variable au début de ma classe:

public WebElement logout;

Plus tard dans le code, d’une certaine manière, la première fois que je rencontre le bouton de déconnexion, j’assigne une valeur à cette variable (entre crochets d’une instruction if/else):

logout = driver.findElement(By.linkText("Logout"));
logout.click();

J'utilise ensuite "déconnexion" une fois de plus, avec succès, à une autre étape de mon test:

logout.click();

Et à la fin du test, à un endroit où l’élément est identique (By.linkText ("Logout")), j’obtiens cette erreur:

Element not found in the cache - perhaps the page has changed since it was looked up

Pourquoi?

EDIT: En fait, je n’utilise pas correctement le logout.click (); commant à une autre étape de mon test. On dirait que je ne peux plus l'utiliser. Je dois créer un webelement logout1 et l'utiliser ...

15
J. K.

Si la page a été modifiée après que vous ayez trouvé la variable element, la référence webdriver contiendra désormais une référence stale. Comme la page a changé, la element ne sera plus où webdriver s'attend à ce qu'elle soit.

Pour résoudre votre problème, essayez finding l’élément chaque fois que vous devez l’utiliser - écrire une petite méthode que vous pouvez appeler au fur et à mesure est une bonne idée.

import org.openqa.Selenium.support.ui.WebDriverWait

public void clickAnElementByLinkText(String linkText) {
    wait.until(ExpectedConditions.presenceOfElementLocated(By.linkText(linkText)));
    driver.findElement(By.linkText(linkText)).click();
}

Ensuite, dans votre code, il vous suffira de:

clickAnElementByLinkText("Logout");

Ainsi, chaque fois qu’il trouvera l’élément et cliquera dessus, même si la page change alors qu’elle «rafraîchit» la référence à cet élément, il clique avec succès. 

31
Mark Rowlands

Le navigateur reconstruit la structure DOM des pages dynamiques, afin que les éléments n'aient pas besoin de rester, vous devez les trouver avant de les utiliser.

Utilisation de XPath, par exemple. Cette approche n'est pas correcte (peut provoquer une exception org.openqa.Selenium.StaleElementReferenceException dans le futur):

WebElement element = driver.findElement(By.xpath("//ul[@class=\"pagination\"]/li[3]/a"));
...// Some Ajax interaction here
element.click(); //<-- Element might not be exists

Cette approche est correcte:

driver.findElement(By.xpath("//ul[@class=\"pagination\"]/li[3]/a")).click();
0
Aleksey Bykov