web-dev-qa-db-de.com

Selenium Webdriver mit Java: Element nicht im Cache gefunden - vielleicht hat sich die Seite geändert, seit sie nachgeschlagen wurde

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 ...

15
J. K.

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 finding 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. 

31
Mark Rowlands

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();
0
Aleksey Bykov