2

我刚刚开始使用带有 webdriver 的 geb 进行自动化测试。 据我了解,当我在页面上定义内容时,每次调用内容定义时都应该查找页面元素。

//In the content block of SomeModule, which is part of a moduleList on the page:
itemLoaded {
    waitFor{ !loading.displayed }
}
loading { $('.loading') }


//in the page definition
moduleItems {index -> moduleList SomeModule, $("#module-list > .item"), index}

//in a test on this page
def item = moduleItems(someIndex)
assert item.itemLoaded

所以在这段代码中,我认为$('.loading')应该重复调用,以在模块的基本元素的上下文中通过其选择器在页面上查找元素。然而,此时我有时会遇到 StaleElementReference 异常。据我所知,该元素不会从页面中删除,但即使这样做,除非$在幕后进行一些缓存,否则不应产生此异常,但如果是这种情况,它会导致各种其他问题。

有人可以帮我理解这里发生了什么吗?为什么在查找元素时可能会得到 StaleElementReferenceException?指向相关文档或geb源代码的指针也很有用。

4

1 回答 1

1

事实证明,问题在于对由模块本身表示的元素的引用已通过修改变得陈旧,而不是.loading元素。我怀疑异常源于该行,因为它试图在模块的基本元素中搜索以找到 .loading 元素。解决方案是在检查模块内部元素的同时加载模块。在这种情况下,它看起来像这样:

//In the content block of SomeModule, which is part of a moduleList on the page:
itemLoaded { !loading.displayed }
loading { $('.loading') }

//in the page definition
moduleItems {index -> moduleList SomeModule, $("#module-list > .item"), index}

//in a test on this page
waitFor { moduleItems(someIndex).itemLoaded }

感谢 geb 用户邮件列表上的 Marcin 为我指明了正确的方向。

于 2012-09-01T03:34:06.497 回答