Ruby+Watir经验谈: Understanding Watir

67 篇文章 0 订阅
使用Watire,主要通过是使用 Watir::IE的一个实例来获得页面上的各种元素,比如button,link...,然后你可以对这些元素进行操作,比如 点击一个button点击一个link...
        ie = IE.new
        ie.goto("http://somewhere")
        ie.button(:caption, /save/).click

实际上,需要注意的是,Watir::IE封装了一个当前页面的 DOM tree,而不是html source。比如如果用javascrīpt动态产生一个元素,在这里仍然可以访问。


这种访问DOM tree的能力并不是Watir::IE所独有的,div,frame都具有这样的能力。实际上,这种能力是 Watir::SupportedSubElements提供的。一般来说所有内部能包含任意子tag的元素都include Watir::SupportedSubElements, like Watir::Frame, Watir::Div, Watir:: TableCell, Watir:: Form...所以我建议把关于Watir::SupportedSubElements的API页面地址放在收藏夹,你会经常需要访问他们 :).


获得元素的方法参数一般来说有两种
    1)how, value
    大多数element都可以通过这种方式获得。

    how给出了方式,比如:id, :name
    value给出了值,比如
    <input type="button" id="saveBtn" value="Save"/>
    
    获得button的代码是: ie.button(:id,  "myId")


    2) how, what, value
    这种方式适用于访问radio或者checkbox。我们知道可能有多个radio具有同样的name,只是value不同。
    比如一个选择男或女的的form field有两个radios,
    <input type="radio" name="gender" value="male"/>Male
    <input type="radio" name="gender" value="female"/>Male


    获得第一个radio的代码是: ie.radio(:name, "gender", "male")

注意, 如果给定条件的element不存在,方法返回的不是nil,仍旧是这个类型的元素的一个实例要用element.exists? 来判断这个元素是否真的存在。调用一个不存在的element的任何方法,都会触发一个Exception。

   
下面是Watir的源代码结构。

module Watir
    # 所有的Exception都定义在另外一个文件里,
    # 且都位于Watir::Exception这个Module里面,
    # 这句话,把所有的Exception都引入Watir这个Module,方便使用
    include Watir::Exception

    # 这个module为每一个Dom Tree上的元素定义了一个访问方法
    # 比如,为button定义一个button方法,当要得到一个button时就可以用
    # ie.button(:name, 'b1')这样的方式
    #
    # IE和Frame都要include这个module,这样IE和Frame都具有这种能力
    # 理论上,任何可以包括任意别的tag的tag都可以引入这个module,
    # 比如<td>, <div>
    module SupportedSubElements
    def button(how, what=nil)
        end

        def link(how, what=nil)
        end
    end


    class IE
    # IE 拥有了访问Dom tree上element的方法
    include SupportsSubElements

    # 一个工厂方法,你总是可以用这个方法来初始化一个browser对象
    def IE.start(url)
    end

   
    # IE对象提供了很多操控IE window的方法比如
    # 前进,后退,刷新,goto, maximize, minimize
    def back
    end


    # 还提供了访问HTML code的方法
    def html
        return document.body.outerHTML
    end

    def text
        return document.body.innerText.strip
    end

    end

    class Form < IE
    #Form可以访问它内部的Dom tree。另外,From还提供了一些Form特定的方法,
    #比如submit,方法和获取form的name, action, method的方法
    def name
    end
    end

    # Element 是大多数页面元素的基类.
    # 它定义了取得 适合大多数元素的成员变量
    #   id, name, type, value, title, disabled(某个值不存在的话,返回"");
    #
    # 和成员方法
    #   click, exists?, enabled?, html, ...
    class Element
    end


    # ElementCollections是 代表某类页面元素的集合
    # 比如 links, spans,
    # ElementCollections 引入了Enumerable module
    # 所以你可以方便的操作里面的元素
    class ElementCollections
    include Enumerable
    end
end

Watir,不得不说是一个非常精彩的library,它提供的功能非常强大,还能保持API直观,统一,易于使用。再加上,它的原生操纵语言是强大的ruby,用Watir写对于 web测试简直就是手拿一把锋利的多功能瑞士军刀。

Watir的不足之处是它不能处理超出Dom Tree之外的东西,比如javascrīpt popup box,不过借助第三方库,也能比较优美的解决。

转自: http://www.51testing.com/?uid-764-action-viewspace-itemid-11525


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值