我们正在使用Backbone.js,并且在运行WebDriver测试时遇到问题。我们收到以下错误:org.openqa.selenium.StaleElementReferenceException: Error Message => 'Element does not exist in cache'
我们的理解是,这是在我们找到一个元素并对该元素执行操作时引起的(例如click()
)。我们发现的元素已“过时”,我们怀疑该元素已被重新渲染或修改。
我们已经看到了许多我们并不热衷的解决方案:
使用Thread.Sleep(...)
。我们不想在代码中显式睡眠
使用重试策略(作为循环或尝试捕获StaleElementReferenceException
)。我们认为这不是正确/干净的解决方案,并且将来很容易突破
有些人正在使用WebDriverWait
并等待某些javascript函数执行返回true。我们已经看到人们在Angular中等待notifyWhenNoOutstandingRequests(callback)
,但是找不到对Backbone显而易见的东西。
我们希望有一个干净的解决方案,不涉及显式睡眠或某种形式的循环。有什么想法吗?
最佳答案
我对WebDriverWaits
进行了更多研究,我认为我提出了一些对我们有用的期望:wait.until(refreshed(elementToBeClickable(...)));
refreshed
期望值是处理StaleElementReferenceException
的其他期望值的包装,并且elementToBeClickable
期望值检查该元素是否可单击。有趣的是,查看内置预期的来源,其中一些处理StaleElementReferenceExceptions
,而另一些则不处理(例如presenceOfElementLocated
),因此需要将其包装在更新的预期中,所以我认为这就是当我第一次查看WebDriverWaits
时,最初让我失望。