1

我正在使用 Selenium Webdriver,并且在我的测试应用程序中遇到了以下问题。

该应用程序有多个页面,每个页面都有一个适当的“.page-title”元素,其中包含页面的名称(例如“其他文档”)。当测试在应用程序中导航时,他们断言浏览器在执行其他操作之前使用这些元素位于预期页面上。

问题是,如果您单击应用程序中执行操作的按钮,然后检查您是否在正确的页面上(例如检查 page-title 元素显示正确的文本),Webdriver 不会等待执行操作(例如新页面加载),它会立即返回并且测试失败。

如果您在执行操作和检查您是否在正确的页面之间添加一个短线程睡眠(500 毫秒),那么您会得到 StaleElementReferenceException(有时),如果您添加一个大线程睡眠,则测试通过(但不是全部时间)。

我的目标是减少测试的脆弱性,有没有人建议我如何在没有 Thread.sleep 的情况下做到这一点?

4

4 回答 4

0

而不是显式地插入 thread.sleep 方法

在内置的 Implicitwait 方法中尝试 WebDriver ..(C# 代码片段)

Driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(Max_Time_Limit));

这使得 WebDriver 等待元素可见/可用。如果它在 Max_Time_Limit 之前找到元素,它会退出睡眠模式并恢复执行。

因此,无需等到硬绑定 Max_Time_Limit。这种方式也有助于加快您的执行时间。

我希望这会有所帮助......一切顺利:-)

于 2012-11-21T04:55:49.827 回答
0

尝试使用此等待:使用此您可以等待最长 15 秒/等待预期条件为真,即等待某些元素出现。

您可以在下一页上提供某个元素的 xpath,当该元素可见时,将执行下一步。

WebDriverWait 等待 = 新的 WebDriverWait(驱动程序, 15); wait.until(ExpectedConditions.elementToBeClickable(By.xpath("\xpath of some element on next page"))); //断言页面标题

driver.getTitle();

于 2012-11-21T05:12:46.723 回答
0

您可以使用 Selenium 的ExpectedCondition. 下面的代码(用 JAVA 编写)等待inTimeout您要出现的元素最多几秒钟。如果元素出现得较早,则结束等待。

public static void wait(WebDriver b,long inTimeout) {
    final SlnDriver browser=b;
    final long NO_LOADING_TIMEOUT = inTimeout;

    class HasCondition implements ExpectedCondition<Boolean> {

        @Override
        public Boolean apply(WebDriver d) {
            Boolean expected=false;
            WebElement e = browser.findElement(By.xpath("blabla"));
                if (e.getText().contains("TextYouWant")) {
                    expected= true;
                    break;
                }
            }
            return expected;
        }

    }
    }
    for (;;) {
        try {
            new WebDriverWait(browser, NO_LOADING_TIMEOUT).until(new HasCondition());
        } catch (TimeoutException e) {
            return;
        }
    }
}
于 2012-11-21T07:54:24.730 回答
0

使用fluentWait机制。被认为是一种稳健的方法。正如有关 fluent wait 的文档所给出的那样: Wait 接口的实现可以动态配置其超时和轮询间隔。每个 FluentWait 实例定义等待条件的最长时间,以及检查条件的频率。此外,用户可以将等待配置为在等待时忽略特定类型的异常,例如在页面上搜索元素时的 NoSuchElementExceptions。 您可以在这里获得的详细信息 我使用的方法代码:

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

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

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

希望对你有效。

于 2012-11-21T07:58:41.957 回答