Java 如何使用Chrome浏览器处理“StaleElementReferenceException”

Java 如何使用Chrome浏览器处理“StaleElementReferenceException”,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我正在测试新构建的框架,在使用Chrome浏览器时经常遇到org.openqa.selenium.StaleElementReferenceException。框架设计会有问题吗? 在其他浏览器中运行测试时没有问题。我尝试了多种类型的自定义等待,捕获StaleElementReferenceException,然后循环查找元素,但没有成功 有没有人遇到过类似的问题并找到了解决方案 Chrome版本:38.0.2125.111 Selenium版本:2.43.1 这种错误是由于在检查元素的时间间隔

我正在测试新构建的框架,在使用Chrome浏览器时经常遇到org.openqa.selenium.StaleElementReferenceException。框架设计会有问题吗? 在其他浏览器中运行测试时没有问题。我尝试了多种类型的自定义等待,捕获StaleElementReferenceException,然后循环查找元素,但没有成功

有没有人遇到过类似的问题并找到了解决方案

Chrome版本:38.0.2125.111 Selenium版本:2.43.1


这种错误是由于在检查元素的时间间隔内网页发生更改而导致的

这个异常主要是由糟糕的测试造成的。有几件事需要检查:

确保在转到页面时,给页面加载时间 在你开始与它互动之前,即使你认为它有 已完成加载,它可能仍在等待中的某些内容 背景,当它到达时,页面会改变

确保如果您与任何更改页面的元素交互 确保再次等待页面更改和任何html请求 处理

这两件事可能是大多数问题的原因,我建议使用使用使用jqueryajax start和stop的ajax,以确保在修改页面之前加载页面。您需要记住的是,selenium比用户可能与页面交互的速度快得多,您需要通过增加检查来处理这一点

我还建议在尝试与某个元素交互之前,检查该元素是否在页面上以及该元素是否可见

在更糟糕的情况下,senario可以使用try-and-catch块来检查元素,但如果确保页面没有更改,则不应出现异常。由于浏览器速度和webdriver速度的不同,浏览器之间确实存在差异

我使用的一些代码是:

var finished = false;

function ready() {
  if (finished == true) {
    $( "#main" ).addClass("ready");
  }
}

$( document ).ajaxStart(function() {
  $( "#main" ).removeClass("ready");
  finished = false;
});

$( document ).ajaxStop(function() {
  finished = true;
  window.setTimeout(ready,500);
});'

这将检查页面是否已完全加载,并且没有挂起的请求,我只需在浏览器打开后执行此操作,然后我就可以检查该类是否存在,以及是否已准备就绪。每当页面发生变化时,我也会调用相同的检查。

这种错误是由于在检查元素的两次之间网页发生了变化造成的

这个异常主要是由糟糕的测试造成的。有几件事需要检查:

确保在转到页面时,给页面加载时间 在你开始与它互动之前,即使你认为它有 已完成加载,它可能仍在等待中的某些内容 背景,当它到达时,页面会改变

确保如果您与任何更改页面的元素交互 确保再次等待页面更改和任何html请求 处理

这两件事可能是大多数问题的原因,我建议使用使用使用jqueryajax start和stop的ajax,以确保在修改页面之前加载页面。您需要记住的是,selenium比用户可能与页面交互的速度快得多,您需要通过增加检查来处理这一点

我还建议在尝试与某个元素交互之前,检查该元素是否在页面上以及该元素是否可见

在更糟糕的情况下,senario可以使用try-and-catch块来检查元素,但如果确保页面没有更改,则不应出现异常。由于浏览器速度和webdriver速度的不同,浏览器之间确实存在差异

我使用的一些代码是:

var finished = false;

function ready() {
  if (finished == true) {
    $( "#main" ).addClass("ready");
  }
}

$( document ).ajaxStart(function() {
  $( "#main" ).removeClass("ready");
  finished = false;
});

$( document ).ajaxStop(function() {
  finished = true;
  window.setTimeout(ready,500);
});'

