我怎样才能让 Watir 对非陈旧元素进行新的引用?

How can I get Watir to make a fresh reference on a non-stale element?

我正在编写的一些测试的一部分要求在使用该选项后检查该选项是否从 select 列表中删除。我不一致地收到此错误: 在 60 秒后超时,等待 {:xpath=>"//select[@id = 'newIdentifierType']//option", :index =>31} 位于 (Watir::Exception::UnknownObjectException)

它导致我的测试在 10 次运行中可能有 2-3 次失败,而且似乎是随机的。我认为 Watir 正在寻找具有此 ID 的 "old" select 列表,因为它缓存了该元素并且可能还包括它有 32 个项目,但它超时因为 select 列表带有此ID and 32 项不再存在。新的 select 列表具有相同的 ID,但只有 31 个项目。

有没有办法始终获得关于此元素的新引用,即使它在技术上不会过时?由于其他问题,我遇到了这个问题吗?

我当前获取 select 列表中的选项的代码:
@browser.elements(:xpath => "//select[@id = 'newIdentifierType']//option")

我正在使用 Ruby/Cucumber 与 Selenium 和 Watir Webdriver 级别。我首先尝试将元素定义为页面对象中的 select_list,但使用 @browser.element 将其移至步骤定义以查看是否会停止超时。我认为它可能会忽略 Watir 的缓存元素并获取具有 ID 的最新元素,但事实并非如此。

请避免将 XPath 与 Watir 一起使用。您可以用 XPath 做的所有事情,Watir 都有一个更具可读性的 API 来处理。

要检查不存在的特定选项,您应该避免收集并直接定位:

el = browser.select_list(id: "newIdentifierType").option(value: "31"))
# or 
el = browser.select_list(id: "newIdentifierType").option(text: "This one"))

然后看看它是否消失了:

el.stale?
# or
el.wait_until(:stale?)

不过,如果整个 DOM 发生了变化,那将无法测试正确的东西,因此您可能需要重新定位:

browser.select_list(id: "newIdentifierType").option(text: "This one")).present?

如果您打算使用集合,获取选项列表的正确方法是:

options = @browser.select(id: 'newIdentifierType').options
el = options.find { |o| o.text == 'This one' }
# Do things
el.stale?