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


注意:
  1. 向上回溯会用到一个API Watir::Element.parent
  2. 通过上面得到的父节点是Element实例, 如果要使用特定tag类型的方法, 还需要"通过Element"构造"特定tag的实例"

* 让WATIR更好的支持ajax
WATIR开发之初并没有考虑到支持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:

 

评分:0

我来说两句

Open Toolbar