【问题标题】:How to wait in selenium for long time effectively如何有效地在硒中等待很长时间
【发布时间】:2018-05-21 17:10:16
【问题描述】:

一旦测试用例和步骤是自动化的:

  1. 访问网站
  2. 转到报告页面
  3. 填写信息表以请求报告
  4. 报告在页面上显示后立即下载

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

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

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

do{

   //click somewhere on page constantly where nothing happens but just to be active

}while(reportelement.size!=1);

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

我知道 selenium 提供了显式等待,但对于如何在此处实现有点困惑。

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

【问题讨论】:

  • 我认为在代码中浪费 30 分钟本身就是不好的测试。您不应该将测试分成两部分,一份生成,另一份在 30 分钟左右后检查报告?
  • @Tarun- 实际上报告生成不在我的控制范围内。我所能做的就是请求报告并在接下来的 30 分钟内检查报告是否可以下载。
  • 我的意思是你运行两个测试,一个生成报告,第二个执行让我们说 30 分钟后返回并检查报告是否在同一页面上可用?
  • 我理解,但在这种情况下,我将不得不在 30 分钟后手动触发第二个测试用例。因为我们目前没有使用任何 CI 来安排测试用例。
  • 明白了,以目前对情况的了解发布了答案。

标签: java selenium selenium-webdriver


【解决方案1】:

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

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,因此您无需在页面上执行任何其他操作,因此与驱动程序的连接仍将处于活动状态

【讨论】:

  • 谢谢。这就是我一直在寻找的。非常合乎逻辑的答案。
  • 嗨。这里有一个问题。如果元素在 30 分钟后不可用,我想给出一些消息怎么办?我想退出 while 并给出一些信息。
  • 你可以在循环外查看reportelement.size。如果仍然是0,则在超时时间内找不到该元素
  • 所以你的意思是它会从 do..while 无论如何在 30 分钟后退出?
  • 是的,TIMEOUT 定义的
【解决方案2】:

使用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 在这里也有意义。

【讨论】:

  • 嘿。感谢您的回答。我会在这里尝试更新你。
猜你喜欢
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多