-
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
enddef 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
有这样的表格:
这里,我们需要根据菜单名称列的文字来操作指定行的操作,如根据“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,调用外部dll和windows api
H,独立装载,编译,运行,可打包成可执行的exe
联系我们做自动化,脱离与ie中document对象的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!")
EndFunc3,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'