少欲无为,身心自在。得失从缘,心无增减。

Selenium UI Element学习笔记(三)

上一篇 / 下一篇  2009-09-18 14:41:36 / 个人分类:Selenium

Selenium UI Element高级应用篇

     这次是高级应用篇了,读完这些,我发现利用UI Element能帮我处理掉大部分的对象识别问
题了,这里将映射技术发挥得淋漓尽致。TestCompelte中的别名映射机制与它相比...唉,真是不
好比啊~

    Testcases

     这里的testcase是用来验证Selenium能正确地按照Locator设置的路径来识别对象的。
Selenium会统计失败的测试用例的情况。编写这样的测试用例的另一个目的则是可以直观地表现
最终可能出现的对象路径。
     一个Testcases会是这样编写的
testcase1: {
args: { line: 2, column: 3 }
, xhtml: '<table id="scorecard">'
+ '<tr class="line" />'
+ '<tr class="line"><td /><td /><td expected-
result="1" /></tr>'
+ '</table>'
}

解析:
一个testcase对象中有两个必要的属性,args(数组对象)和xhtml(String)。
agrs属性的对象会被传递给UI Element的getLocator函数。它用来生成test locator,
这个locator由xhtml语句描述。若这个Locator返回了期望的值,那么这个测试就被认为
是通过的。xhtml属性必须用xhuml语言描述,不需要<html>标签,这会自动加上。这么做
是为了能让Firfox的XML解析器正确解读。不幸地是不能生成HTML文档,只能生成XML文档。
这就要求区分大小写,即所有的tag名都必须小写。


模糊匹配

实际的网页中,往往会看到这样的代码结构

<table>
<tr nclick="showDetails(0)">
<td>Brahms</td>
<td>Viola Quintet</td>
</tr>
<tr nclick="showDetails(1)">
<td>Saegusa</td>
<td>Cello 88</td>
</tr>
</table>

想象一下,我在录制脚本。我想点击Cello 88这个按钮。IDE会为我创建这样一个Locator
://table/tr[2]/td[2]。这是否就意味这我的getLocator函数就会返回一个同样的
Xpath吗?显然不是。点击这个表格的第二行中的人一个按钮都是同样的结果。我的UI
Element的XPath很可能是
这样的:
//table/tr[2]。在录制的时候,作为点击动作的页面对象在层级结构的上一层
(即TD标签而不是TR),这就不能和我的UI Elment Xpath匹配了。那么该怎么解决这个问
题呢?

Fuzzy matching!
什么是Fuzzy Matching?
它是一个函数,若一个Dom Elemnt目标可以被认为相当于另一个DOM Element的参照物(
由Xpath生成)时,此函数返回True。一般而言,它的匹配规则是这样的:
  • 有多个相同的element
  • 参考element是唯一的,而目标element是它的后代
  • 参考element有一个onclik属性,而目标element是它的后代 
这样的逻辑或许不一定适合你。幸运地是你可以修改它,在ui element.js文件中,
你可以查看一下BrowserBot.prototype.locateElementByUIElement
.is_fuzzy_match的定义。

辅助定位器()

辅助定位器是一种附加在UI Special String后面形成的一种组合定位模式。它们可以通过
IDE录制器自动生成getOffsetLocator函数。
当你需要将页面上大量的内容定义成UI
Element时,
这一特性也许非常有用,它可以用来简化代码。这种情况下,它允许你定义一个
可以包含固定的其他的要素的UI Element。来看一例子感受一下吧
假设有这样一段页面元素
<form. name="contact_info">
<input type="text" name="foo" />
<textarea name="bar"></textarea>
<input type="submit" value="baz" />
</form>


应用map时的对象引用写法如下
ui=contactPages::contact_form()->//input[@name='foo']
ui=contactPages::contact_form()->//textarea[@name='bar']
ui=contactPages::contact_form()->//input[@value='baz']


解析:
录制时,系统将采用UIElement.defaultOffsetLocatorStrategy来自动生成对象
代码。“->”符号用来界定根据何种固定要素来识别相似的Page Element。因此,这个符号
不能在主要的定位器或任何可能产生意外结果的地方中使用。需要注意的是这中定位方式只适
用于Xpath,其他定位方式以后或许也会提供相似的支持。


Rollup Rules

Rollup就是一组常用Selenium命令的组合体。UI Eleemnt的设计目标是使IDE中编写可以
简单而轻松地编写测试代码,当然它缺少一些重要的编程特性(比如IF、While、Function
)。这必然令你倾向于使用Selenium RC编写测试代码。另一种选择,就是Rollup Rule。
通过Selenium的testruuner生成的组件命令执行rollup命令会表现得像在调用函数一样
简单。这些rollup的扩展可在javascript中编写。因此,这样rule可以作为一个user
extension加入到任何一款Selenium家族产品中。尤其突出的一点是,
在理解了命令怎
样扩展成rollup和roullup rules怎样被拆解成rollup命令
后,就可以把IDE作为创建
测试用例的工具。
一个Rollup Rule会是这样一种结构

var manager = new RollupManager();
manager.addRollupRule({ ... });
manager.addRollupRule({ ... });
...
具体点就是这样的
manager.addRollupRule
(
{
name: 'do_search'
, description: 'performs a search'
, args:
 [
name: 'term'
, description: 'the search term'
]
, commandMatchers:
[
{
command: 'type'
, target: 'ui=searchPages::search_box\\(.+'
, updateArgs: function(command, args)
 {
var uiSpecifier = new UISpecifier
(command.target);

args.term = uiSpecifier.args.term;
return args;
}
}
,
{
command: 'click.+'
, target: 'ui=searchPages::search_go\\(.+'
}
]
, getExpandedCommands: function(args)
{
var commands = [];
var uiSpecifier = new UISpecifier
(
'searchPages'
, 'search_box'
, { term: args.term }
);

commands.push
(
{
command: 'type'
, target: 'ui=' + uiSpecifier.toString()
}
);

commands.push
(
{
command: 'clickAndWait'
, target: 'ui=searchPages::search_go()'
}
);

return commands;
}
}
);
解析:
     在这个例子中,Rollup Rlue被定义成用来执行搜索动作。利用CommandMatcher可
以将Rule应用到连续的命令集中。Rollup有一个参数:term。之后扩展了原始的两个命令。
值得注意的是第二个ComandMatcher匹配的是所有以Click开头的命令。这个Rollup可以
将命令扩展成clickAndWait。下表是Rollup rules对象的所有属性。
 属性名必选参数否(数据类型)含义说明
代码举例
 name Yes
  
 description Yes
  
 alternateCommand   
 pre   
 post   
 args Conditional  
 commandMatchers\
getRollup()
 Yes  
 expandedCommands\
getExpandedCommands()
 Yes  








    

TAG: Selenium

 

评分:0

我来说两句

日历

« 2024-04-17  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 14292
  • 日志数: 10
  • 图片数: 1
  • 文件数: 6
  • 建立时间: 2008-10-22
  • 更新时间: 2011-11-17

RSS订阅

Open Toolbar