致力于测试团队建设和自动化测试开发,欢迎有兴趣者一起研究讨论

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

上一篇 / 下一篇  2008-05-21 17:41:00 / 个人分类:QTP

呵呵,这个文章本来是在给别人的帖《GetROProperty,GetTOProperties,GetTOProperty的区别 》回复时写的,没有独立出来。
~|3Fq8f^t8D0http://bbs.51testing.com/viewthread.php?tid=13554&page=1#pid369327
ztK)s(K\:Jo3g{K W0写完后,在网上被多处转载。没想到今天又被转贴回51testing来了。51Testing软件测试网+? QeD$Wz

,yf\ h_:J"e1MG-{,g0虽然在精华版里,也赚了几朵花,但没独立总是不方便。所以修整了一下,独立成帖,以方便大家阅读。51Testing软件测试网+jI"] C`0fp
欢迎大家拍砖!(当然更欢迎大家送花sdlkfj5)
,D"qt%cV0
2l@U v C~!q5}051Testing软件测试网-El+r`4z&z| k
一、QTP识别对象的原理(by yabest,http://www.yabest.net51Testing软件测试网z-CC v)D_1w[,h7r

mig3Ivh7J6h.F0QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。
l3~+h$HWY3^0这两个概念从字面上不大好理解,也容易混淆。
$w^T ]1b0但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。51Testing软件测试网)y@2@2X t
51Testing软件测试网j x M-^u _8]'k/e
QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。
;@Gf(Nc,l+j0然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,51Testing软件测试网 tnn0X(uH#WB
接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。51Testing软件测试网;|(kH9`,ZyL

`+Pp pN6fx1H-g m0仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改,
g0ma)K:b-^)n0也可以在运行过程中进行动态修改,以匹配实际对象。51Testing软件测试网;B!t%?!~%L
51Testing软件测试网 E2N9i q.D c8df#y
和TO、RO相关的几个函数有:
| n]x~M|051Testing软件测试网7zv2]H"c }
GetTOProperty():取得仓库对象的某个属性的值51Testing软件测试网@QtvXC
GetTOProperties():取得仓库对象的所有属性的值51Testing软件测试网%UW+q[C|6u.?Ni
SetTOProperty():设置仓库对象的某个属性的值
8{Yar1o8k051Testing软件测试网P5L#Zm!HDb'~Bws*q
GetROProperty():取得实际对象的某个属性的值
7V+t6T UG*Q'~-{ B051Testing软件测试网+QF2yj,bQUiUI:S q
51Testing软件测试网uJ[rLiW z
理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO
6YcrW#U8p0
,{!L Q FD0比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。51Testing软件测试网.z4L1P"I/ky7K0@&sK
记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。51Testing软件测试网'Y lY,|%O6a}/k
我们要对每条记录进行检查,也就是要点击每个Check按钮。
a6\~A;hS0但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。51Testing软件测试网-o?hT} O&X
51Testing软件测试网:G6` \Z2H3V'{s1f
那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
R:dyw4\0然后用下面的脚本,就可以完成测试51Testing软件测试网,P"KA9n ]XK.Ir
51Testing软件测试网:@+W%U o*zzU
buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
Y Rhl ]x0For buttonIndex = 0 to buttonNum - 151Testing软件测试网t J)v*t rd*q9zG
  JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)
;g[(fi Z-C af;M1x0  JavaWindow("Test").JavaButton("Check").Click51Testing软件测试网$A _3D$q9B}
Next51Testing软件测试网c4}i8[$X%g1k1C

!F)h*r*DG r4E8Y8j1n051Testing软件测试网+h(dt/F_0D\+l-Dc
或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去51Testing软件测试网zc;r]~(t5[9g$q
我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试51Testing软件测试网vc N2F"u

Fy'~lf y0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")51Testing软件测试网%Yl c}P0n2n
JavaWindow("Test").JavaButton("AnyButton").Click51Testing软件测试网yvc7O~1B N

B:iHD/j*|P0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")51Testing软件测试网9ck8?-wE;Zig+[
JavaWindow("Test").JavaButton("AnyButton").Click
dg4k2xl#G*cy0
Kc?NF}-g#Mw0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")51Testing软件测试网9b K'xV5p,B*FF
JavaWindow("Test").JavaButton("AnyButton").Click51Testing软件测试网3ofi(]fmEg8@H

H*KF-^;o$v9C0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")51Testing软件测试网#l.rFO.zZR FT
JavaWindow("Test").JavaButton("AnyButton").Click
JI+v(}&V#b?N051Testing软件测试网Z#Gi/l#X
另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象
.Br5@.g,p@4Y e(Y0( Written by yabest,http://www.yabest.net
`C'iL*_]eg051Testing软件测试网{hXY&esB;Rk
如上面两个任务,可以如下实现
6N0V*Y/c1C%R+w0
1P(S0NcH(p$v01. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试51Testing软件测试网PLsWcI:SO`
51Testing软件测试网5g3FGMapI"@*xj
buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
O|Sv,V$WS6X0For buttonIndex = 0 to buttonNum - 1
M V&MI'f&W0  JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click51Testing软件测试网&q|U*O t
Next51Testing软件测试网eu5[C!UIqG,N#hBt

!l#R6u tFC@-HS02. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试
_)p9su9tI(ua051Testing软件测试网!iP;u s` G VT
JavaWindow("Test").JavaButton("label:=New").Click
cR;dG%I&fp \0JavaWindow("Test").JavaButton("label:=Modify").Click
6K4`Ij ] [*{0JavaWindow("Test").JavaButton("label:=Delete").Click
!Ol Y3]n#SO ]U}L0JavaWindow("Test").JavaButton("label:=Check").Click51Testing软件测试网)`K(NJ.y,?W F
51Testing软件测试网RibJ,LX8VSOH
51Testing软件测试网E2_;RX7u
51Testing软件测试网?["Nrt9`1JO%t;l
二、QTP操作对象的原理(by yabest,http://www.yabest.net
I3M2\i7Piql+b0
@1un rqa6pV i0QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。51Testing软件测试网f!v+E8D^qH9N S1U
51Testing软件测试网&I1C(aG3X2j}/a K
对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。51Testing软件测试网:BA$u R;L[
对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。
0L~*E2g9l+j0
xy w+p3L%qa J.I0
}|t F6[~ \r0两种接口的脚本书写格式的差别在于:
n^:Ub&M_;oZ0  自身接口需要在对象名后面加object再加属性名或方法名,
/]o:IP,XF-O0  封装接口就不用在对象名后面加object。
f1J{0GJ051Testing软件测试网&y&W3y9q4bvJN
具体格式如下:
E OE'vrG!g~0  对实际对象的操作:
:OMX,Ym/n | aDy0      对象.object.自身属性
m(\d&cMDkQ0      对象.object.自身方法()51Testing软件测试网Afr JF:[#y
      对象.GetROProperty("封装属性")51Testing软件测试网!kJQ4g$QE
      对象.封装方法()
mX&@!pGK W;t051Testing软件测试网7k)^Xb^K'hK8I
  对仓库对象的操作:51Testing软件测试网k gT7U._+Q!|
      对象.GetTOProperty("封装属性")51Testing软件测试网5s h0B.bU#^;Ndi E
      对象.GetTOProperties()      ’获取所有封装属性的值
^q2i W&r:Q q%z0      对象.SetTOProperty("封装属性", "封装属性值")
y'B9?'A A&D051Testing软件测试网B7c[&`,o` y
比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:51Testing软件测试网&WCWR\un
  设置JavaEdit的内容:51Testing软件测试网"TW,AUoJe
     JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"51Testing软件测试网xx,Fj:]+R
  读取JavaEdit的内容:51Testing软件测试网1x#H&@Za
     msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")51Testing软件测试网 p-Q9r6i%V1YNI%H(W

m3s)s:\K*]o0如果通过JavaEdit的自身接口,脚本如下:
u4C`7{ QL)dY0  设置JavaEdit的内容:51Testing软件测试网b%V)i1m3s
     JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")51Testing软件测试网Tx9D6G'gR|1gacsv
  读取JavaEdit的内容:
:\j+P/qs;^H4_0     Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()51Testing软件测试网GS`COI3o

u['@,e$a{0QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。
)|6i;X*k3J ZS.x q0QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。51Testing软件测试网h?;^!S%u|+l
JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。
8Wi }/A4qY7Egj051Testing软件测试网:a v,k Q*C9?8p
对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。
E"}1G9M.C0但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。51Testing软件测试网!dc:fy/^+?
所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。51Testing软件测试网8_!ew/n)Wl
不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。51Testing软件测试网'x5h"nV \
封装接口有相应功能的话,就尽量用封装接口吧!51Testing软件测试网3h `L9f"zHx
( Written by yabest,http://www.yabest.net51Testing软件测试网!_/i+~4h1B_,KF
51Testing软件测试网j KKlh W5g
理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。
.?R-v Os@051Testing软件测试网g }9Rsg$Re
但是我们怎么知道对象都有哪些封装接口和自身接口呢?51Testing软件测试网g.u&V6NL9`8Z
其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
'_I-^.K\r0窗口中间有选择栏让你选择Run-time Object或者Test Object,
JoJ+e I8f0当你选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)
7_)w,N%\\(o3p0当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)51Testing软件测试网gH4b h'v

pq"b }B0S6Y-p&]6O0(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,51Testing软件测试网)TL,_V"q7j k
            两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。51Testing软件测试网b |d0_+aBW)og
            不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
cZd\N!Q0            QTP里的Test Object/Run-time Object的概念太容易让人混淆了!51Testing软件测试网5y]F G;k
            它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。
~{[8Ar:G'B051Testing软件测试网5C)Nb.W RI

L~MH&j$f(|;z0
M-S9@%N0{3sWO s0明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!
*r-ryTx$V)ZdrK051Testing软件测试网4}l3{t#CiHjnr
比如执行51Testing软件测试网eO@7?*^uP-?
  JavaDialog("Add NE").JavaEdit("NE Name").object.setVisible(false)51Testing软件测试网 S.U6mj%Y;Dp ?
哈哈,你的JavaEdit对象就当场消失不见了!!!
3X2r*wK6j0
ng'?,Fg$p e2q0你可以拿这个做恶作剧,指着这个窗口逼问开发人员,JavaEdit对象哪去了?51Testing软件测试网+LQ EUe"b]D
开发人员肯定瞪大眼睛看着这个窗口,当场翘掉!!!

TAG: QTP

 

评分:0

我来说两句

日历

« 2024-05-04  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 91178
  • 日志数: 79
  • 图片数: 1
  • 建立时间: 2008-05-18
  • 更新时间: 2009-06-04

RSS订阅

Open Toolbar