【问题标题】:How can I get Watir to make a fresh reference on a non-stale element?我怎样才能让 Watir 对非陈旧元素做出新的参考?
【发布时间】:2018-01-04 23:36:06
【问题描述】:

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

它导致我的测试在 10 次运行中可能有 2-3 次失败,而且看起来有点随机。我认为 Watir 正在寻找具有此 ID 的“旧”选择列表,因为它缓存了元素并且可能还包括它具有 32 个项目,但由于具有此 ID 的选择列表 and 32 它超时项目不再存在。新的选择列表具有相同的 ID,但只有 31 项。

有没有办法总是在这个元素上获得新的参考,即使它在技术上并没有过时?我是否因为其他问题而遇到此问题?

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

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

【问题讨论】:

  • 在选择列表中选择一个选项后,UI(和 DOM)实际上发生了变化?您能否提供 HTML 来重现此行为?

标签: ruby selenium xpath watir page-object-gem


【解决方案1】:

请避免将 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?

【讨论】:

  • 谢谢!这可能让我更接近一致的测试。我尝试使用 @browser.select_list(id: "newIdentifierType").option(text: "my text").present?,它运行了 1 次,但下面的运行给了我一个通用的 Net::ReadTimeout 错误。知道是什么原因造成的吗?
  • ReadTimeouts 通常意味着您正在测试的站点跟不上它的请求。换句话说,它是网络而不是代码。
  • 在运行测试并直接找到选项后,我不断收到 ReadTimeout 错误,所以我尝试使用数组来代替:options = @browser.select(id: 'newIdentifierType').options。地图 {|o| o.text} 并检查选项文本是否不存在。它似乎工作得更好。我没有超时,到目前为止已经过去了 4 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2022-01-12
  • 2018-05-30
相关资源
最近更新 更多