Hi, 如果有任何想法与我沟通, 请用: lifr_nj 在 msn.com
WATIR小技巧
上一篇 /
下一篇 2010-07-20 10:04:52
/ 个人分类:TA
*通过子节点定位父节点有时候我们想得到的节点并不好定位, 但是它的某个子节点比较好定位. 这时候就要1)先找到子节点, 2)然后回溯到父节点.
比如下面是一个tree node的结构
<table><tbody> <tr> <td><a><img src="plus.gif"/></a></td> <td><span>NodeABC</span></td> </tr></tbody></table>任务是点击<a><img src="plus.gif"/></a>展开此节点, 但是因为此tag并不好定位, 所以采取的定位路径是
<span>NodeABC</span> 到 <tr> 到 <a><img .../></a>ruby code:
sp = $b.span(:text, "NodeABC") tr = sp.parent.parent tr = Watir::TableRow($b, :ole_object, tr.old_object) if tr.image(:src, /plus/).exists? then tr.links[1].click end注意:
- 向上回溯会用到一个API Watir::Element.parent
- 通过上面得到的父节点是Element实例, 如果要使用特定tag类型的方法, 还需要"通过Element"构造"特定tag的实例"
* 让WATIR更好的支持ajaxWATIR开发之初并没有考虑到支持ajax, 所以你必须自己负责检测某个元素已经就绪.如下面的代码所示:
btn = $b.button(:id, "btn1")
Watir::Waiter.wait_until(10, 1) { btn.exists? }
btn.click
这样虽然可行, 但是代码显得啰嗦了点. 后来看了源码, 觉得可以通过覆盖Element的assert_exists?方法来改进一下.
因为几乎所以元素的操作,比如click, set, ...都会调用assert_exists?方法,所以可以在此方法内做wait, 如下所示
module Watir
class Element
def assert_exists
Watir::Waiter.wait_until(10, 1) { exists? }
unless ole_object
raise UnknownObjectException.new(
Watir::Exception.message_for_unable_to_locate(@how, @what))
end
end
end
end
这样, 上面的
测试代码就可以简化为一行代码.
$b.button(:id, "btn1").click
注意: 本方法只是小范围测试通过. 不能保证所有情况下都好用.
收藏
举报
TAG: