我们使用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
时最初感到困惑的地方。