我在课程开头初始化变量:
public WebElement logout;
稍后在代码中,在某些方法中,第一次遇到注销按钮时,我为该变量赋值(在if / else语句的括号中):
logout = driver.findElement(By.linkText("Logout"));
logout.click();
然后我在测试的另一个阶段成功再次使用“logout”:
logout.click();
在测试结束时,在元素相同的地方(By.linkText(“Logout”)),我收到此错误:
Element not found in the cache - perhaps the page has changed since it was looked up
为什么?
编辑:实际上,我没有成功使用logout.click();在我测试的另一个阶段。看起来我不能再使用它了。我必须创建一个logout1 webelement并使用它...
答案 0 :(得分:31)
如果您最初找到element
之后页面有任何更改,则webdriver
引用现在将包含stale
引用。由于页面已更改,element
将不再是webdriver
预期的位置。
要解决您的问题,请在每次需要使用时尝试find
元素 - 编写一个可以调用的小方法,以及何时是一个好主意。
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();
}
然后在您的代码中,您只需要:
clickAnElementByLinkText("Logout");
因此,每次它都会找到该元素并点击它,即使页面发生了变化,它也会“刷新”。它对所有元素的引用都成功点击了它。
答案 1 :(得分:0)
浏览器会重建动态页面的DOM结构,因此这些元素不需要在使用之前必须找到它们。
例如,使用XPath。这种方法不正确(将来会导致异常org.openqa.selenium.StaleElementReferenceException
):
WebElement element = driver.findElement(By.xpath("//ul[@class=\"pagination\"]/li[3]/a"));
...// Some Ajax interaction here
element.click(); //<-- Element might not be exists
这种方法是正确的:
driver.findElement(By.xpath("//ul[@class=\"pagination\"]/li[3]/a")).click();
答案 2 :(得分:-7)
这是因为您没有给出适当的时间来加载页面。因此您必须为给定页面提供Thread.sleep();
代码。
我也为我的项目遇到同样的问题,但在使用Thread.sleep();
之后,我的工作正常,尽可能多地给网页提供30到50秒。