我们正在处理遗留代码,并且存在片状测试问题。
我想增加默认超时,但是在很多地方都使用了driver.findElement - 覆盖每次使用WebDriverWait的调用都是一项艰巨的任务。
我发现建议使用隐式等待,这看起来很理想,因为它只需要设置一次:
getDriver().manage().timeouts().implicitlyWait(5000, TimeUnit.MILLISECONDS);
我将其添加到初始化代码块中。不幸的是,当我运行一个测试用例(50次测试)时,我的性能炸弹 - 从~30秒增加到600秒。
我不明白为什么性能变得如此糟糕 - 我认为如果元素不存在(测试通过),它只会花费最长的时间。我以为这个电话会调查这个条件。但是我也看不到在哪里设置轮询间隔...它在文档中确实提到它应该明智地使用,但这是完全无法使用的!
我们使用implicitlyWait()是否在正确的轨道上?还有另一种方法可以加强我们的测试吗?
UPDATE 经过调查,它似乎正在使用hiddenlyWait()和driver.getElements(),这会减慢我们的速度 - 如果我使implicitwait无效,然后在调用后直接重新应用它,那么测试运行得更快。我们使用getElements ins 400多个地方(!) - 有关如何进行的任何建议吗?
答案 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()
}