使用带Backbone.js的WebDriver时处理陈旧元素

时间:2015-03-04 13:58:02

标签: javascript selenium backbone.js

我们正在使用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的任何明显内容。
  4. 我们希望有一个干净的解决方案,不涉及明确的睡眠或某种形式的循环。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我进一步研究了WebDriverWaits,我认为我已经提出了一些对我们有用的期望组合:

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

refreshed期望是处理StaleElementReferenceException的其他期望的包装器,elementToBeClickable期望检查元素是否可点击。有趣的是,查看内置期望的来源,其中一些涉及StaleElementReferenceExceptions,而其他人不参与(例如presenceOfElementLocated)并且需要包含在更新的期望中,所以我认为这是我第一次看WebDriverWaits时最初让我失望的原因。