zoukankan      html  css  js  c++  java
  • Watir 使用

    官方教程:

    http://wiki.openqa.org/display/WTR/Tutorial


    下面是我收集的Watir的一些用法,以后如果有机会会补上我自己使用的心得:

    与网页交互(Interacting With a Web Page)

    当使用Watir开发测试脚本的时候,通过给网页上的对象发送消息来与之交互。

    Watir 语法(Web Application Testing in Ruby)

    # watir的安装
    watie的安装请查看 -> Ruby library的安装

    # 使用Watir工具,需要在脚本中加上
    require 'watir'

    # 创建一个IE的实例
    ie = Watir::IE.new
    或者在创建的同时直接转到页面
    ie = Watir::IE.start('http://www.text.com/')
    Watir使用start方法同时创建一个浏览器实例并转到一个页面。
    IE浏览速度
    ie.speed = :fast
    ie.speed = :slow

    # 页面导航
    ie.goto('http://www.text.com/')
    注: ie.goto还可以运行javascript的代码如: ie.goto("javascript: ie.document.write("Hello World");")

    # 取得当前网页的网址
    ie.url

    # 点击超链接
    ie.link(:text , "Pickaxe").click
    ie.link(:href, /http://pragmaticprogrammer.com/).click
    ie.link(:name => 'foo', :index => 1).click

    # 超链接的uri
    ie.link(:text , "Pickaxe").href
    ie.link(:index, 1).href
    ie.link(:text => "reply", :index => 2).href

    # 超链接的文本
    ie.link(:href , /http://pragmaticprogrammer.com/).text

    对应的HTML代码为:
    <a href='http://pragmaticprogrammer.com/titles/ruby/'>Pickaxe</a>

    # img标签
    ie.image(:name, 'image').src
    ie.image(:index, 2).src

    对应的HTML代码为:
    <img name = img src='http://pragmaticprogrammer.com/titles/ruby/top.gif'>
    <img name = img src='http://pragmaticprogrammer.com/titles/ruby/head.gif'>

    # 设置复选框
    ie.checkbox(:name, "checkme").set
    ie.checkbox(:name, "checkme", "1").set # 使用name和value属性设置复选框

    # 清除复选框
    ie.checkbox(:name, "checkme").clear
    ie.checkbox(:name, "checkme", "1").clear # 使用name和value属性清除复选框

    对应的HTML代码为:
    <input type = "checkbox" name = "checkme" value = "1">

    # 设置单选框
    ie.radio(:name, "clickme").set
    ie.radio(:name=>'clickme', :index=>2).set
    ie.radio(:name, "clickme", "1").set # 使用name和id属性设置单选框

    # 使用name属性清除单选框
    ie.radio(:name, "clickme").clear
    ie.radio(:name, "clickme", "1").clear # 使用name和id属性清除单选框

    对应的HTML代码为:
    <input type = "radio" name = "clickme" id = "1">
    <input type = "radio" name = "clickme" id = "2">

    # 设置下拉框
    ie.select_list(:name, "selectme").select('Python') # 使用text属性和值来设置下拉框
    ie.select_list(:name, "selectme").select_value('2') # 使用value属性和值来设置下拉框

    # 使用name属性和值来清除下拉框
    ie.select_list(:name, "selectme").clearSelection

    对应的HTML代码为:
    <select name = "selectme">
    <option value = 1>Ruby
    <option value = 2>Java
    <option value = 3>Python
    <option value = 4>C
    </select>

    # 文本的框设置
    ie.text_field(:name, "typeinme").set("Watir World")

    # 清空文本输入框
    ie.text_field(:name, "typeinme").clear

    对应的HTML代码为:
    <input type = "text" name = "typeinme">

    # 通过值或name属性点击button
    ie.button(:value, "Click Me").click
    ie.button(:name, "clickme").click

    对应的HTML代码为:
    <input type = "button" name = "clickme" value = "Click Me">

    # 通过值或name属性点击Submit
    ie.button(:value, "Submit").click
    ie.button(:type, "Submit").click
    ie.button(:name, "Submit").click

    对应的HTML代码为:
    <form. action = "submit" name = "submitform" method="post">
    <input type = "submit" value = "Submit">
    </form>

    # 表单中的图片按钮
    ie.button(:name, "doit").click

    对应的HTML代码为:
    <form. action = "submit" name = "doitform" method="post">
    <input type="image" src = "images/doit.gif" name = "doit">
    </form>

    # 没有按钮的表单
    ie.form(:name, "loginform").submit # 通过name,action以及method属性来提交表单
    ie.form(:action, "login").submit
    对应的HTML代码为:
    <form. action = "login" name = "loginform" method="get">
    <input name="username" type="text">
    </form>

    # 框架
    ie.show_frames可以打印出当前页面框架的数量和名称
    Watir允许通过名称属性来访问框架,如ie.frame("menu")
    如果要访问menu框架中的一个超链接,可以
    ie.frame("menu").link(:text, "Click Menu Item").click

    # 嵌套框架
    ie.frame(:name, "frame1").form(:name, 'form1')

    # 新窗口
    一些Web应用会弹出新窗口或打开一个新窗口,可以使用attach方法来访问并控制新窗口。通过标示新窗口的URL或者title来访问。
    ie2 = Watir::IE.attach(:url, 'http://www.text.com/')
    ie3 = Watir::IE.attach(:title, 'Test New Window')
    也可以使用正则表达式
    ie4 = Watir::IE.attach(:title, /Test New/)
    注意:不要把新窗口分配到你的ie变量,最好给新窗口一个不同的名字

    # 访问Table元素:
    t = $ie.table(:id,"data")
    t = Table.new($ie,:id,"data")
    t = $ie.table[1]

    # tr,td元素
    tr = ie.row(:id,"title")
    tr = TableRow.new(ie,:id,"title")

    td = ie.cell(:id,"name")
    td = TableCell.new(ie,:id,"name")

    # Watir中Table,TableBody,TableRow,TableCell这几个类,都提供了一个索引方法"[](index)"来定位其下一层的子元素对象,该方法为实例方法,"index"为传入的参数,索引值从1开始,而非从0开始。
    用法如下:
    以table的第一行,第一个元素为例:
    tr1 = t.[](1)
    td1 = tr1.[](1)
    也可以连续访问:td1 = t.[](1).[](1)
    如果td中还有其他元素,可以通过td的实例方法直接访问,以checkbox为例:
    cb = td1.checkbox(:id,'navigate_id').click

    对于以上所提到的对象,都是从Element继承而来,所以click,enabled?,exists?,fireEvent,flash,focus等方法都直接可以使用。
    如果你的td元素定位准确了,且鼠标响应事件没有错误的话,那么应该能看到点击后的效果。
    建议多查一下Watir的API Reference http://wtr.rubyforge.org/rdoc/

    代码如下:
    t = ie.table(:id,"CoolMenu2menutable")
    td_logout=t.[](1).[](16)

    先找到Table,再索引TR,再索引到TD

    # 运行Ruby时不显示browser方法
    运行Ruby程序文件时在后面加 "-b"
    ex:
    test.rb -b
    也可以做成.bat文件
    ex: test.bat
    ruby.exe test.rb -b

    # 获取隐含对象值
    <INPUT type=hidden value="您的Email" name="field1">
    方法:values = ie.hidden(:name, 'field1').value

    # 获取窗口对象
    方法1: ie2 = Watir::IE.attach(:url,'http://www.google.cn/')   #根据URL获取
    方法2: ie3 = Watir::IE.attach(:title,'Google')                #根据窗口标题获

    方法3: ie4 = Watir::IE.attach(:title, /google.cn/)              #正则表达式匹配获取

    ie.text_field 不支持中文的解决


    前几天装了ruby环境,就试着写一些脚本

    但写着写着就发现watir不支持中文

    无法使用类似

    ie.text_field(:index, 1).set "冰雨"

    这样的语句来输入中文。

    于是便开始百度gogo之旅

    我的watir是1.6.5 的版本

    上网一查,发现这个问题普遍存在,并且在网上有很多解决方法

    1.说得最多的是改原有的watir包里面的源代码

       就是对text_fields类做一些修改

       但这个方法是针对1.5以前的watir版本的,所以我用了此方法无效。

    2. 修改win32ole.rb的源代码

       这个我也试了,把所有的编码方法都用了一遍,无效。

    3.在netbeans里改编码方式

      依然无效。

    此时百度已找不到其他方法了,

    在纠结一阵子之后,突然一个想法出现了,为什么不把以上方法结合一下呢?

    在一阵子的反复尝试之下,终于解决了watir1.6.5的中文问题:(也就是结合2、3两个方法)

    1、选中某个项目,点击“右键”,点击菜单中的“属性”,

    进入属性页面,设置编码为GB2312

    2、修改D:rubylibrubygems1.8gemswatir-1.6.5libwatirwin32ole.rb 文件中的下面代码

    WIN32OLE.codepage = WIN32OLE::CP_UTF8

    修改为

    WIN32OLE.codepage =  WIN32OLE::CP_ACP

    这里是另一篇文章:

    使用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,不过借助第三方库,也能比较优美的解决。

    代码:

    require 'rubygems'
    require 'watir'

    #=begin
    ie = Watir::IE.new
    ie .goto 'http://www.cqitrk.gov.cn/query/score.jsp'
    ie.maximize()
    ie.bring_to_front()
    ie.select_list(:name,"year").select_value('2010年上半年')
    ie.select_list(:name,"level").select('系统分析师')
    #=end

    text = "王超"
    ie.text_field(:name, "name").set(text)

    10.upto(99) do |t|
        ie.text_field(:name, "zkzhm").set("010250#{t}0007")
        ie.button(:name, "Submit").click
        if !ie.contains_text("无相关信息!")
            exit
        else
            ie.back
        end

        p "010250#{t}0007"
    end

    #ie.link(:href,/Login/).click

  • 相关阅读:
    nsis打包
    学习记录:ST表
    学习记录:快速幂
    学习记录:哈夫曼树
    学习记录:二叉树
    学习记录:康托展开 与 逆康托展开
    堆排序简介
    动态规划水题集
    lower_bound( ) 与 upper_bound( )
    琐碎的一点技巧
  • 原文地址:https://www.cnblogs.com/TLightSky/p/2941436.html
Copyright © 2011-2022 走看看