qtp 对象识别 原理 详解

上一篇 / 下一篇  2011-06-30 15:59:55

好长时间没有用qtp了,本来以前用的时候就对它是一知半解,所以这次在来用,就感觉有很多东西都记不起来了。所以决定它这次整理出来的东西都记录下来,方便加深和巩固,要是不解的地方,还可以相互讨论下


首先说下,qtp对象 识别中的两个很重要的对象:
运行对象 RO (Runtime Object)既是被测试软件的实际对象,若被测软件是网页的话,这里的对象一般就是dom对象了
测试对象 TO(test object)是qtp对实际对象属性封装后的对象,是对象仓库(object repository)里面的对象,也是 对象识别(object identification)中的类型实例化后的对象


qtp 对象仓库里面保存的是TO,那么qtp录制是怎么把运行对象RO的属性保存在测试对象TO中,以及在运行的时候是怎么样通过测试对象TO对操作运行对象RO呢


这就需要通过对象识别机制来完成其中的工作

对象识别(Object Identification)有四种模式:
1:强制属性识别(mandatory properties)
2:辅助属性识别(assistive properties)
3:智能识别(Smart Identification)
4:顺序标识符(ordinal identifier)
经过验证,识别顺序如下:
mandatory properties->assistive properties -->Smart Identification ->ordinal identifier
验证步骤如下:

1:mandatory properties
当qtp录制是,会通过Object Identification 去识别在页面上面操作的对象类型是不是Object Identification里面的类型,如(webedit,webbutton....),如果是的,则直接把对象添加到qtp的对象库中,并且直接记住该对象的强制属性,然后与页面上面的其他标签对象做比较,如果能够唯一识别被操作的对象,不记录辅助属性等
如下:
下面的被测试的网页源码:

<html>
<head>
qtp对象识别测试
</head>

<body>
<input type="text" name="username1" class="a">
<input type="password" name="username2" class="b">
</body>
</html>

对象识别(Object Identification)设置如下:

运行后,在对象仓库中,保存的属性如下

这是因为通过强制属性里面的type就可以唯一识别了

2:assistive properties

但是当我们把代码改一下呢

<html>
<head>
qtp对象识别测试
</head>

<body>
<input type="text" name="username1" class="a">
<input type="text" name="username2" class="b">
</body>
</html>

这样通过强制属性就不能识别了,所以这个时候再录制(注意再次录制 需要删除对象库里面的对象,以及视图中录制的脚本),看到这此对象库里面对象保存的属性如下:

当强制属性不能识别的时候,录制的时候就加上辅助属性。在回放的时候也是一样,想用测试对象中的强制属性与运行对象做比较,若不能唯一匹配,就再用辅助属性 去做比较

3:Smart Identification

但是当我们被测试的软件代码在录制好了后被开发人员改了呢,比如如下代码:

<html>
<head>
qtp对象识别测试
</head>

<body>
<input type="text" name="username1" class="a">
<input type="text" name="username1" class="b">
</body>
</html>

这样 在回放的时候,通过强制属性 和辅助属性 都是不能识别出实际对象的,在回放的时候,就会调用智能识别去识别了,智能识别机制主要工作于测试脚本运行时(对象允许智能识别为真),当对象库中对象通过强制属性(或辅助属性)找到被测应用程序中对应对象零个或多个时,智能识别机制将会启动。其主要原理为:先选择某个基本属性进行比较,若对象多于一个,再继续添加属性筛选;若添加的对象属性造成无对象匹配,则淘汰该属性,应用该方法直至找到唯一对象并对该对象执行操作。(若所有属性的添加或淘汰都无法识别唯一对象,QTP将应用ordinal identifier去识别对象。)

当开发代码修改后,我们就不能强制属性 和辅助属性 都是不能识别实际对象的,这个时候就会启动智能识别(前提是智能识别设置为可用)从上面的代码可以看出识别的关键在class,所以我们必须把智能识别中添加class的属性,

若不添加,则qtp在录制的时候,还是不能记录class的值,回放的时候还是不能识别。添加后,qtp记录下来class的属性值,回放时通过智能识别去唯一识别两个文本框

4:ordinal identifier

当时如果辅助属性还是不能识别呢,还是用上面那段代码来重新录制:

<html>
<head>
qtp对象识别测试
</head>

<body>
<input type="text" name="username1" class="a">
<input type="text" name="username1" class="b">
</body>
</html>

这个时候,录制就会启动顺序标识符(ordinal identifier), Ordinal Identifier会获取每个对象的序列值,以将它们区别开来。

由于序列值是一个相对值,任何页面的变更都有可能导致这些值发生改变,因此,只在主属性与辅助属性无法唯一识别对象的情况下,QTP才会获取该序列值。
在运行测试脚本时,如果使用对象的属性值以及Smart Identification机制都无法唯一识别应用程序中的对象,才会使用到序列值。如果QTP可以通过其它属性值对对象进行识别,则会忽略序列值。
QTP可以使用以下类型的ordinal identifiers来识别对象:
Index     表示对象在程序代码中的出现顺序,这个顺序是相对于其它具有相同属性的对象而言的。
Location  表示对象在窗口、Frame或对话框中出现的顺序,这个顺序是相对于其它具有相同属性的对象而言的。
CreationTime(仅适用于Browser对象) 表示Browser对象打开的顺序,这相顺序是相对于其它已打开的具有相同属性的对象而言的。
一般情况下,Ordinal Idenfifier类型适用于所有类。在Object Identification窗口,通过Ordial identifier下拉框,可以选择其它类型。
注:QTP在录制脚本时,如果通过主属性与辅助属性已能够唯一识别对象,则不会获取对象的ordinal identifier顺序值。你可以在脚本录制完成后,在Object Properties或Object Repository对话框中使用Add/Remove操作,手动添加顺序值。
其录制后,对象库中对象的属性如下图:
 
它会分别记住强制属性和辅助属性都相同的控件,在代码中出现的位置,0,1,2...等,然后再回放的时候,根据对应的位置来找到该控件,进行相应的操作。
 
这里有一个问题就是在回放的时候,智能识别 和顺序标识符识别 是哪个先进行识别的,我开始觉得应该是顺序标识符识别,但是在网上看见有人说是智能识别先识别,智能识别失败后,再是顺序识别。
那我们可以测试一下看是哪个先识别,上面两个对话框都有index,第一个是0,第二个是1,在上面红色框框的区域,那我们把它们的值0,1互换下,然后回放。发现两个text里面回放时设置的值还是跟录制时候设置的是一样,没有任何改变。为什么呢?因为是智能识别先起作用,它通过 class还是能够正确的识别。那接着,我们把Enable Smart Identification关闭掉,设置为如下图:
这个时候,看见回放设置的值就和录制时设置的值是互换了。因为我们把智能识别关掉了,接下来起作用的就是顺序标识符,而我们又把它们的顺序互换了,结果回放是,找到的对象也是互换的。
所以说,对象识别的顺序如下:
识别顺序如下:
mandatory properties->assistive properties -->Smart Identification ->ordinal identifier
 

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-05-26  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 13351
  • 日志数: 17
  • 建立时间: 2011-06-30
  • 更新时间: 2011-11-14

RSS订阅

Open Toolbar