1

我们正在处理遗留代码,并且存在不稳定测试的问题。

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

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

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

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

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

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

更新在调查中,它似乎正在使用implicitlyWait() 和driver.getElements() 减慢我们的速度 - 如果我取消隐式等待然后在调用后立即重新应用它,那么测试运行得更快。我们在 400 多个地方使用 getElements 插件(!) - 关于如何进行的任何建议?

4

1 回答 1

0

我们无法通过implicitlyWait 找出为什么会发生这种情况。为了使我们的构建可靠,我们使用自己的轮询机制编写了覆盖 getElement,轮询间隔相当短(100 毫秒)。

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

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()
    }
于 2012-12-06T17:47:58.857 回答