这将检查页面是否已完全加载,并且没有挂起的请求,我只需在浏览器打开后执行此操作,然后我就可以检查该类是否存在,以及是否已准备就绪。无论页面何时更改,我都会调用相同的检查。

以编程方式,我可能会对ExpectedConditions使用显式等待,而不是线程。睡眠:

    public WebElement element2Click (By by){
      WebElement myClickableElement = (new WebDriverWait(driver, 10))
      .until(ExpectedConditions.elementToBeClickable(by));

      return myClickableElement;
}

但是,如果这不能解决问题,并且您的自动测试程序在其他浏览器中相当稳定,则可能是您正在测试的网页或webapp不支持Chrome,并且您可能会看到StaleElementReferenceException错误,因为HTTP消息通信不正常。在这种情况下,请查看浏览器上的HTTP流量

以编程方式,我可能会对ExpectedConditions使用显式等待,而不是Thread.sleep:

    public WebElement element2Click (By by){
      WebElement myClickableElement = (new WebDriverWait(driver, 10))
      .until(ExpectedConditions.elementToBeClickable(by));

      return myClickableElement;
}

但是,如果这不能解决问题,并且您的自动测试程序在其他浏览器中相当稳定,则可能是您正在测试的网页或webapp不支持Chrome,并且您可能会看到StaleElementReferenceException错误,因为HTTP消息通信不正常。在这种情况下,请查看浏览器上的HTTP流量

如果没有实际的代码和完整的回溯,很难说。通常,在操作元素时会发生错误
nt不再链接到页面,在找到元素后页面被更改。@alecxe-感谢您的重播。在这种情况下,为什么它可以与其他浏览器配合使用?为什么只有chrome才会出现这种情况?如果没有实际的代码和完整的回溯,很难说。通常,当您操作不再链接到页面的元素时,会发生错误。在找到该元素后,页面已被更改。@alecxe-感谢您的重播。在这种情况下,为什么它可以与其他浏览器配合使用?为什么只有chrome才会发生这种情况?@Zenon thnk u。我尝试了大量断言,也尝试了使用try-catch查找元素。我们有一个util方法,它将使用properties文件键查找元素。我还多次添加了上面修改的waits方法的代码,现在所附的是最新的一个…如果您能分享您的视图将非常有用。我个人讨厌在不需要等待的地方计时,告诉web驱动程序等待3秒钟并不是很好,因为它不一定要等待足够长的时间,或者它可能要等待很长时间。我用于测试页面准备就绪的一些代码是:“var finished=false;”函数就绪{''如果完成==true{'$main.addClassready;''}'}''$document.ajaxStartfunction{'$main.removeClassready;''finished=false;''};'$document.ajaxStopfunction{''finished=true;''window.setTimeoutready,500;''};'在您的代码中,您似乎在获得stale元素异常后等待它,您应该睡眠一定的时间,然后再次尝试查找它,如果页面仍在更改,您可能会再次获得staleReferenceException。你在Waitill方法中没有捕捉到这一点。我尝试了大量断言,也尝试了使用try-catch查找元素。我们有一个util方法,它将使用properties文件键查找元素。我还多次添加了上面修改的waits方法的代码,现在所附的是最新的一个…如果您能分享您的视图将非常有用。我个人讨厌在不需要等待的地方计时,告诉web驱动程序等待3秒钟并不是很好,因为它不一定要等待足够长的时间,或者它可能要等待很长时间。我用于测试页面准备就绪的一些代码是:“var finished=false;”函数就绪{''如果完成==true{'$main.addClassready;''}'}''$document.ajaxStartfunction{'$main.removeClassready;''finished=false;''};'$document.ajaxStopfunction{''finished=true;''window.setTimeoutready,500;''};'在您的代码中,您似乎在获得stale元素异常后等待它,您应该睡眠一定的时间,然后再次尝试查找它,如果页面仍在更改,您可能会再次获得staleReferenceException。在Waitill方法中,您没有捕捉到这一点。