一.什么是XPath ? XPath是在xml文档中查找信息的语言,可用来在xml文档中对元素和属性进行遍历。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。Watir对xpath的支持提供给测试人员一种识别页面元素更为有效的解决方案, xpath是较多document对象所支持的识别属性。从原理上说,是把页面HTML转化成为XHTML,然后REXML来解析他,达到使用xpath表达式语言在文档结构中做查询定位的目的。并且,xpath可以操作html中的扩展tag,或者Watir不支持的tag操作等。Xpath的运用使得Watir自动化脚本更易于维护。 二.xpath常用路径表达式如下: // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 .. 选取当前节点的父节点 . 选取当前节点 @ 指定属性 三.简单语法介绍 1.页面代码如: <area shape="poly" coords="182,32,188,43,190,56,150,56,150,56" href="PieChart.html?category=Critical&pieIndex=0"> Watir语法: ie.element_by_xpath("//area[contains(@href ,'PieChart.html')]/").click 2.页面代码如: <td><img src="3.jpg">Third Image</td> Watir语法: ie.cell(:xpath, "//img[@src='3.jpg']/").click() 3.页面代码如: <select foo="bar"> <option value="1">1< /option> < /select> Watir语法: element = browser.select(:xpath, "//select[@foo='bar']") 4.页面代码如: <a href="test.htm">click me</a> Watir语法: ie.link(:xpath,"//a[@href='test.htm']/").clink 四.实际应用举例:相关的xml代码获取,请对照代码用火狐浏览器直接打开论坛http://www.jointest.org 相关页面,右键‘查看元素’即可。
- require 'rubygems'
- require 'watir'
- require 'test/unit'
- require 'watir/windowhelper'
- require 'win32ole'
- #当前所有ruby class文件编码格式选GB2312
- WIN32OLE.codepage = WIN32OLE::CP_ACP
- class XPath_Watir_Test < Test::Unit::TestCase
-
- #关闭当前打开的所有IE
- #方法调用举例:test_11_close_allie(1,10)
- def test_11_close_allie(i,j)
- for i in i..j
- Watir::IE.each do |ie|
- ie.close
- end
- i=i+1
- end
- end
-
- #写一个登录用的公用方法
- def test_12_loginplan_jointest(username,password)
- #调关闭IE的方法
- test_11_close_allie(1,5)
-
- #打开自动化测试论坛首页
- ie=Watir::IE.start("http://www.jointest.org/")
- #最大化当前IE
- ie.maximize
- #断言当前页面的title是否是 自动化测试论坛 - JoinTest - Powered by Discuz!
- assert_equal(ie.title,"自动化测试论坛 - JoinTest - Powered by Discuz!")
-
- #判断打开页面是否已经有用户登陆,如果有点击退出按钮,退出登录。
- if ie.contains_text("退出")
- ie.link(:text,"退出").click
- #等待5秒钟,从退出页面跳转到登陆页面
- sleep 5
- end
-
- #控制已经打开的指定窗口
- ie1 = Watir::IE.attach(:url, 'http://www.jointest.org/forum.php')
- #输入账号密码登陆jointest
- #ie1.text_field(:id,"ls_username").set(username)
- #ie1.text_field(:id,"ls_password").set(password)
- #ie1.button(:class,"pn vm").click
- #为演示XPath 下面采用XPath写用例脚本
- ie1.text_field(:xpath,"//input[@id='ls_username' and @class='px vm xg1' and @name='username']/").set(username)
- ie1.text_field(:xpath,"//input[@id='ls_password' and @class='px vm' and @name='password']/").set(password)
- ie1.button(:xpath,"//button[@class='pn vm']").click
- #等待2秒钟
- sleep 2
- #用断言检查登陆是否成功
- assert(ie1.text.include?("退出"))
- assert(ie1.link(:xpath,"//a[@href='http://www.jointest.org/home.php?mod=space&do=friend']/").exists?)
- assert(ie1.link(:xpath,"//a[@href='http://www.jointest.org/home.php?mod=space&do=pm']/").exists?)
- assert(ie1.link(:xpath,"//a[@href='http://www.jointest.org/home.php?mod=space&do=notice']/").exists?)
- puts "亲,欢迎登陆自动化测试论坛哦!赶快开始你的自动化测试之旅吧!"
-
- #开始论坛新手上路之旅
- ie1.link(:xpath,"//a[@href='http://www.jointest.org/forum.php?mod=forumdisplay&fid=64']").click
- ie1.link(:xpath,"//a[@class='xst' and @οnclick='atarget(this)' and @href='http://www.jointest.org/forum.php?mod=viewthread&tid=5&extra=page%3D1']").click
- puts "感谢阅读'致广大自动化测试爱好者'"
- end
-
- #调用登陆方法登陆jointest,输入你自己的账号密码
- def test_13_login_jointest
- username = ("这里输入你的账号")
- password = ("这里输入你的密码")
- test_12_loginplan_jointest(username,password)
- end
-
- end
复制代码
五.附表一:Watir识别HTML元素的方法,地址:http://wiki.openqa.org/display/WTR/Ways+Available+To+Identify+HTML+Element
How? | HTML源码 | Watir代码 | 说明 | :action | <form action=”page.htm”> | ie.form(:action, /page/).click | 只可用于form元素, 通过指定form提交的url来识别 | :after? | <a>one</a> <a>two</a> <a>one</a> | ie.link(:after?, ie.link(:text, “two”)).click | 定位到指定元素之后的页面控件 | :class | <a> | ie.link(:class, “header”).click | 当元素有class属性时可以使用其进行定位、识别 | :for | <label for=”header”> | ie.label(:for, “header”).click | 只可用于定位label元素 | :href | <a href=”page.htm”> | ie.link(:href, /page/).click | 可使用href属性定位超链接 | :id | <a> | ie.link(:id, “header”).click | 用于通过id识别控件,由于xhtml说明中定义了id唯一,推荐使用这种最为可靠的识别方式 | :index | <button> | ie.button(:index, 1).click | 用于定位页面指定类别第N个元素。目前的Watir版本中从index为1开始计数,但以后可能会从0开始计数。 | :method | <form method=”get”> | ie.form(:method, “get”).click | 仅可用于定位form元素,form的method属性值可以是get或post | :name | <a> | ie.link(:name, “header”).click | 用于通过name属性识别元素,对于之前版本的HTML比较有用,但对于XHTML来说识别度较低。 | :src | <img src=”photo.png”> | ie.image(:src, /photo/).click | 当需要通过URL来识别一个图片元素时使用 | :text | <a>click me</a> | ie.link(:text, “click me”).click | 可用于识别包含文本的页面元素,如link,span,div等 | :title | <a title=”header”> | ie.link(:title, “header”).click | 识别含有title属性的元素 | :value | <input value=”text”> | ie.text_field(:value, “text”).click | 用于识别含有默认值的text field元素或button元素 | :url | <a href=”page.htm”> | ie.link(:url, /page/).click | url属性和href属性相同 | xpath | <a href=”page.htm”> | ie.link(:xpath,”//a[@href='page.htm']“).click | 使用xpath定位元素 | multiple attribute | <a>click me</a> <a>click me</a> | ie.link(:text => “click me”, :index => 2).click | 可以使用多个属性联合定位识别,如本例所示,将点击文本为”click me”的第二个链接 | 附表二:识别元素所支持的方法,地址: http://wiki.openqa.org/display/WTR/HTML+Elements+Supported+by+Watir 更多资料请访问以下地址: http://wiki.openqa.org/display/WTR/Tutorial http://www.w3school.com.cn/xpath/xpath_syntax.asp |