【问题标题】:wait_until block is giving time out errorwait_until 块给出超时错误
【发布时间】:2015-04-06 21:42:46
【问题描述】:

这是我失败的代码。

link(:continue, :text => 'Continue Shopping')

def verify_cart
    wait_until(60) do
      continue_element.visible?
    end
  end

为了让它发挥作用,我在这里尝试了解决方案: Inconsistently getting error (Watir::Wait::TimeoutError)Timeout::Error in Rails application using Watir 但没有一个对我有用。

我也尝试过增加时间。

然后我尝试将 implicit wait 从 3 秒增加到 20 秒,而不是使用 wait_until 块,我只是使用了 .visible? 并且它起作用了。

link(:continue, :text => 'Continue Shopping')

continue_element.visible?

 #def verify_cart
 #   wait_until(60) do
 #     continue_element.visible?
 #   end
 # end 

现在的问题是元素何时存在,为什么 wait_until 一直失败?

【问题讨论】:

  • @JustinKo 你能谈谈你的想法吗?
  • 使用continue_element.visible? 而不是wait_until(60){ continue_element.visible? } 是什么意思?是否意味着异常消失并且脚本的后续步骤按预期工作? continue_element.visible? 只返回元素是否存在。如果您只是删除了verify_cart 方法的wait_until 部分,那么根据您的脚本编写方式,即使链接不存在,verify_cart 也可能通过。
  • @JustinKo 元素始终存在,它是可见的(我已经测试过了)。现在的问题是,当我将这个语句 continue_element.visible? 放在 wait_until 块之外时,它通过了,但是当我把它放在里面时,它给出了超时错误。
  • 我认为您需要提供更多有关问题的背景信息。我们需要查看 (1) 重现问题的 HTML 和相关的 Javascript 和 CSS,以及 (2) 您正在运行的测试。

标签: ruby cucumber watir


【解决方案1】:
continue_element.visible? 

不会引发错误,它只会返回一个布尔值。听起来这个元素实际上并不可见,并且无论隐式等待如何,这仍然会引发错误:

raise unless continue_element.visible?

另外,一个更好的模式是:

continue.wait_until_present 

continue.when_present.click 

.present? 仅表示 .exists? && .visible? 这实际上是您想要的,并且此模式将为您提供更好的错误消息。

【讨论】:

  • 我已经知道.present?.visible?.exists? 之间的区别。你错了.visible?。失败时给出错误Watir::Exception::UnknownObjectException: unable to locate element,我对其进行了测试。最后,问题仍然存在 为什么 wait_until() 不起作用。
  • #可见?如果不存在则返回错误,如果存在且不显示则返回 false。 #当下?如果错误不存在或存在且不可见,则挽救错误,并返回 false。听起来您的元素实际上并不可见。除非 element.present,否则你能睡 60 分并提高吗?
  • @paul,我认为您对 visible? 的评论使 Watir 与 Page-Object API 混淆。你是对的,如果元素不存在,Watir 的visible? 会抛出异常。但是,Titus 是对的,continue_element.visible?,即 Page-Object 代码,如果元素不存在,将返回 false。尽管有这个名字,Page-Object 的 visible? 方法实际上调用了 Watir 的 present? 方法。
  • 我对 Page-Object 代码一无所知,@paul 也没有提到使用那个 gem。在 Watir,Element#visible?只会在元素不存在时抛出错误,如果存在但不显示则不会。上述两个例子都与 DOM 中存在但未显示的 continue 元素一致。等待块将为可见调用返回 false,直到它超时并引发超时错误。可见调用的隐式等待将返回 false 并且不会引发任何错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2013-03-08
  • 2019-01-07
  • 2017-05-18
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多