我们正在使用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时,最初让我失望。

07-24 19:07
查看更多