我正在编写的一些测试的一部分要求检查在使用该选项后是否从选择列表中删除了一个选项。我不一致地得到这个错误: 60秒后超时,等待{:xpath =>" //选择[@id =' newIdentifierType'] //选项" ,:index => 31}待定位(Watir :: Exception :: UnknownObjectException)
它导致我的测试失败,可能在10次运行中失败2-3次,看起来有点随机。我认为Watir正在寻找" old"选择具有此ID的列表,因为它缓存元素,并且还可能包括它有32个项目,但它超时,因为具有此ID 和 32个项目的选择列表不再存在。新的选择列表具有相同的ID,但只有31个项目。
有没有办法总是得到一个关于这个元素的新参考,即使它在技术上不是陈旧的?我是否因为不同的问题而遇到这个问题?
我目前获取选择列表中选项的代码:
@browser.elements(:xpath => "//select[@id = 'newIdentifierType']//option")
我正在使用Ruby / Cucumber与Selenium和Watir Webdriver级别。我首先尝试将元素定义为页面对象中的select_list,但使用@ browser.element将其移动到步骤定义,以查看是否会停止超时。我认为它可能会忽略Watir的缓存元素并使用ID获取最新的元素,但情况似乎并非如此。
答案 0 :(得分:1)
请避免在Watir中使用XPath。你可以用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?