发布新日志

  • watir 操作robot表格

    2009-07-20 15:58:03

    如何选中第2行(任务号=165)的check_box?

    下面是解决方案,测试通过

    def get_table(tlist,column,match_value)
      begin
        tnums=tlist.length
        for i in (1..tnums)
          tone=tlist[i]
          tone_rows=tone.row_count
          begin
            if tone_rows>=1 then
              tr=tone.[](1)
              td = tr.[](column)
              if td.innerText.match(match_value) then
                #puts "found!"
                return tone
              else
                #puts td.innerText
              end
            end
          rescue
            next
          end
        end
      end
    end

    def get_table_tr_by_match_value(table,column,match_value)
       begin
        rows = table.row_count
        for i in (1..rows)
          tr = table.[](i)
          td = tr.[](column)
          if td.innerText.match(match_value) then
            return tr   #当匹配到时,就返回tr
            break
          end
        end
      rescue
        #    capture_screen
      end
    end
     
     
    $ie=Watir::IE.new
    $ie.goto('http://172.19.65.99:9999')
    $ie.text_field(:name,"userid").set("10008")
    $ie.text_field(:name,"password").set("1111")
    $ie.button(:name,"submitb").click
    $ie.frame("leftFrame").link(:text,"执行任务").click
    $ie.frame("mainFrame").button(:name,"submitSelect").click
    puts $ie.frame("mainFrame").tables.length
    table = get_table($ie.frame("mainFrame").tables,4,"应用程序")
    tr = get_table_tr_by_match_value(table,4,"ACCOUNTING")
    tr.checkbox(:name,"h_Id").set
    exit

  • (ZT)Simple Watir/Ajax examples

    2009-07-15 23:15:19

    require 'watir'
    require 'test/unit'

    # Quick example of Ajax examples using Watir, should work with versions
    # 1.5.1.1148 and above.

    class Ajax_Example < Test::Unit::TestCase
      include Watir

      def test_scriptaculous_autocompleter
        browser = Browser.start('http://demo.script.aculo.us/ajax/autocompleter')
        browser.text_field(:id, 'contact_name').set('al')

        # need to fire a key press event after setting the text since the js is handling
        # keypress events
        browser.text_field(:id, 'contact_name').fire_event('onkeypress')  

        # the li/lis tags are available in watir 1.5.1
        wait_until {browser.div(:id, 'contact_name_auto_complete').lis.length > 0}
        puts browser.div(:id, 'contact_name_auto_complete').lis.length
        puts browser.div(:id, 'contact_name_auto_complete').li(:index, 5).text
        browser.div(:id, 'contact_name_auto_complete').li(:text, 'Alan Jochen').click
    end
    end
  • [ZT]Watir对WEB的操作

    2009-07-15 23:08:31

    与网页交互(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/)              #正则表达式匹配获取

    转自: htt p://www.javaeye.com/topic/299743

  • watir操作table

    2009-07-15 22:54:41

    有这样的表格:

    table

    这里,我们需要根据菜单名称列的文字来操作指定行的操作,如根据“ruby自动化测试菜单名称”这几个文字来操作这一行选择复选框,操作编辑功能等。

    编写ruby脚本的思路:

    1) 首先利用watir处理表格的功能,得到指定的table

    2)  其次,对这个table第几列进行循环检测,如果匹配到指定的文件,那么返回这个Table的tr对象

    3)根据这个返回的tr对象,就可以进行指定的操作了

    基础方法脚本编写:

    根据这个思路,我们设计两个方法:

    =begin
        功能描述: 得到指定的table
        参数描述: table_sym_type:属性类型;table_sym_name:属性值;
        返回类型: 返回指定的table对象
        调用方法:get_table(ie,"id","yui-dt0-bodytable")
    =end
    def get_table(ie,table_sym_type,table_sym_name)
      return ie.table(table_sym_type.to_s,table_sym_name.to_s)
    end
    =begin
        功能描述: 得到指定的table中的匹配行
        参数描述: table:指定的talbe,column:需要匹配的列,match_value:需要匹配的值
        返回类型: 返回指定的tr(行)
        调用方法: get_table_tr_by_match_value(table,3,"ruby自动化测试菜单名称")
    =end
    def get_table_tr_by_match_value(table,column,match_value)
         begin
          rows = table.row_count
          for i in (1..rows)
            tr = table.[](i)
            td = tr.[](column)
            if td.innerText.match(match_value) then
              return tr   #当匹配到时,就返回tr
              break
            end
          end
        rescue
          #    capture_screen
        end
    end

    自动化实行方法编写

    有了这些基础方法后,就可以直接使用,来实行自动化脚本了

    require ‘watir’

    ie = Watir::IE.attach(:url,/matchurl/)

    table = get_table(ie,"id","yui-dt0-bodytable")

    tr = get_table_tr_by_match_value(table,3,"ruby自动化测试菜单名称")

    tr.check_box(:name,nameValue).set

    tr.link(:text,textvalue).click

  • watir 在ROBOT中的应用

    2009-07-13 20:32:13

    下面是我写的一段ruby程序,主要用于枚举页面中的控件元素,来组装数据模板

    def show_robot(ieone)
          puts "-----------Objects in  page 1-------------"
          doc = ieone.document
          s = ""
          props=["text", "name" ,"value","href"]
          doc.all.each do |n|
              begin
                  obj_type = n.invoke("type").to_s
                  obj_opt = ""
                  if obj_type != ""
                      case  obj_type
                        when "submit"
                          obj_opt = "click"
                        when "button"
                          obj_opt = "click"
                        when "text"
                          obj_opt = "set"
                        when "select-one"
                          #puts ieone.select_list(:name, n.invoke("name")).getAllContents
                          puts "begin..."
                          #sl = n.invoke("innerText")
                          sl = ieone.select_list(:name, n.invoke("name")).getAllContents
                          sl.each do |sl_one|
                            begin
                              puts sl_one
                              puts ieone.select_list(:name,n.invoke("name")).option(:text, sl_one).value()
                            rescue
                              next
                            end
                          end
                          puts "end ..."
                        else
                          obj_opt = "oth"
                      end
                      s=s+"TAG=WEBID\t"+n.invoke("type").to_s.ljust(16) + "\t#{obj_opt}\t"
                  else
                      s=s+n.invoke("type").to_s.ljust(16)
                      #p = n.invoke(prop)
                      #       temp_var = "#{p}".to_s.ljust(printsize)
                      #continue
                  end
              rescue
                  next
              end
              props.each do |prop|
                  begin
                      p = n.invoke(prop)
                      s =s+ "\t" + "#{prop}=#{p}".to_s.ljust(18)
                  rescue
                      # this object probably doesnt have this property
                  end
              end
              s=s+"\n"
          end
          puts s+"\n\n\n"
      end 

  • watir autoit 应用

    2009-07-09 22:51:03

    下面文档,简单罗列了我在技术评估时,经过自己学习,加工整理,总结的文档。由于时间急促不可能涉及方方面面,但常用基础的可以先从下面开始着手。。。,

     

    如果期望成为autoIT高手,最好还是参看其help文档,国外有专门招聘auitit自动化,国内很少。

     

    1.     AUTOIT

    1.1.     AutoIT是什么?

    AutoIT是一款自由软件,现在最新版本是autoit v3.

    从此介绍上看,其诞生目的就是为了解决某些语言,像vbs and sendkeys,在操作windows gui时不稳定,或无法实现的技术提供解决方案。其主要功能是用来模拟键盘和鼠标来进行windows控件操作来实现操作自动化的目的。与我们要做的自动化相关,具体有如下特征,

    A,使用类basic语法脚本

    B,模拟键盘和鼠标操作

    C,与标准windows控件交互

    D,生成GUI

    E, com支持

    F,正则表达式支持

    G,调用外部dllwindows api

    H,独立装载,编译,运行,可打包成可执行的exe

     

    联系我们做自动化,脱离与iedocument对象的windows对象,watir就力不从心,如:上传,下载,JS写的控件/第三方非web控件alerts window, JS pop up window,几乎所有的非web, windows弹出框都是。

     

    从了解watir底层代码,其解决windows对象识别与操作没有用其它技术,就是采用autoit

    最后,从搞自动化技术角度来看,autoit是一样非常强大的利器,不使用它非常遗憾。

    因为只要在win OS上操作,不管做web、还是windows自动化都需要它帮助,在操作的稳定性

    与可能性上autoIT提供了相对较强的解决方案。

      

    1.2. AutoIT安装与部署

     

    A,下载:

    http://www.autoitscrīpt.com/autoit3/downloads.shtml

     

    b,注册:

    先下载安装,再找到AutoItX3.dll进行手工注册一下,

    注意:watir1.5. 6在安装时,其安装目录里提供的AutoItX3.dll似乎不能正常工作

     regsvr32 D:\AutoIt3\AutoItX\AutoItX3.dll

     

    c,讨论:

    http://www.autoitscrīpt.com/forum/index.php?

     

    1.3. AutoIT SPY工具

     

    A, autoIT v3 window info工具

    非常类似QTP object spy工具,拖拽到要识别的windows control对象上,

    会立即显示Title, class, Advanced(class), ID, ClassnameNN, ControlClick Coords:  

    Text等字段。这些属性对于操作windows对象,起到很好的标识作用。供autoiT中内置方法提供操作句柄与操作引用.

     

    1.4.     AutoIT scrīpt

     

    Auto IT提供一整套的脚本语法,与程序开发规范.

    提供特定的数据类型,操作符与保留字,条件语句与函数、子程序结构。

    其采用分号;作为脚本注释。

     另外也提供基于命令行的编译与运行环境,不过可以用其自带IDE: sciTE,缺点是

    不能debug.

     

    下面的操作方法,将会在watir中比较常用到,

     

    1,MsgBox(0, "My First scrīpt!", "Hello World!")

    2,TestFunc()

    Func TestFunc()
        MsgBox(0, "My Second scrīpt!", "Hello from the functions!")
    EndFunc

     

    3,WinWaitActive ( "title", ["text"], [timeout] )/WinClose("[ACTIVE]", "")

    4,ControlSend("Untitled - Notepad", "", "Edit1", "This is some text")/

    ControlClick("My Window", "", "[ID:254]")

    5,ControlFocus "title", "text", "controlID"

     6,正则StringRegExp("test","pattern"[,flag] )

     7,Send "keys" [, flag]/Sleep delay

     

     

    1.5.     应用场景

     

    更多的example请参考:autoit3\examples\helpfile\*.*

     1,下载文件

     

    def save_file(filepath)

       ai = WIN32OLE.new("AutoItX3.Control")

       ai.WinWait("文件下载", "", 5)

       ai.ControlFocus("文件下载", "", "保存(&S)")

       sleep 1

       ai.ControlClick("文件下载", "", "保存(&S)", "left")

       ai.WinWait("另存为", "", 5)

       sleep 1

       ai.ControlSend("另存为", "", "Edit1",filepath)

       ai.ControlClick("另存为", "", "保存(&S)", "left")

       ai.WinWait("下载完毕", "", 5)

       ai.ControlClick("下载完毕", "", "关闭")

     end

    ie.span(:text, "导出Excel").click_no_wait

    save_file("C:\\abc.xls")

     

    有没有看到,每个autoit方法在call的时候都传入一些参数?

    我怎么知道的呢?都是从autoit sby工具获得的。。。

     

    2,点击弹出框

     

    def check_for_popups

       autoit = WIN32OLE.new('AutoItX3.Control')

       #

       

       # Do forever - assumes popups could occur anywhere/anytime in your application.

       loop do

           # Look for window with given title. Give up after 1 second.

           

           ret = autoit.WinWait('Microsoft Internet Explorer', '', 1)

           #ret = WinActivate("Microsoft Internet Explorer", "")

           autoit.ControlClick("Microsoft Internet Explorer", "", "[CLASS:Button; INSTANCE:1]", 2)

           #强行点击,以使其获得focus

           puts(ret)

           #

           # If window found, send appropriate keystroke (e.g. {enter}, {Y}, {N}).

           

           if (ret==1) then autoit.Send("{Enter}") end

           

           #

           # Take a rest to avoid chewing up cycles and give another thread a go.

           # Then resume the loop.

           sleep(3)

       end

     end

     

     

    ie.button(:name, "btnUpload").click_no_wait

    sleep(20)

     

    $popup = Thread.new { check_for_popups } # start popup handler

     

    at_exit { Thread.kill($popup) }

     

    还有很多例子,可以以此类推,只要第1:激活,第2步:获得焦点,第3步:就可以sendkey了。

    是不是已经搞定99.999%的问题了?

     

    注意:在watir中使用autoIT,别忘记require 'win32ole'

Open Toolbar