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