带有Java的Selenium Webdriver:在缓存中找不到元素 - 也许页面在查找后已经发生了变化

时间:2013-07-31 13:52:59

标签: java selenium webdriver

我在课程开头初始化变量:

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并使用它...

3 个答案:

答案 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秒。