使用hiddenlyWait和getElements严重减慢了我的测试时间

时间:2012-12-04 16:05:23

标签: java scala selenium selenium-webdriver scalatest

我们正在处理遗留代码,并且存在片状测试问题。

我想增加默认超时,但是在很多地方都使用了driver.findElement - 覆盖每次使用WebDriverWait的调用都是一项艰巨的任务。

我发现建议使用隐式等待,这看起来很理想,因为它只需要设置一次:

getDriver().manage().timeouts().implicitlyWait(5000, TimeUnit.MILLISECONDS);

我将其添加到初始化代码块中。不幸的是,当我运行一个测试用例(50次测试)时,我的性能炸弹 - 从~30秒增加到600秒。

我不明白为什么性能变得如此糟糕 - 我认为如果元素不存在(测试通过),它只会花费最长的时间。我以为这个电话会调查这个条件。但是我也看不到在哪里设置轮询间隔...它在文档中确实提到它应该明智地使用,但这是完全无法使用的!

我们使用implicitlyWait()是否在正确的轨道上?还有另一种方法可以加强我们的测试吗?

UPDATE 经过调查,它似乎正在使用hiddenlyWait()和driver.getElements(),这会减慢我们的速度 - 如果我使implicitwait无效,然后在调用后直接重新应用它,那么测试运行得更快。我们使用getElements ins 400多个地方(!) - 有关如何进行的任何建议吗?

1 个答案:

答案 0 :(得分:0)

我们无法使用implicitlyWait来追踪这种情况发生的原因。为了使我们的构建可靠,我们用自己的轮询机制编写了overrode getElement,轮询间隔相当低(100ms)。

这提高了测试的准确性,但不影响构建持续时间。

override def findElement(selector: By): WebElement = {
      val timeoutTime = System.currentTimeMillis() + timeout
      def helper(): WebElement = {
        try {
          super.findElement(selector)
        } catch {
          case exception: NoSuchElementException => {
            if (System.currentTimeMillis() >= timeoutTime) {
              throw exception
            } else {
              Thread.sleep(pollInterval)
              helper()
            }
          }
        }
      }
      helper()
    }