Rails Watir:在读取元素文本之前等待 5 秒

Posted

技术标签:

【中文标题】Rails Watir:在读取元素文本之前等待 5 秒【英文标题】:Rails Watir: Wait for 5 seconds before reading element text 【发布时间】:2021-06-27 07:47:30 【问题描述】:

我有一个包含

元素的网站。

此元素在页面加载时的值为 x 作为 innerhtml,在 z 秒后值为 y。

我不知道 x 和 y 的值是什么,因为它们经常变化。 z 可能介于 0 到 5 之间。因此,我不能使用 wait_until 或 wait_while。所以这真的行不通,因为我不知道要等什么。

Watir::Wait.until(5) 
  element.text == "abracadabra"

所以我真的需要等待 5 秒钟,然后检查元素的文本。 Watir 是否有某种我可以使用的 timout 功能?喜欢 javascript setTimeout()

【问题讨论】:

你在拧测试看看屏幕上是否有元素? 您知道它会发生变化,以便您获得原始值并等待该值不是那个值吗? @Rajagopalan:否元素始终在屏幕上。我想要它改变后的值。变化可以立即发生,也可以在 5 秒内发生。如果更改立即发生,则与从未更改一样。即使我尽快请求,Watir 也会给我更改后的值。 @titusfortner 在大多数情况下这是可能的,但如果更改发生得太快,那么我会完全错过原始值。 Watir 在我第一次请求时给了我更改后的值。 【参考方案1】:

这取决于您需要执行此操作的频率,您是否应该更喜欢只进行硬编码睡眠或更动态的操作。

这是另一种选择:

browser.goto my_dynamic_page
dynamic_text_element = browser.h1(locator_opt)
final_text = updated_text(dynamic_text_element)

def updated_text(element)
  original_text = element.text
  begin
    element.wait_until(timeout: 5)  |e| e.text != original_text 
  rescue Watir::Wait::TimeoutError
  end
  element.text
end

【讨论】:

这在大多数情况下都有效,除非更改发生得非常快。在那种情况下,我会完全错过原文。我第一次请求该值时,它已经是更改后的值了。 这就是 timeout: 5 的用途。如果它在第一次检查之前发生了变化,它就像一个睡眠 5。【参考方案2】:

你可以使用Ruby的sleep方法:

sleep(num_secs)

它采用整数或浮点值。

文档在这里:https://apidock.com/ruby/Kernel/sleep

【讨论】:

我不喜欢它,但我想这是我现在唯一的选择。 是的,我知道。 UI 自动化中的硬编码等待通常不是一个好建议。感谢您接受并支持答案。

以上是关于Rails Watir:在读取元素文本之前等待 5 秒的主要内容,如果未能解决你的问题,请参考以下文章

ruby 3和rails 6的watir:参数数量错误

Browsermob Proxy + Watir不会持续捕获流量

是否有“元素渲染”事件?

ruby 的Watir-广泛,得到元素为基础,对孩子,element.rb

Ruby : Watir : 如何避免从 Net::ReadTimeout 关闭浏览器?

使用 Phantomjs Watir 访问 iFrame