1

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

不过,这让我发疯了,因为测试在一半的时间里运行良好,但另一半会给出 StaleElementReference 或类似的错误,通常每次都发生在不同的阶段。这是在相同条件下运行它们时。

每次列表视图页面更改时,我都会重新分配 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);
            ...

这够了吗,还是我需要更具体的“等待”形式来解决这个问题?

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

非常感谢

4

1 回答 1

2

呵呵,遇到类似的问题。问题是当你在页面上有很多 AJAX 时,处理它的最好方法(恕我直言)和我最喜欢的等待是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 选择器)并将其传递给 fluent wait。而流利的等待,反过来,返回你找到的网页元素。来自文档: Wait 接口的实现,可以动态配置其超时和轮询间隔。每个 FluentWait 实例定义等待条件的最长时间,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的 NoSuchElementExceptions。 用法:

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

你可以在这里获得更多信息

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

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

2)第二个。你与一个元素交互。然后您与另一个导致大量 AJAX 交互(未完成页面重新加载和第一个元素刷新)。并立即返回到前一个(例如 getText 或单击)>> staleElement

所以我总是使用流利的等待。从您可以设置忽略的任意例外的角度来看,这很舒服。希望这对你有用。

于 2012-10-10T15:40:24.477 回答