Selenium-webdriver—如何定位测试元素

测试对象定位一般都是各种web自动化测试框架或工具的核心内容。
selenium-Webdriver的对象定位方法非常的丰富和强大。一般来说强大的对象定位都会提供如下的一些方法。
单个对象的定位方法
多个对象的定位方法
层级定位
selenium-Webdriver很好的支持了上述的3种定位方式。
定位单个对象
在定位单个对象时,selenium-Webdriver支持使用如下的一些属性对元素进行定位。


:class => 'class name',
:class_name => 'class name',
:css => 'css selector',
:id => 'id',
:link => 'link text',
:link_text => 'link text',
:name => 'name',
:partial_link_text=> 'partial link text',
:tag_name => 'tag name',
: xpath => 'xpath',
使用class或class_name进行定位
当所定位的对象具有class属性的时候我们可以通过class或class_name来定位该对象。
下面的例子定位了soso首页上class为"new"的span。


require'rubygems'
require'selenium-webdriver'
require'pp'

url = %q{http://www.soso.com/}

dr = Selenium::WebDriver.for:ie
dr.navigate.to url
sleep1

new_icon = dr.find_element(:class=> 'ico_new')
puts new_icon.tag_name # ---> span
使用id属性定位
soso首页的搜索输入框的html代码如下:

<input type="text"name="w"smartpid="sb.idx"smartch="sb.c.idx"autocomplete="off"id="s_input"value="">
在进行定位前我们先动态定义highlight方法,该方法的作用是高亮显示有id属性的页面元素。
随后的代码演示了如何使用id属性来定位soso首页上的搜索输入框。
?


require'rubygems'
require'selenium-webdriver'
require'pp'

Selenium::WebDriver::Element.module_evaldo
defhighlight
e_id = self.attribute('id')
puts"#{e_id} = e_id"
js = <<JS
document.getElementById("#{e_id}").style.border = "3px solid red"
JS
@bridge.executeScript(js)ife_id
end
end

url = %q{http://www.soso.com/}

dr = Selenium::WebDriver.for:ie
dr.navigate.to url
sleep1

s_input = dr.find_element(:id=> 's_input')
# 或者使用语法糖衣
# s_input = dr['s_input']
s_input.highlight
当使用id定位到正确的元素后,highlight方法会将该元素以红色高亮显示,借此也可以验证代码是否工作正常。
使用name属性定位
soso首页的搜索输入框的html代码如下:


<input type="text"name="w"smartpid="sb.idx"smartch="sb.c.idx"autocomplete="off"id="s_input"value="">

# 同样定位soso首页的搜索框
s_input = dr.find_element(:name=> 'w')
使用css属性定位
soso首页的搜索输入框的html代码如下:
?
1
<input type="text"name="w"smartpid="sb.idx"smartch="sb.c.idx"autocomplete="off"id="s_input"value="">
官方文档上说Selenium-WebDriver支持css3语法,这对使用jquery的同学来说无疑是一个好消息。
?


# css属性定位soso首页搜索框
s_input = dr.find_element(:css=> '#s_input')
使用xpath定位
soso首页的搜索输入框的html代码如下:
?


<input type="text"name="w"smartpid="sb.idx"smartch="sb.c.idx"autocomplete="off"id="s_input"value="">

# 使用xpath定位soso首页搜索框
s_input = dr.find_element(:xpath=> %Q{//input[@id='s_input'and @name='w']})
使用其他方式定位
在定位link对象的时候,可以使用link和link_text属性;
另外还可以使用tag_name属性定位任意元素;
定位多个元素
find_elements方法可以定位一组对象,例如
?


3
# 定位页面上所有的link对象
all_links = driver.find_elements(:tag_name,'a')
all_links.eachdo {|l| puts l.class}# ---> Selenium::WebDriver::Element
上面的代码返回页面上所有link对象的数组
下面代码演示了如何选取页面上所有的button对象:
?


all_buttons = driver.find_elements(:tag_name,'input').selectdo|i|
i['type'] == 'button'
end
层级定位
层级定位的思想是先定位父对象,然后再从父对象中精确定位出其我们需要选取的后代元素。
层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
下面的代码演示了如何使用层级定位选取id为bm的div下所有的link元素,并打印出所有其href
?


4
links = dr.find_element(:id,'bm').find_elements(:css=> 'a')
links.eachdo |l|
puts l['href']
end
http://www.cnblogs.com/nbkhic/archive/2011/10/22/2221496.html

你可能感兴趣的:(webdriver)