如何有效地长时间在硒中等待

时间:2018-04-28 12:28:05

标签: java selenium selenium-webdriver

我正在自动化一次测试用例和步骤:

  1. 转到网站
  2. 转到报告页
  3. 填写信息表格以索取报告
  4. 在页面
  5. 上显示后下载报告

    这里主要是填写表格后请求报告,请求25到30分钟后可在同一页面下载报告。

    那么有没有更好的方法等待30分钟,直到我的报告可供下载?

    提交请求后,我想把逻辑放在:

    do{
    
       //click somewhere on page constantly where nothing happens but just to be active
    
    }while(reportelement.size!=1);
    

    一旦我获得报告大小> 0,我将点击下载链接。

    我知道selenium提供了明确的等待,但有点混淆了如何在这里实现。

    我不是在寻找整个场景代码,只是一个好的逻辑可以帮助我自动化这些等待的东西。

2 个答案:

答案 0 :(得分:2)

如果您无法拆分测试,我建议您保持简单,如下所示

int timeTaken = 0;
int TIMEOUT = 30 * 60;

do {
    Thread.Sleep(1000);
    timeTaken = timeTaken + 1;
    reportelement = driver.findElements(...);
} while (timeTaken < TIMEOUT && reportelement.size != 1)

FluentWait最好不要在元素可用时浪费时间并避免硬编码等待。因为在这里我们总是期待30分钟的延迟,所以浪费额外的时间以确定元素无关紧要。但是用例的代码非常简单。

由于您正在执行findElements,因此您无需在页面上执行任何其他操作,连接仍将在驱动程序中处于活动状态

答案 1 :(得分:0)

使用FluentWait方法执行此操作的最简洁方法可能是自定义Sleeper。这可以在支票之间做你喜欢的事。

SleeperWebDriverWait的完整构造函数的参数之一,例如:

    Sleeper sleeper = duration -> {
        // Click somewhere
        Sleeper.SYSTEM_SLEEPER.sleep(duration);
    };

    long longTimeout = 1800_000;
    FluentWait<WebDriver> wait = new WebDriverWait(driver,
            new SystemClock(), sleeper, longTimeout,
            WebDriverWait.DEFAULT_SLEEP_TIMEOUT)
                    .ignoring(StaleElementReferenceException.class);

    By by = By.id(id); // (As appropriate)

    wait.until(ExpectedConditions.numberOfElementsToBe(by, 1));

- 其他构造函数参数只有正常的默认值。可能更长的sleepTimeOut在这里也有意义。

相关问题