不谋万世者,不足谋一时;不谋全局者,不足谋一域。君子敏于事而慎于言 新浪微薄:土司阿哈

QTP识别和操作对象的原理(转载)

上一篇 / 下一篇  2008-04-07 21:00:48

Y r(H/M8?c0一.QTP识别对象的原理

]^Ho(v1[I_#P0

,D"_ybK B^0QTP要求先在仓库文件里定义仓库对象,里面存有实际对象的特征属性的值,
4oBwnyE"xpi0运行的时候,QTP会根据仓库对象的特征属性描述,寻找到实际对象,然后操作实际对象。

7Mk!F4J A/W0

,_9N+l'nCo2] G0仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在编写时进行修改,51Testing软件测试网@Ri ?6iZx"b C7Sc
也可以在运行过程中进行动态修改,以匹配实际对象。51Testing软件测试网L+cLyM1J$e+u;K

51Testing软件测试网*g yIu#x

相关的几个函数有:51Testing软件测试网5]EMVb1VE

51Testing软件测试网#}tYR0x

GetTOProperty():取得仓库对象的某个属性的值
A tJ`!GY Xy'V3K0GetTOProperties():取得仓库对象的所有属性的值51Testing软件测试网] O4h2D^
SetTOProperty():设置仓库对象的某个属性的值

rw}!e:F8xY;a051Testing软件测试网!M&x;m G'JaW\

GetROProperty():取得实际对象的某个属性的值

:BI6DE ~051Testing软件测试网Apy@(caH G0PK

51Testing软件测试网3Se*cK$E#fR
理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO

ZV*E+q/j'M u }L-v+c0

%ts+Rv(g2D(V(}g0比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。
ld6J+Yzt;cN8w0记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。
9n;~-A{4ucG0我们要对每条记录进行检查,也就是要点击每个Check按钮。
w.FyqP B F0但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。51Testing软件测试网["R*yn+Y {Q&nXD%|s

51Testing软件测试网m-V!]&f*o

那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
}$LA!kwt3d0然后用下面的脚本,就可以完成测试

c&@u ^m,i7t051Testing软件测试网 AvM*ve z

buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
4i d6Voo(z0For buttonIndex = 0 to buttonNum - 1
/P5C yIKT]*k0  JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)51Testing软件测试网*k@a c \/oB(?KDF
  JavaWindow("Test").JavaButton("Check").Click51Testing软件测试网W B&kTN&}
Next

!o5_ [2b(O]D@0

(I7o*~GC1|y;M7i!A:]1\051Testing软件测试网 fRbds6S4u
或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去51Testing软件测试网-h u N(Ah q[E
我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试51Testing软件测试网1[:p}v,s/F}:h

51Testing软件测试网T'_?U;G n(Ij

JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")51Testing软件测试网BFG*U3[Nd
JavaWindow("Test").JavaButton("AnyButton").Click

+e6[M+e.z$sa0

}4uId+M-W1B0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")
)]n2g*G&vC0JavaWindow("Test").JavaButton("AnyButton").Click

/_rX'Z6T hl`051Testing软件测试网 O)^RRd]F;R

JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")
;I'b5c e,A3u z3|0JavaWindow("Test").JavaButton("AnyButton").Click51Testing软件测试网bk.~tV g:M&BZv

Ce8NlULoK9c6m0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")
%I {&J@u[LwZ0JavaWindow("Test").JavaButton("AnyButton").Click

4d~9mf;^,aM051Testing软件测试网:a'I8FJrH


0Av/gP-~6M%F5GI0另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象

)Op.H%A M%Qbc0

!l4j2j@VV P0如上面两个任务,可以如下实现

V D3I\Cyi\4v3t0

z*^\/LNh01. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试51Testing软件测试网X^@V;]`:o"Y;Z

jbU;eL(Oy&x0buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))51Testing软件测试网x4br1cV+B
For buttonIndex = 0 to buttonNum - 151Testing软件测试网l8N,m"h Z
  JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click51Testing软件测试网)b3[`p$T z { f
Next51Testing软件测试网'Z]4svI6w3v(f8e"X

51Testing软件测试网N,IXM;O*K9fC

2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试51Testing软件测试网1{X%Ut$RSz

}h.R Wte(r+wm0JavaWindow("Test").JavaButton("label:=New").Click
$jBJU^r'n0JavaWindow("Test").JavaButton("label:=Modify").Click
Fy |"l DV6I0JavaWindow("Test").JavaButton("label:=Delete").Click
%kp2Vt `i:\0JavaWindow("Test").JavaButton("label:=Check").Click

.\!I^MBORg0

1m)L"l/D(Mdpm0二.操作对象的原理51Testing软件测试网3}Y;cM%?/rx?e

e@)N$p-x3e7j7A2e0QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。
k(B_` vv0P,Fu]0对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
][s'E3pB!IFw0对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。51Testing软件测试网t6D u b&iM3`o

8@#a#W!O+ckv @$W051Testing软件测试网PJq'Qw%h.t
两种接口的脚本书写格式的差别在于:
U8w$y~od0  自身接口需要在对象名后面加object再加属性名或方法名,
5x ov(sE?_~,l r0  封装接口就不用在对象名后面加object。51Testing软件测试网"~X7l4Ejt)h

51Testing软件测试网j)R$t1T%p2R!V q4B

比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:51Testing软件测试网&RD,bLgL
  设置JavaEdit的内容:51Testing软件测试网VWL ~(EJ
     JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"51Testing软件测试网 n}B#h_])h$~\
  读取JavaEdit的内容:
cUnw7n0c0     msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")

6h7Z8Kv/S^051Testing软件测试网PW YY8ep^8m#n

如果通过JavaEdit的自身接口,脚本如下:
ay"Sp'Y0d n kT0  设置JavaEdit的内容:51Testing软件测试网v vo{])tH1Y
     JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")
'|-CTa'|2wMQ0  读取JavaEdit的内容:
4Mg-v%sahsonu0     Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()51Testing软件测试网6Bx^$s(L$iy3L

h6nw6Ow p2}-j{0QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。51Testing软件测试网j5pMI%I E1?7[Dw0q7W
QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。
@Ga go8@0JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

x.U5a1S/]1^la1t0

[lM F*~$Qz(^)B0对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。51Testing软件测试网6Vm8O;m!g;P1a+[
但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。51Testing软件测试网'M[ Ir j,{
所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
qGu Zz?#zt g0不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。51Testing软件测试网(vq0vb!s r
封装接口有相应功能的话,就尽量用封装接口吧!51Testing软件测试网@W;v)p0@?w/}

51Testing软件测试网e cxj)P+^

51Testing软件测试网-g#EeYM;E+A
理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。51Testing软件测试网7I PMm(t9lIo w

\6A-_Sv$K L0但是我们怎么知道对象都有哪些封装接口和自身接口呢?
Tm/z5p-t(J z1dj$C0其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
-\ A,bbv#kaD0窗口中间有选择栏让你选择Run-time Object或者Test Object,51Testing软件测试网6Kr8W W!{k%o
当你选择Run-time Object时,它显示的就是对象的自身接口(自身的属性和方法)51Testing软件测试网-M8W _ R*Q*Ub
当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)51Testing软件测试网#Zr7ZoU.is.n


TAG:

 

评分:0

我来说两句

Open Toolbar