我使用selenium 3.9.1和java来自动测试Web应用程序。例如,基于按下按钮,Web应用程序具有一些动态内容。单击此按钮时页面将刷新。一个java脚本在按钮点击时运行并更新我认为的DOM。这时,当我尝试访问按钮(在页面上可见)时,我得到一个staleElementReferenceException。
一旦更改了,Selenium会自动重新加载吗?我对硒相对较新。我已经研究过这个,我尝试使用driver.navigate()。Refresh()来刷新页面,试图看看这是否能解决问题。它没有解决问题。
任何指针都将深表感谢。
答案 0 :(得分:1)
由于页面已刷新,因此您拥有的按钮引用是旧页面上不再存在的按钮。
我想说你需要在刷新的页面上获得对该按钮的新引用(例如,调用FindElementById)。
答案 1 :(得分:1)
如果刷新页面,DOM中的所有项目现在都是陈旧的。这意味着必须再次找到按钮按下之前找到的所有项目。任何使用这些项目的尝试都很可能会被陈旧的元素异常处理。
但是,如果按钮单击mearilly会影响页面上的项目,而不必要求网络服务器为您提供新页面,您可以与旧项目进行交互。
答案 2 :(得分:1)
你可以这样做:
public void SaveAndAgainClick() throws Exception{
try{
clicksaveButton(); //method to click save button
WebElement someValue = driver.findElement(By.xpath("(//input[@name='someValue'])[1]"));
someValue.click();
}catch (StaleElementException e){
WebElement someValue = driver.findElement(By.xpath("(//input[@name='someValue'])[1]");
someValue.click();
}
}
如果findElement在查找(//input[@name='someValue'])[1]
时获取staleElementError,那么它将在catch块中再次尝试一次,并且肯定会找到该元素并点击它。如果您遵循这种方法,您的测试将通过。
答案 3 :(得分:0)
以下是您的问题的答案:
请考虑以下 HTML :
<input value="Click me" onclick="alert('Click!')" type="button">
在给定的 HTML 中,根据此元素的onclick
属性,如果您在 WebElement 上调用click()
方法,将生成警报。同样,onclick
属性可以调用 JavaScript 或 Ajax ,这可能会导入/逐步淘汰HTML DOM中的新/旧元素
driver.navigate().refresh()
不是最佳解决方案,因为它可能不能正确调用预期的 JavaScript 或 Ajax 。因此,预期的 WebElement 可能无法以最佳方式进行交互。