繁体   English   中英

Selenium和StaleElementReferenceException

[英]Selenium and StaleElementReferenceException

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

Selenium更改后是否会自动重新加载DOM? 我对硒还比较陌生。 我对此进行了研究,并尝试使用driver.navigate()。Refresh()刷新页面,以查看这是否可以解决问题。 它不能解决问题。

任何指针将不胜感激。

由于页面已刷新,因此您所拥有的按钮参考就是不再存在的旧页面上的按钮。

我想说您需要在刷新页面上获得对该按钮的新引用(例如,调用FindElementById)。

如果刷新页面,则DOM中的所有项目现在都已过期。 这意味着必须再次找到在按下按钮之前找到的所有项目。 使用这些项目的任何尝试都更有可能被视为过期元素异常。

但是,如果单击按钮不影响页面上的项目,而不必要求Web服务器为您提供新页面,则可以与旧项目进行交互。

您可以执行以下操作:

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块中再尝试一次,最肯定的是找到该元素并单击它。 如果您遵循这种方法,您的测试将通过。

这是您的问题的答案:

  • 一个Java脚本会在单击按钮时运行并更新DOM,我认为 :如果通过Development Tools / Inspect Element检查元素HTML ,则元素属性将全部显示出来。
  • 考虑以下HTML

     <input value="Click me" onclick="alert('Click!')" type="button"> 
  • 在根据该元素的onclick属性的给定HTML中,如果在WebElement上调用click()方法,则会生成警报 同样, onclick属性可以调用JavaScriptAjax ,它们可以从HTML DOM中引入/淘汰新的/旧的元素。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM