当前位置: 首页 > 面试题库 >

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

辛健
2023-03-14
问题内容

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

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


问题答案:

如果您最初找到该页面后对页面进行了任何更改,则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");

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



 类似资料:
  • 我必须打开页面中的所有链接,然后检查是否有文本(“无信息”)。 我用了赛琳娜v3。5和硒v2。53个图书馆。然而,我有一个例外“StaleElementReferenceException”。 我的代码如下:

  • 我想从这个网站上提取红色标记的信息。 本站的html文本由以下图片呈现。我要提取的信息再次被红色标记。 问题是我找不到带有class属性“find-元素”的div元素。我的代码看起来像这样 如果有人能帮我,那就太好了。 谢谢。

  • 有人能告诉我为什么下面的代码不返回表情符号属性吗... 但是下面的代码将返回一个表情符号属性... 我知道我已经将滚动添加到第二个代码中,所以它会查看整个页面并返回我要查找的元素。但除此之外,它们或多或少是相同的。我可以每隔几秒钟运行第一个代码,它永远找不到表情符号元素。它会发现代码和optCriteria没有问题,并将它们作为tradeCriteria打印在一起,但即使它在那里,它也永远找不到表

  • 我对在Selenium中使用python还很陌生。

  • 我有一个基类,在其中我将webDriver定义为(使用Guice)。这定义了我的beforeclass以及下面的代码行 我有另一个类在beforesuite之后执行,它有一个method1,我在其中为给定函数编写了测试。看起来是这样的 我尝试在click语句上方添加以下行: log.info(webdriver.findelement(by.xpath(Element1)).getAttribut

  • 有我试图点击按钮代码。 我添加带有图片的Web元素代码。我怎么能用Java按下这个按钮。我这样试过; 线程睡眠(1000);driver.findElement(按类名(“_abm0”)).单击();OR 线程睡眠(1000);driver.findElement(按类名(“._abl-._abm2”)).单击();OR 线程睡眠(1000);driver.findElement(按类名(“_ab