功能自动化测试做的就是,找到页面的控件元素,然后操作这些控件,完成模拟人工的测试操作。所以开头肯定是要定位到页面上的元素。watir-webdriver提供了多方方法,帮助我们定位Web页面上的元素。
常用的定位方法如下:
:id => 'id', :name => 'name', :class => 'class name', :class_name => 'class name', :link => 'link text', :link_text => 'link text', :partial_link_text => 'partial link text', :xpath => 'xpath',
目前webdriver还不支持:css的方法,不过说实话这个不经常用
比方说针对下面的控件
<input type="text" class="s_ipt" maxlength="100" id="kw" name="wd" autocomplete="off">
进行ID定位,可以这样写
b.text_field(:id=>"kw").set "rex"
id一般是惟一的标示,不会有重复,所以尽量使用id来定位
还是使用这个例子
<input type="text" class="s_ipt" maxlength="100" id="kw" name="wd" autocomplete="off">
使用name定位,是这样写的
b.text_field(:name=>"wd").set "rex"
name可能会有重复,有的时候要加入:index=>1来唯一性定位
同样的例子
<input type="text" class="s_ipt" maxlength="100" id="kw" name="wd" autocomplete="off">
使用class或者class_name定位,是这样写的
b.text_field(:class=>"s_ipt").html
同样的例子
<input type="text" class="s_ipt" maxlength="100" id="kw" name="wd" autocomplete="off">
使用XPath定位,是这样写的
b.text_field(:xpath=>'//*[@id="kw"]').html
不过像我在第一篇文章中介绍的,xpath虽然可以用,不过代码会显得非常丑陋,在实际使用过程中,尽量避免使用用xpath来定位元素比较好。
在定位link对象的时候,可以使用link和link_text属性;
另外还可以使用tag_name属性定位任意元素;
在很多时候一种定位方式不能完全定位唯一元素,需要多个定位方式综合使用
比方说有两个name一模一样的控件,只能通过index来识别,如下
b.button(:name=>"a",:index=>0).click
这种写法,将定位name为a的第一个元素(这里注意:incex在watir-webdriver里是从0开始的,而在Watir里是从1开始的。)。可以说这种写法是与的关系,即name符合也要index符合。有的时候我们需要或的关系,就是如果名称或者ID只要一个相等就可以,当然你可以写XPath搞定,同时也可以利用 exists?来进行判断,不过代码看似很丑,必要的时候使用吧。
举个例子
<span id="news"> <input type="text" /> </span>
这种情况,可能在很多使用前台组件的页面中,经常碰到,如果使用上面的方法定位,你会发现没有id,没有name,整体上会有很多input,单纯用index很痛苦,这个时候用层级管理会好很多,如下
b.span(:id=>"news").text_field(:index=>0).set "rex"
使用这种方式,寻找页面控件更加稳定,效率更高,也算是一种技巧。