元素未附加到页面文档

时间:2015-09-25 12:12:43

标签: java selenium

点击javascript组件时我得到:

  

org.openqa.selenium.StaleElementReferenceException:陈旧元素   reference:元素未附加到页面文档

解决这个问题的一种方法是在一段短时间内停止脚本: 了Thread.sleep(200);

我的隐式等待设置为10秒,我认为旧的硒没有这样的问题

但是还有其他方法可以在全球范围内完成吗?

driver.findElement(By.cssSelector("button.btn.btn-default")).click();
driver.findElement(By.xpath("//div[@id='content']/div/form")).click();
driver.findElement(By.linkText("Order")).click();

但是在这个中间我必须让睡眠成功:

    driver.findElement(By.cssSelector("button.btn.btn-default")).click(); 
Thread.sleep(200);
        driver.findElement(By.xpath("//div[@id='content']/div/form")).click(); 
Thread.sleep(200);
        driver.findElement(By.linkText("Order")).click();

4 个答案:

答案 0 :(得分:3)

您的问题表明您需要更好地构建测试用例和/或不了解您自动化网站的工作原理。尤其

  

使用以下命令停止脚本一段时间:Thread.sleep(200);

被认为是一种非常糟糕的做法。无论你做什么都不混合隐式和显式等待,事情就会开始出错,明确的等待是recommended solution

如果(因为它似乎是你的情况)正在通过AJAX操作修改页面,等待加载页面将不起作用。而不是等待页面加载,等待您测试的条件变为真。这样,您可以给AJAX操作执行时间,如果出现问题,超时时会出现错误。

StaleElementReferenceException是由刷新的DOM引起的 找到元素后。请记住,WebElement是一个引用 到页面上的特定元素,如果DOM得到刷新 引用已被破坏,您需要再次找到该元素才能够 与之互动。

答案 1 :(得分:1)

为了避免这种情况,您应该再次找到该元素。获取元素后,其Java对象的引用可能会变得陈旧。做类似的事情: 再次WebElement element = WebDriver.findElement(By by)

编辑:对于您的示例,请尝试此

driver.findElement(By.cssSelector("button.btn.btn-default")).click(); 
//30s timeout, use timeout not sleep
WebDriverWait wait = new WebDriverWait(driver, 30); 
By xpath = By.xpath("//div[@id='content']/div/form")
//wait for element to be clickable, then click
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(xpath));
element.click(); 

答案 2 :(得分:1)

在我的示例中,将getWebDriver()替换为您的驱动器实例。

最佳做法是先断言&验证,那个特别 元素是否存在。如果你看到功能 assertAndVerifyElement()---它不断检查5的元素 秒然后相应断言。

Format source code

希望这对你有用。 :)

答案 3 :(得分:0)

当当前页面中不再存在该元素时,显示错误“元素未附加到页面文档”。发生这种情况是因为您为第1页获得了元素,并在第1页中使用了它(或者在获取元素后刷新了页面,HTML被AJAX更改了)