最近看到淘宝测试team的blog,发现了一篇关于Watir Xpath 的文章,相当不错,收藏起来。如下:
对于Watir操作IE浏览器,目前并没有录制工具来帮助测试人员,一般靠测试人员使用IE Developer Toolbar辅助进行元素识别,然后编写测试脚本。
在编写脚本过程中,主要通过是使用Watir::IE的一个实例化对象@ie来获得页面上的各种元素,比如button,link…然后可以对这些元素进行操作。(Watir识别HTML元素的方法详见附表一),识别元素时各不同元素支持不同的属性识别,详见附图一,这里不做赘述。
Watir::IE封装的是一个当前页面的DOM Tree,而不是页面源代码。比如页面如果用javascrīpt动态产生一个元素,在Watir中仍然可以访问。本文主要介绍通过xpath来定位并识别页面元素,达到灵活操作控件的目的。
首先简单介绍一下xpath,xpath是在xml文档中查找信息的语言,可用来在xml文档中对元素和属性进行遍历。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。Xpath的运用使得Watir自动化脚本更易于维护、更健壮。
Watir对xpath的支持提供给测试人员一种识别页面元素更为有效的解决方案,从附图一中可以看出来:xpath是较多document对象所支持的识别属性。从原理上说,是把页面HTML转化成为XHTML,然后REXML来解析他,达到使用xpath表达式语言在文档结构中做查询定位的目的。并且,xpath可以操作html中的扩展tag,或者Watir不支持的tag操作,对于Watir扩展是很有效的,这使得xpath在Watir如何运用的研究变得有那么些意义。
首先看一下xpath的简单语法以及在Watir中如何运用。
示例节选代码如下:
<div id=’firstone’><div><table border=”0″ cellpadding=”0″ cellspacing=”0″>
<tr>
<td valign=”top”>
<a title=”Furniture | Rugs, Carpets | Silver | More” href=”http://antiques.ebay.com/”>Antiques</a>
<a title=”Paintings | Posters | Prints | More” href=”http://art.ebay.com/”>Art</a>
<a title=”Drawing | Painting | Scrapbooking | Sewing | More” href=”http://crafts.ebay.com/” >Crafts</a>
<a title=”DVD | Film | Laserdisc | VHS | More” href=”http://dvd.ebay.com/” >DVDs & Movies</a>
</td>
</tr>
</table>
</div>
<div>
<input tabindex=”1″ id=”_nkw” foo=”bar”>
<select name=”_sacat” size=”1″ tabindex=”2″>
<option value=”See-All-Categories” selected=”selected”>All Categories</option>
<option value=”20081″>Antiques</option><option value=”550″>Art</option>
<option value=”2984″>Baby</option><option value=”267″>Books</option>
<option value=”625″>Cameras & Photo</option>
<option value=”15032″>Cell Phones & PDAs</option>
<option value=”11450″>Clothing, Shoes & Accessories</option>
</select>
<input type=”submit” value=”Search” tabindex=”3″/>
<object name=”obj”></object>
</div>
</div>
xpath常用路径表达式如下:
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 指定属性
示例一:使用属性定位识别元素
//div[@id=’categories’]
选取id为categories的div,返回所有符合条件节点
Watir代码:
@ie.div(:xpath,”//div[@id='categories']“)
示例二:使用tag以及数组位置定位元素
//a
返回所有a子元素,无论它们在文档中的位置
Watir代码:
@ie.link(:xpath,”//a”)
注:watir中使用该xpath自动返回元素集中的第一个元素,该代码与@ie.link(:xpath,”//a[1]”)效果相同。若需要识别其他位置元素,可使用数组方式定位识别,如:@ie.link(:xpath,”//a[2]”).click点击第二个tag为a的元素,@ie.link(:xpath,”//a[last()]”)点击最后一个tag为a的元素
示例三:使用相对路径识别元素
//a[1]/../../../../../../div[2]/input
首先找到第一个a元素,一层层定位到根节点下第二个div,再选取input节点
Watir代码:
@ie.text_field(:xpath,”//a[1]/../../../../../../div[2]/input”).set ‘test’
注:使用相对路径可以去除对id,name等属性的依赖,当页面元素缺乏类似属性来定位识别时,可以使用该方法进行控件操作
示例四:根据模糊属性定位元素
//a[contains(@href , ' crafts ')]
定位到href属性值中含有crafts的a元素
Watir代码
@ie.link(:xpath,”//a[contains(@href,'crafts')]“).click
示例五:属性不被Watir支持,但可通过xpath识别
//select[@foo='bar')]
当遇到有属性名为foo的情况,watir并不支持通过该属性来定位查询元素,但可通过xpath查询识别
Watir代码:
@ie.select_list(:xpath,”//select[@foo='bar')]“).select ‘Art’
示例五:使用element_by_xpath扩展Watir不支持的控件
Watir代码:
puts @ie.element_by_xpath(”//object”).name
注:某些页面标签并不被Watir所支持,比如object,可以通过这种方法获取元素
还有很多其他用法这里不一一举例了,有兴趣的同学可以深入研究xpath语法,并灵活运用到我们的自动化脚本中。当然在使用当中也遇到一些问题,比如在Watir中使用xpath时,中文页面似乎经常会解析出问题,具体问题还在研究当中,也希望对此有了解的同学能给些方向和建议。