在Backbone.js中使用WebDriver时处理过时元素



我们使用Backbone.js,在运行WebDriver测试时遇到问题。我们得到以下错误:

org.openqa.selenium.StaleElementReferenceException: Error Message => 'Element does not exist in cache'

我们的理解是,这是在我们找到一个元素并对该元素执行操作(例如click())时引起的。我们发现的元素已"过时",我们怀疑该元素已被重新呈现或修改。

我们已经看到了很多我们不热衷的解决方案:

  1. 使用Thread.Sleep(...)。我们不希望代码中出现显式睡眠
  2. 使用重试策略,作为循环或尝试捕获StaleElementReferenceException。我们觉得这不是正确/干净的解决方案,而且在未来很可能会出现故障
  3. 有些人正在使用WebDriverWait,等待某个javascript函数执行返回true。我们已经看到人们在Angular中等待notifyWhenNoOutstandingRequests(callback),但找不到任何明显的Backbone

我们希望有一个干净的解决方案,不涉及显式睡眠或某种形式的循环。有什么想法吗?

我对WebDriverWaits进行了更多的研究,我认为我已经提出了对我们有效的期望组合:

wait.until(refreshed(elementToBeClickable(...)));

refreshed期望是处理StaleElementReferenceException的其他期望的包装器,而elementToBeClickable期望检查元素是否可点击。有趣的是,查看内置期望的来源,其中一些处理StaleElementReferenceExceptions,而另一些则不处理(例如presenceOfElementLocated),并且需要被更新的期望所包裹,所以我认为这是我第一次查看WebDriverWaits时最初感到困惑的地方。

最新更新