在缓存中找不到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();