这次的问题是这样的:有时候页面上会有一些交互是非常动态的,比如点击一个按钮,然后出现一个弹出框。由于代码执行的很快,经常在弹出框还没有出现的时候代码就已经执行了,这样就导致脚本报找不到元素的错误。
coco再一次去请教tom,tom告诉她,这时候需要用到watir里比较好用的一个智能等待的特性。watir的代码很有表现力,tom就直接拿代码来说话了。
require ‘watir-webdriver‘ b = Watir::Browser.start ‘bit.ly/watir-webdriver-demo‘ 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‘ }
可以看出来,watir提供了下面的一些方法来进行动态等待
Watir::Wait.until { ... }: where you can wait for a block to be true object.when_present.set: where you can do something when it’s present object.waituntilpresent:; where you just wait until something is present object.waitwhilepresent:; where you just wait until something disappears
最常用的方法是object.wait_until_present,这个方法是直接等待object出现。对于喜欢流利编程的人来说object.wait_until_present.click这样的写法是非常赏心悦目的,同时也极其实用。
coco试了一下,果然问题迎刃而解。
tom问道:"怎么样,弄明白了?"
coco笑道:"明白了,其实挺简单的。等待而已,不是很麻烦"。
tom笑道:"在watir里很简单,但是在selenium webdriver的java binding里,具体的做法就复杂多了。watir算是大道至简以及返璞归真了。"
coco根本听不懂什么是webdriver的java binding,她只是频频点头,显得很厉害的样子。
tom思考了一下,他舔了舔嘴唇,声音有点沙哑的问道:"你能不能再等一等?"
coco疑惑道:"再等一等?我代码里等过一次了,难道再等下会比较好么?"
tom有点激动的说道:"不是,我是指换工作的事情。现在年底了,再等一等,过完年也许机会更好一点。"
coco道:"嗯,这个我有分寸的"