自动化测试旅程终于开始了!!

QTP识别和操作对象的原理[转]

上一篇 / 下一篇  2009-04-25 12:19:46 / 个人分类:QTP

一、QTP识别对象的原理(by yabest,http://www.yabest.net51Testing软件测试网:E jp4Ki { XVR
51Testing软件测试网zr N x/?&F8w!U
QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。51Testing软件测试网:c2l%j(q%G
这两个概念从字面上不大好理解,也容易混淆。
3TszA^b6J[0但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。51Testing软件测试网"|%Lg3iMcm
51Testing软件测试网!`z)d"u0h!`?4t
QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。51Testing软件测试网q'st6RR2W
然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,51Testing软件测试网 I$~ M/~b ~-g
接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。
,^ @u+^Jv _Y0
:U$USG|,z0仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改,51Testing软件测试网Mja!tJp X's
也可以在运行过程中进行动态修改,以匹配实际对象。
)id-Xr:A0
?i!d]3D%a0和TO、RO相关的几个函数有:51Testing软件测试网5s}BV#ekeH'vq
51Testing软件测试网2K.^k4x@.BC(AD3K/L
GetTOProperty():取得仓库对象的某个属性的值51Testing软件测试网As+_ I'ULA
GetTOProperties():取得仓库对象的所有属性的值51Testing软件测试网4Xu(~Am3N
SetTOProperty():设置仓库对象的某个属性的值
a%v_m g4K?;NU0
$K q%_,~0`:F&z[.E0GetROProperty():取得实际对象的某个属性的值51Testing软件测试网 {3[!X X;]

%xCcE8H0c0(注:这几个函数访问的都是对象的封装属性,不是对象的自身属性,封装属性和自身属性的区别详见后面第二章QTP操作对象的原理)
2ZY;dfH&_:hz(].V0
9U(gE&O:R"]\ ? ?bT0理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO51Testing软件测试网}c+H1j,X0aDy
51Testing软件测试网 d[2v&I)^,dfq$^
比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。51Testing软件测试网#pVM+r)FFPZ
记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。51Testing软件测试网 jj5H%['R_vX!yz
我们要对每条记录进行检查,也就是要点击每个Check按钮。
,Lk0^z j&Z u7v0但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。51Testing软件测试网|VB3DM5~$t n
51Testing软件测试网^Zf$in5M
那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0
B |yO!g Yj~x0然后用下面的脚本,就可以完成测试51Testing软件测试网:Y'x,K;M:ky0w

3T]sR-Hjs0buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))51Testing软件测试网7@/q#M[+\MU`w
For buttonIndex = 0 to buttonNum - 151Testing软件测试网2j#u4{W3|_)xH-zr@
  JavaWindow("Test").JavaButton("Check").SetTOProperty("index", buttonIndex)51Testing软件测试网jk6{6k1Z m(J%Q W!YZ
  JavaWindow("Test").JavaButton("Check").Click
+r(|t y| ^8N0Next
)U'A w*R9o g051Testing软件测试网-x"S'jfcS8x!H M
51Testing软件测试网UQ&R ZG bUJ3C(?
或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去
MfH'r{ @L0我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试
;hGcFF"w051Testing软件测试网4xPgv(CCu'x3c;x
JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "New")
r+W r-yp rg0JavaWindow("Test").JavaButton("AnyButton").Click
B8MSp6J9pj|.l0
KFVis ~0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Modify")
4o.p,K:X8UK2N3\%W0JavaWindow("Test").JavaButton("AnyButton").Click51Testing软件测试网Ny1Bq)Pw

:iOn uO(w!_0z0JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Delete")
E DLr1k vj0JavaWindow("Test").JavaButton("AnyButton").Click51Testing软件测试网 C5g.AsxC
51Testing软件测试网AH4}#[@F
JavaWindow("Test").JavaButton("AnyButton").SetTOProperty("label", "Check")
1g7^E9YUTys8dT0JavaWindow("Test").JavaButton("AnyButton").Click
hQM$JL051Testing软件测试网~#T%K:u"a3vB
另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象51Testing软件测试网L4G;[ W } Ga
( Written by yabest,http://www.yabest.net51Testing软件测试网D9y]2k4GX+j9U
51Testing软件测试网!NZw,l)N9t;z
如上面两个任务,可以如下实现51Testing软件测试网8@WAF*[O1z9x$Jz}

8~l'y2o-n:T.D{01. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试
7Am.eVD(|-MmOe0
$nT5ngIO2d4R0buttonNum = CInt(JavaWindow("Test").JavaEdit("Record Num").GetROProperty("value"))
R ~:k#^B7@'x*L0For buttonIndex = 0 to buttonNum - 151Testing软件测试网;hs4SVSA
  JavaWindow("Test").JavaButton("label:=Check", "index:="+CStr(buttonIndex)).Click
n&WG(? [x0Next51Testing软件测试网6u2b'K {iz8UF ~
51Testing软件测试网a _2r)r pv{
2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试51Testing软件测试网i\_DIz+Z#K!n.v

r0a1m:| ]o8{9po0JavaWindow("Test").JavaButton("label:=New").Click51Testing软件测试网 M)dT!eBI3a
JavaWindow("Test").JavaButton("label:=Modify").Click
FNh)XLPJY0JavaWindow("Test").JavaButton("label:=Delete").Click
U wqC|4M k pO0JavaWindow("Test").JavaButton("label:=Check").Click
*qYR0q-`wR0
!])f%P:um&N1jnM051Testing软件测试网 u!ky/@1O\,Q
51Testing软件测试网SGhz u)w Uy:j
二、QTP操作对象的原理(by yabest,http://www.yabest.net
S zO/@o&Y#^.hN0
#SD5f.^IW9xIX0QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。51Testing软件测试网La]%Pa)u[S-I
51Testing软件测试网]8_4]&S)Vy u
对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
.}"I-xuZK3TQ0对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。
a h:{ lu;ZSczFhE0
!oi```V+]VK^;{0
'?|-^S!tH3VI0Mq2O0两种接口的脚本书写格式的差别在于:51Testing软件测试网"K8p.I-{,oj
  自身接口需要在对象名后面加object再加属性名或方法名,
n/KA7?hZ0  封装接口就不用在对象名后面加object。51Testing软件测试网cX5h3c3_/f,EG${
51Testing软件测试网X`#F C/@
具体格式如下:51Testing软件测试网;GY~X)X'y DE
  对实际对象的操作:51Testing软件测试网.S7P] cR8D#y
      对象.object.自身属性
^8NMC$X"C0      对象.object.自身方法()
$`ZpD_0      对象.GetROProperty("封装属性")
v)f x{H#q0      对象.封装方法()
r D.N0nL fO0
u2\y{2CvB0  对仓库对象的操作:51Testing软件测试网r(K!WB Pwb6FA
      对象.GetTOProperty("封装属性")
Ck].~ _RA$~t2mR0      对象.GetTOProperties()      ’获取所有封装属性的值51Testing软件测试网'{'O4`m&C%Hlu SX.t
      对象.SetTOProperty("封装属性", "封装属性值")
2K(X UI^051Testing软件测试网x&p @q!uOQ)[
比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:51Testing软件测试网!K?-I'pz!L
  设置JavaEdit的内容:
ZO:@|3h3s$b I5Z,W0     JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"51Testing软件测试网0we-Xh|}
  读取JavaEdit的内容:51Testing软件测试网9CJ!K J$c*@P
     msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")
(QLJ[*m:l#zjL){051Testing软件测试网W"[xs"WQc
如果通过JavaEdit的自身接口,脚本如下:51Testing软件测试网3E@HU.]3Mp)?
  设置JavaEdit的内容:51Testing软件测试网"u P V)Z A+{vk v
     JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")51Testing软件测试网x|/JsrOSs
  读取JavaEdit的内容:
n'G2ieeBBn d0     Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()
:C]h Xq0
Q_fdGL K$RX_0QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。51Testing软件测试网3`(Q5w4m!_)d)z
QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。51Testing软件测试网.o!k3T `\{/T
JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。51Testing软件测试网 fqVpA1g cq^}

8a1V\ T%Gz9o0对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。
&`ae?if0但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。
Kj4B a D0所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。51Testing软件测试网!F,@)Gu&Xwi
不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
6h4y+S`%d3z&v0封装接口有相应功能的话,就尽量用封装接口吧!51Testing软件测试网R s*g,TI)r
( Written by yabest,http://www.yabest.net
B0k5m#`UB S\p0
S-A']%\:djt0理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。
ddO\&`-n0
XN7i%]X4Qf0但是我们怎么知道对象都有哪些封装接口和自身接口呢?
/v0D[[2X"vIW/g(Nn0其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
&w4t%^W(Z0窗口中间有选择栏让你选择Run-time Object或者Test Object,
3F^$si#J7M0当你选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)
EILG;Ih0当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)
"Pk!~%W?l0
v%^'UH2iW"y@0}0(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,
4e9SMI S d{|0            两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。
Dw@Kl0ere0            不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
7L;HS.p/kp A\J0            QTP里的Test Object/Run-time Object的概念太容易让人混淆了!
Tk@*m(N2Rz0            它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。
#m*sf:z y0
%G:qc2`Vvrev051Testing软件测试网-{:NR8w,ylt
51Testing软件测试网 J&uy dw2q!cHM
明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!
HfdV+e*b jC051Testing软件测试网S(a5Z}x4c%t
比如执行
4~2Vh7y@0I7{(w*V9^;w3w0  JavaDialog("Add NE").JavaEdit("NE Name").object.setVisible(false)
U2g"~1L.o/z ss0哈哈,你的JavaEdit对象就当场消失不见了!!!51Testing软件测试网;ofn0U2L.m+Ib

h]6pszY1v u#Yr0你可以拿这个做恶作剧,指着这个窗口逼问开发人员,JavaEdit对象哪去了?
J8j]1D&f |0开发人员肯定瞪大眼睛看着这个窗口,当场翘掉!!!
`Hmb,q9|;TKTc051Testing软件测试网 kz+qz'I IYP |q6z

TAG:

 

评分:0

我来说两句

日历

« 2024-05-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 4665
  • 日志数: 10
  • 建立时间: 2008-11-21
  • 更新时间: 2009-07-12

RSS订阅

Open Toolbar