Selenium和StaleElementReferenceException

时间:2018-03-20 22:54:56

标签: selenium

我使用selenium 3.9.1和java来自动测试Web应用程序。例如,基于按下按钮,Web应用程序具有一些动态内容。单击此按钮时页面将刷新。一个java脚本在按钮点击时运行并更新我认为的DOM。这时,当我尝试访问按钮(在页面上可见)时,我得到一个staleElementReferenceException。

一旦更改了,Selenium会自动重新加载吗?我对硒相对较新。我已经研究过这个,我尝试使用driver.navigate()。Refresh()来刷新页面,试图看看这是否能解决问题。它没有解决问题。

任何指针都将深表感谢。

4 个答案:

答案 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)

以下是您的问题的答案:

  • java脚本在点击按钮时运行并更新我认为的:如果您通过开发工具 /检查元素的 HTML 检查元素元素属性将显示所有内容。
  • 请考虑以下 HTML

    <input value="Click me" onclick="alert('Click!')" type="button">
    
  • 在给定的 HTML 中,根据此元素的onclick属性,如果您在 WebElement 上调用click()方法,将生成警报。同样,onclick属性可以调用 JavaScript Ajax ,这可能会导入/逐步淘汰HTML DOM中的新/旧元素

  • 此时,当我尝试访问该按钮时,我得到一个staleElementReferenceException :在这种情况下,您应该为 WebElement 引导WebDriverWait为<在尝试与元素交互之前,使用em> interactive 。否则,您可能会遇到以下例外
  • Selenium会在更改后自动重新加载DOM吗?简短回答,确实如此。
  • 使用driver.navigate()刷新页面。刷新()调用driver.navigate().refresh()不是最佳解决方案,因为它可能不能正确调用预期的 JavaScript Ajax 。因此,预期的 WebElement 可能无法以最佳方式进行交互。