如何使用Watir::Waiter::wait_until强制Chrome等待?

17

我试图告诉我的watir脚本等待一个ajax注入的登录框打开。我正在使用watir-webdriver,并在Chrome中进行测试。如下所示(简化)脚本中,我无法使wait_until工作。

require "rubygems"
require "watir-webdriver"
b = Watir::Browser.new(:chrome)
site = "www.example.com"
b.goto site

puts "Click on Sign In button"
b.link(:id, 'btnLogin').click

puts "Waiting for the username/password dialog to show up"

# Below line does *not* work
# Throws this error: "uninitialized constant Watir::Waiter (NameError)" 
Watir::Waiter::wait_until { b.text_field(:id, 'username').exists? }

# Below line does *not* work
# Throws this error: "undefined method `wait_until' for main:Object (NoMethodError)" 
wait_until { b.text_field(:id, 'username').exists? }

# Below line *does* work, but I don't want to use it.
sleep 1 until b.text_field(:id, 'username').exists?

Watir::Waiter是只能用于IE浏览器的类吗?或者我做错了什么,sleep 1等待方法完全正常。我是Ruby和watir的新手,昨天刚刚开始学习,所以我有点担心这可能是我的新手问题。

如果有关系的话,我正在使用Mac(OSX v.10.6.5)。

3个回答

28

首先要做的是:

require "watir-webdriver/wait"

然后尝试这些方法:

1

Watir::Wait.until { ... }

2

browser.text_field(:id => 'username').when_present.set("name")

3

browser.text_field(:id => 'username').wait_until_present

请注意,“present”在此处的意思是“元素存在且可见”。


谢谢。问题已解决,感谢您指出了 wait_until_presentwhen_present 方法。您所展示的内容是否有在线资源可供参考?我的谷歌搜索似乎没什么用... - karim79

2
您可以使用浏览器设置超时时间。例如,它会等待700秒,如下所示。
client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 700 # seconds � default is 60 second
ie=Watir::Browser.new:firefox, :http_client => client

1
我几周前遇到了同样的问题。 关键是Watir::Wait.until{}仅等待主页面加载完成(主要在Firefox上测试)。 如果您有一些JavaScript代码加载其他组件,则不会等待这些组件加载完成。 因此,唯一的解决方案是选择一个元素并显式地等待其出现(使用方法2和3)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接