Waiting
当你的测试页面包含一些动态的交互,比如有许多AJAX时,等待页面加载完毕往往是一件很头痛的事情。
显式的等待
Watir-Webdriver提供了4种方法使你的等待体验不再痛苦(将那些丑陋的sleep语句从代码中移除掉吧):
- Watir::Wait.until { ... }: 等待,直到block中的语句为true
- object.when_present.set: 当object出现时去操作objcet,这个例子里是调用了object的set方法,当object存在的时候
- object.wait_until_present:等待,直到object出现
- object.wait_while_present:等待,直到object消失
默认情况下,上面的方法会等待30秒,不过你也可以在调用方法时传入1个参数来增加(减少)等待时间,如果需要的话。
require 'watir-webdriver'
b = Watir::Browser.start '17test.info/watir_wd_demo.php'
b.select_list(:id => 'entry_1').wait_until_present
b.text_field(:id => 'entry_0').when_present.set 'your name'
b.button(:value => 'Submit').click
b.button(:value => 'Submit').wait_while_present
Watir::Wait.until { b.text.include? 'Thank you' }
隐式的等待
另一个选择是使用WebDriver的隐式等待。脚本每次在定位测试元素的时候总是会隐式的等待一段时间(在这段时间内如果元素无法被定位到,那么脚本就会抛出异常),你可以通过改变driver的属性来自行指定这个隐式的等待时间:
require 'watir-webdriver'
b = Watir::Browser.new
b.driver.manage.timeouts.implicit_wait = 3 #3 秒
注意:使用隐式等待会使得你的测试用例运行速度变慢并且当用例失败时其失败原因会更难定位。