一尘不染

带有Java的Selenium Webdriver:在缓存中找不到元素-自查找以来,页面可能已更改

selenium

我要在课堂开始时初始化一个变量:

public WebElement logout;

在代码的稍后部分,以某种方法,当我第一次遇到注销按钮时,我为该变量分配了一个值(在if / else语句的括号中):

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

然后,在测试的另一个阶段,我再次成功使用“注销”:

logout.click();

在测试结束时,在元素相同的地方(By.linkText(“注销”))​​,我收到此错误:

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

为什么?

编辑:实际上,我没有成功使用logout.click();。在测试的另一阶段要求。看来我不能再使用它了。我必须创建一个logout1
webelement并使用它…


阅读 284

收藏
2020-06-26

共1个答案

一尘不染

如果您最初找到该页面后对页面进行了任何更改,则elementwebdriver参考现在将包含一个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");

因此,每次页面都将找到该元素并单击它时,即使页面因“刷新”对该元素的引用而发生更改,也都会成功单击该元素。

2020-06-26