Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在缓存中找不到Selenium Webdriver with Java:Element-可能该页面在查找后已更改_Java_Selenium_Webdriver - Fatal编程技术网

在缓存中找不到Selenium Webdriver with Java:Element-可能该页面在查找后已更改

在缓存中找不到Selenium Webdriver with Java:Element-可能该页面在查找后已更改,java,selenium,webdriver,Java,Selenium,Webdriver,我在课程开始时初始化了一个变量: public WebElement logout; 稍后在代码中,在某种方法中,当我第一次遇到注销按钮时,我为该变量赋值(在if/else语句的括号中): 然后,我在测试的另一个阶段再次成功地使用“注销”: logout.click(); 在测试结束时,在元素相同的地方(By.linkText(“Logout”)),我得到以下错误: Element not found in the cache - perhaps the page has changed s

我在课程开始时初始化了一个变量:

public WebElement logout;
稍后在代码中,在某种方法中,当我第一次遇到注销按钮时,我为该变量赋值(在if/else语句的括号中):

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

logout.click();
在测试结束时,在元素相同的地方(By.linkText(“Logout”)),我得到以下错误:

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


编辑:实际上,我没有成功使用注销。单击();康曼特在我测试的另一个阶段。看来我不能再用了。我必须创建一个logout1 webelement并使用它…

如果在您最初找到
元素后对页面进行了任何更改,
webdriver
引用现在将包含一个
过时的
引用。由于页面已更改,
元素
将不再是
webdriver
所期望的位置

要解决您的问题,请尝试在每次需要使用元素时
查找
,编写一个可以随时调用的小方法

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");

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

这是因为您没有给适当的时间来加载页面。因此您必须给
Thread.sleep()给定页面的代码。

在使用
Thread.sleep()之后,我的项目也遇到了同样的问题对我来说,它工作正常。在30到50秒的时间内,尽可能多地为网页添加内容。

浏览器会重建动态页面的DOM结构,因此不需要保留元素,您在使用之前必须找到它们

例如,使用XPath。此方法不正确(将来可能导致异常
org.openqa.selenium.StaleElementReferenceException
):


在你的参考资料有效和不再有效之间,页面是否有任何变化?没有,据我所知没有变化。没有人在部署任何东西,我在使用一些ajax的东西,但是链接文本保持不变,链接仍然在页脚中。如果执行了ajax,则页面可能已更改-因此,随着DOM的更改,对元素的WebDriver引用现在将“过时”。如果在元素通常会中断的阶段尝试单击它之前再次尝试
查找该元素,会发生什么情况?一个想法,为什么不创建一个
logout
方法,在每次需要时查找并单击元素?哦,我明白了-它第一次查找链接文本,并以其他方式记录结果,与DOM相关,因此第二次调用变量时不会查找链接文本,而是查找DOM引用?试过你的方法,成功了!如果你用那篇文章回答我的问题,我会接受的。真的很有帮助!欢迎光临,希望对您有所帮助。:)如果页面上运行的javascript操作DOM(例如,动态弹出),由于竞争条件,仍然会引发此异常。我尝试了此代码,但收到一个错误,提示“Canot resolved the symbol‘wait’”。我应该导入什么?您可以尝试使用此选项:
WebDriverWait wait=new WebDriverWait(driver,10);查看问题实际上是在将元素分配给变量后页面发生了更改。因此,@nabsATX的陈旧引用为+1。更具体地说,在集成测试或验收测试中,当我看到sleep()时,总是会有一种气味(不管是什么语言):它会减慢测试速度,而且除了在实时系统中,它永远不会保证您等待的线程/进程会被优先排序。相反,问问你在等什么活动。Cf在测试指导下成长的面向对象软件chpt 27:测试异步代码。
clickAnElementByLinkText("Logout");
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();