Selenium - 不一致的StaleElementReference错误

时间:2012-10-10 11:42:46

标签: java listview selenium webdriver wait

我正在为列表视图编写Java Selenium测试,特别是要验证的,然后从列表视图中选择一个项目。

但是,这让我很疯狂,因为测试会在一半的时间内运行正常,但是另一半他们会给出StaleElementReference或类似的错误,每次都会出现在不同的阶段。这是在相同的条件下运行它们。

每次listview页面更改时我都会重新分配WebElement变量,因为我收集了这可能是问题,但它仍然会发生。然后我认为这可能与需要等待页面完全加载有关,但我不完全确定如何使用WebDriverWait等我见过其他人建议的东西。 但我知道我们现有的基页对象类已经包含了等待的内容,所以我认为这可能已经涵盖了:

    public abstract class PageObject {

protected WebDriver driver;
protected WebDriverWait wait;
    ...
    public PageObject(WebDriver driver, String relativePath) {
            ...
            this.driver = driver;
            this.wait = new WebDriverWait(driver, 8);
            ...

这还不够,还是我需要更具体的'等待'来解决这个问题?

除此之外,任何人都可以想到可能导致此问题的任何可能的常见问题吗?

非常感谢

1 个答案:

答案 0 :(得分:2)

嘿,遇到类似的问题。问题是当你在页面上有很多AJAX时,处理它的最佳方式(imho)和我最喜欢的等待是fluentWait()

 public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(1, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
                new Function<WebDriver, WebElement>() {
                    public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                    }
                }
        );
        return  foo;              
     };

所以你实际上需要找到web元素的定位器(xpath或css选择器)并将其传递给流畅的等待。而流利的等待,反过来,返回你找到的网页元素。 从文档: Wait接口的实现,可以动态配置其超时和轮询间隔。 每个FluentWait实例定义等待条件的最大时间量,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。用法:

String xPathElement =".....blablabla...";
WebElement neededElement =fluentWait(By.xpath(xPathElement));
 neededElement.click();
//neededElement.getText().trim();

你可以获得更多信息here

导致此类问题的问题可以(根据我的经验)有两种类型: 1)第一个

您与导致页面呈现或其他“慢”操作的元素进行交互。 Selenium测试继续进行,但页面实际上没有呈现&gt;&gt; staleElement

2)第二个。 你与一个元素互动。然后你与另一个交互导致很多AJAX(不完整页面重新加载,第一个元素刷新)。并立即返回上一个(想要例如getText或点击)&gt;&gt; staleElement

所以我总是用流利的等待。从设置仲裁异常忽略的角度来看,这很舒服。 希望这对你有用。