分类: 系统运维
2011-04-13 11:23:21
一、QTP对象识别原理
从所周知,QTP是通过将对象添加到对象库来识别运行时对象的。那么究竟它是怎么样来识别对象的呢?
在Object Identification中我们可以看到对象识别时四种模式:
1. 强制属性识别
可以一个或多个属性的组合,如果根据此级别识别了对象,则退出识别流程。
如果根据对象库的属性值与运行时不匹配,则报错(无法找到对象)。
如果属性在当前Application中有多个对象匹配,则使用辅助属性识别模式。
2. 辅助属性识别
辅助属性识别是对强制属性识别的一个补充,当强制属性识别识别时匹配多个对象,就根据辅助属性识别设置的属性及属性值来进行识别。
3. 顺序标识符
顺序标识符有两个取值:一是Location,根据控件在窗口上的Location值来进行识别,每个控件对应自己的Location值,按从上到下从左到右的顺序取值。二是Index,根据控件各自的Index值来进行识别。比如在windows中的计算器程序,它的数字按钮都被识别为WinButton类型的对象,抛开它们的text值,每个按钮都有各自的Location值和Index值。
4. 智能识别
智能识别属性可以分为基本过滤属性和可选过滤属性,它们的关系就像强制属性和辅助属性。
二、QTP对象模型
在对象库中保存的对象以树形的结构存在,如果你了解面向对象,那么就很容易理解对象的层级结构。从一个顶层的对象开始(通常是windows对象或者Dialog对象,web程序通常是Browser对象或Page对象),此对象有很多的子对象,子对象下一层又有子对象,直到最底层的对象,例如一个button。
三、QTP对象类型
曾经看到过有人问RO和TO的区别,其实我们可以从它们的写法来判断。RO是Run-time object的缩写,很明显它是运行时的对象,也就是在实际运行的Application中的对象。而TO是Test object的缩写,是测试对象,就是存在于对象库中的对象。
录制的对象就成为了TO,QTP就通过TO来操作RO,所以在TO中必须含有RO的特征才能正确识别RO。说到这,不得不提到其中的四个方法:
GetROProperty:可以取到运行时对象属性的值.
GetTOProperty:可以取到对象属性的值.
SetTOProperty:可以修改测试对象的属性值
测试对象(TO):是QTP在中创建的用于描述程序实际对象的对象.QTP存储这些信息用来在运行时识别和检查对象.简单的说,我们就可以把对象库中所保存的对象就看做为测试对象.
运行时对象(RO):是应用程序中的实际对象,对象的方法将在运行时被执行.
两者之间的关系:测试对象是为了识别运行时对象而存在的.在《QTP的录制回放过程》中,我也阐述了QTP的整个工作原理。所以这里我也就简单的再提一下。QTP在录制的时候会把所操作的对象的一组属性及属性值,保存到对象库中,就是所谓的测试对象。在回放的时候,QTP 就会根据对象库里的该对象的属性及属性值去匹配实际在应用程序中的运行时对象。一但完全匹配正确就执行相应的操作。否则就会报“找不到该对象”的错。
通过这些方法,我们可以对对象进行实时的监控,更重要的是可以在脚本回放过程动态的来修改对象的属性值。
四、对象库管理
对象的添加
1. 录制时自动添加
2. 对象库里添加
3. Active Screen添加
4. Step Generator添加
1 2 4 三种都需要Application,通过点击Application上的对象来进行添加,而3是通过Active Screen保存的快照中来点击添加,说穿了,它们都必要要有实际存在的对象才能添加。总不能无中生有,天降对象。
除此之外,QTP还能实现怎样的对象管理?
有时为了便于对象的管理,我们可能需要将不同的Action中的对象进行统一管理。这时候我们就可以将每个Action的对象导出到本地,然后比较和合并,进而做一些参数化的设置,最后进行对Action的映射。
五、描述性编程
在前面谈到的都是录制回放,必须要通过对象库中对象来识别RO时的对象,当Test工程比较大的时候,对于大量的对象管理也是一件比较费力的事。QTP提供了另外的一种机制,那就是描述性编程。意义在于通过录制下来的测试对象在回放时可能存在比较多的问题,不能回放,使用描述性编程将会灵活的操作对象。描述性编程可以分为行描述性编程和对象级描述性编程。以下代码来显示两者的区别:
1.行描述性编程
对象类型(“属性1:=属性值”,“属性2=属性值”)
注意:只需指出对象的类型,而不必指定是哪个对象,具体的哪个对象通过属性来识别。
2.对象创建方式
需要通过自己创建对象来实现,然后设置对象的N个属性值,达到识别RO的目的。
MyObj(“属性名”).value=“属性值”
Option explicit
Dim objWin,objBut
SystemUtil.Run "C:\WINDOWS\system32\calc.exe","","C:\WINDOWS\system32","open"
Set bjWin=description.Create()
Set bjBut=description.Create()
objWin("regexpwndtitle").value ="计算器"
objBut("text").value="1"
objBut("nativeclass").value="Button"
Window(objWin).WinButton(objBut).Click
objBut("text").value="\+"
Window(objWin).WinButton(objBut).Click
objBut("text").value="2"
Window(objWin).WinButton(objBut).Click
objBut("text").value="="
Window(objWin).WinButton(objBut).Click
Window(objWin).Close
Set bjBut=nothing
Set bjWin=nothing
SystemUtil.Run "C:\WINDOWS\system32\calc.exe","","C:\WINDOWS\system32","open"
with Window("regexpwndtitle:=计算器","regexpwndclass:=SciCalc")
.WinButton("text:=1","nativeclass:=Button").Click
.WinButton("text:=\+","nativeclass:=Button").Click
.WinButton("text:=2","nativeclass:=Button").Click
.WinButton("text:=\=","nativeclass:=Button").Click
.WinButton("text:=C","nativeclass:=Button").Click
.Close
end with