如何处理" StaleElementReferenceException"使用Chrome浏览器

时间:2014-11-10 20:03:27

标签: java selenium selenium-webdriver

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

是否有人遇到类似问题并找到解决方案?

Chrome版本:38.0.2125.111
Selenium版本:2.43.1

public WebElement waitTill(By by){
    WebElement ele = null;
    for(int i=0; i<15; i++){
        try {
            ele = driver.findElement(by);
            if(ele==null)
                Thread.sleep(2000); //in last attempt used thread...we wont use this in actual practice
                else
                    break;
        } catch (NoSuchElementException | InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }
    return ele;
}

public WebElement getElement(String loc) {
    String locator = initUtils.ORProp.getProperty(loc);
    WebElement element = null;
    try{
        By by = getBy(locator);
        element = waitTill(by);
    }catch(NoSuchElementException e){
        System.out.println(e.getMessage());
    }catch(StaleElementReferenceException e){
        By by = getBy(locator);
        element = waitTill(by);
    }
    return element;
}

2 个答案:

答案 0 :(得分:3)

这种错误是由网页在检查元素之间的变化引起的。

这个例外主要是由于我不敢说的不好的测试造成的。要检查的一些事项是:

  • 确保在转到页面时加载页面时间 在你开始与之互动之前,即使你认为它有 装完它可能还在等待 背景,当它到达时,页面会发生变化。

  • 确保与任何更改页面的元素进行交互 确保你再次等待页面更改和任何HTML请求 处理。

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

我还建议检查一个元素是否在页面上,并且在尝试与之交互之前它是可见的。

在更糟糕的情况下,你可以使用try和catch块来检查元素,但如果你确定页面没有改变那么你就不应该得到异常。由于浏览器速度和网络驱动程序速度的不同,它在浏览器之间会有所不同。

我使用的一些代码是:

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);
});'

这检查页面是否已完全加载且没有待处理的请求,我只是在浏览器打开后执行此操作,然后我可以检查该类是否存在以及是否存在,我准备好了。每当页面发生变化时,我都会调用相同的检查。

答案 1 :(得分:1)

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

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

      return myClickableElement;
}

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