本文共 3061 字,大约阅读时间需要 10 分钟。
测试对象定位一般都是各种web自动化测试框架或工具的核心内容。
selenium-Webdriver的对象定位方法非常的丰富和强大。一般来说强大的对象定位都会提供如下的一些方法。
单个对象的定位方法
多个对象的定位方法
层级定位
selenium-Webdriver很好的支持了上述的3种定位方式。
在定位单个对象时,selenium-Webdriver支持使用如下的一些属性对元素进行定位。
1 2 3 4 5 6 7 8 9 10 | :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为"userInt"的a。
require 'rubygems'
require 'selenium-webdriver' require 'pp' url = %q{http://www.soso.com/} dr = Selenium::WebDriver.for :firefox dr.navigate.to url sleep 1 find_class = dr.find_element(:class => 'userInt') puts find_class.tag_name # ---> a使用id属性定位:
soso首页的搜索输入框的html代码如下:
<input type=
"text"
name=
"w"
smartpid=
"sb.idx"
smartch=
"sb.c.idx"
autocomplete=
"off"
id=
"s_input"
value=
""
>
require 'rubygems'
require 'selenium-webdriver' Selenium::WebDriver::Element.module_eval do def highlight 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) if e_id end end url = "http://www.soso.com/" dr = Selenium::WebDriver.for :firefox dr.navigate.to url sleep 1 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代码如下:<input type=
"text"
name=
"w"
smartpid=
"sb.idx"
smartch=
"sb.c.idx"
autocomplete=
"off"
id=
"s_input"
value=
""
>
# css属性定位soso首页搜索框
s_input = dr.find_element(:css => '#s_input')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对象
all_links = driver.find_elements(
:tag_name
,
'a'
)
all_links.
each
do
{|l| puts l.
class
}
# ---> Selenium::WebDriver::Element
上面的代码返回页面上所有link对象的数组
下面代码演示了如何选取页面上所有的button对象:
all_buttons = driver.find_elements(
:tag_name
,
'input'
).select
do
|i|
i[
'type'
] ==
'button'
end
层级定位的思想是先定位父对象,然后再从父对象中精确定位出其我们需要选取的后代元素。
层级定位一般的应用场景是无法直接定位到需要选取的元素,但是其父元素比较容易定位,通过定位父元素再遍历其子元素选择需要的目标元素,或者需要定位某个元素下所有的子元素。
下面的代码演示了如何使用层级定位选取id为bm的div下所有的link元素,并打印出所有其href
1 2 3 4 | links = dr.find_element( :id , 'bm' ).find_elements( :css => 'a' ) links. each do |l| puts l[ 'href' ] end |
这一节分享了Selenium-WebDriver定位元素的一般方法,下一节将介绍Selenium-WebDriver对frame的处理
转载地址:http://awjci.baihongyu.com/