点击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();
答案 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更改了)