Ich initialisiere eine Variable am Anfang meiner Klasse:
public WebElement logout;
Später im Code, bei einer bestimmten Methode, wenn ich zum ersten Mal auf die Schaltfläche zum Abmelden stoße, weise ich dieser Variablen einen Wert zu (in den Klammern einer if/else-Anweisung):
logout = driver.findElement(By.linkText("Logout"));
logout.click();
Ich benutze dann "logout" noch einmal erfolgreich in einer anderen Testphase:
logout.click();
Und am Ende des Tests, an einem Ort, an dem das Element gleich ist (By.linkText ("Logout")), erhalte ich diesen Fehler:
Element not found in the cache - perhaps the page has changed since it was looked up
Warum?
EDIT: Eigentlich benutze ich logout.click () nicht erfolgreich; in einer anderen Phase meines Tests. Sieht aus, als könnte ich es nicht mehr benutzen. Ich muss ein Logout1-Webelement erstellen und verwenden ...
Wenn die Seite geändert wurde, nachdem Sie die element
gefunden haben, enthält die webdriver
-Referenz jetzt eine stale
-Referenz. Da sich die Seite geändert hat, ist die element
nicht mehr dort, wo webdriver
erwartet wird.
Um Ihr Problem zu lösen, versuchen Sie es mit dem Element find
ing jedes Mal, wenn Sie es verwenden müssen. Schreiben Sie eine kleine Methode, die Sie aufrufen können, und wann ist eine gute Idee.
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();
}
Dann müssten Sie in Ihrem Code nur:
clickAnElementByLinkText("Logout");
Jedes Mal, wenn es das Element findet und darauf klickt, wird es als solches auch dann geändert, wenn sich die Seite ändert, da es den Verweis auf das Element "aktualisiert", auf das alle Elemente erfolgreich klicken.
Der Browser baut die DOM-Struktur der dynamischen Seiten neu auf, sodass die Elemente nicht vor der Verwendung gefunden werden müssen.
Zum Beispiel mit XPath. Dieser Ansatz ist nicht korrekt (kann in der Zukunft die Ausnahme org.openqa.Selenium.StaleElementReferenceException
verursachen):
WebElement element = driver.findElement(By.xpath("//ul[@class=\"pagination\"]/li[3]/a"));
...// Some Ajax interaction here
element.click(); //<-- Element might not be exists
Dieser Ansatz ist richtig:
driver.findElement(By.xpath("//ul[@class=\"pagination\"]/li[3]/a")).click();