注:原文最早是发表在www.automationqa.com上面的,后来因为网站被黑而文章内容消失了,希望csdn别被黑了。
关于转载:本文为原创文章,欢迎转载,但转载需要标注出处以及保证内容的完整性,请理解写作的寂莫和苦处。
关于版权:本文不得应用于以赢利为目的的任何场景,否则本人保留相应的权利。
全文下载:http://www.docin.com/p-1910330544.html
还是回到今晚的主题吧,今晚我打算再学习并归纳一下 object .ChildObjects ([Description])方法。
方法:object.ChildObjects ([Description])
作用:返回上层对象中拥有指定属性的所有子对象
参数:具有某些属性的对象。注意,你可以使用GetTOPoperties方法或描述性编程来指描述对象。
返回值:一个对象。注意这里返回的是对象,在使用该方法时就需要按以下方法来使用,即Set childobj=object.ChildObjects([Description])
我们首先来看看,用它做的一个例子。
方案:录制一面的操作,打开百度,输入a,点击百度一下,获取所有页面中的link数。
我们先用描述性编程来描述某个对象的属性,关于QTP的描述性编程请在百度里面搜索一下,我想看看介绍也就明白了,在此我也就不做解释了。
方法一:
'在输入框中输入a
With Browser("百度一下,你就知道").Page("百度一下,你就知道")
.WebEdit("wd").Set "a"
''点击百度一下按钮
.WebButton("百度一下").Click
.Sync
''实现获取页面中所有的link对象的个数
''使用描述性编程描述link对象
Set objlinks=Description.Create
''在QTP中html tag的意识是,在网页中标签的名称是什么
objlinks("html tag").value="A"
''经过上面的描述后,objlinks在QTP里的意思就变成了
''objlinks这个东东就代表指向标签名称为A的对象
'利用object.ChildObjects ([Description]),我们可以获得Page页面
'中所有的对象,注意该方法的返回值也为对象,所以语法应如下
Set alllinkobjs=.ChildObjects(objlinks)
'对于对象,QTP提供了count方法,用来输出该对象的个数
'利用Msgbox 把它打印出来,我的结果为43,当然你的有可能不同,因为
'每次搜索出来的内容可能是不同的
Msgbox alllinkobjs.count
'关闭浏览器
Browser("百度一下,你就知道").Close
'对新建的对象应及时清空,避免对象遗留后的累加,造成内存的浪费
set objlinks=nothing
Set alllinkobjs=nothing
End With
方法二:我们也可以如用GetTOPoperties方法来描述页面中所有的link,请照着我的步骤来执行。
1、将光标指向.WebButton("百度一下").Click 语句上-》在Active Screnn上在“空间”链接,点击右键-》View/Add Object-》OK-》Add to Respository
2、在对象库中,重命令名对象”空间”为“检查链接的个数”-》点击右侧上方绿色的“十”字符号-》选中下图中的三个属性,点击OK
3、将下图中所选区域的value值,清空,并闭对象库
4、将上面的语句中Set alllinkobjs=.ChildObjects(objlinks)注释掉,然后在下面输入下面的语句。
Set alllinkobjs=.ChildObjects(.GetTOProperties("检查链接的个数"))
5、多运行一下,查看结果会发生这个值老是在变化着,至于为什么变我也不太清楚,这个问题留着某位回答吧。
从上面两种方法的使用来看,当然是第一种简单可行得多。当然,我们在项目中使用的时候也常常是使用第一种的方法。
另外有篇文章的内容是很值得我们注意的《浅谈 QTP之识别机制与ChildObjects方法》(url: http://www.51testing.com/?uid-17 ... wspace-itemid-95404)一文讲解了,使用ChildObjects方法获得的对象的个数与getElementsByName方法获得的个数不同的原因。
经常使用该方法在web自动化测试过程中主要在下面这几种情况(个人总结):
1、当页面中对象存在多个相同QTP属性时,使用该方法来获得惟一对象,如下面的伪代码,实现了根据不同的outerHtml的值来查找对象的惟一。为什么要使用outerHtml呢?因为根据我的观察发现,大多数情况下,虽然某些控件的Qtp属性可能会完全相同,但是其outerHtml也就是在页面中的源代码中往往显示是不同的,所以我们可以根据这一属性来寻找惟一的Obj。
onlyStringInOuterHtml,指能在outerHtml中区别其它控件属性中的某些字符串
Function SelectObjOnly(onlyStringInOuterHtml)
Set oDes=Description.Create
oDesc("micclass").Value = "WebEdit"
set objs=Browser().Page().ChildObjects(des)
注意此处应为objs.count-1,因为下面的对象个数是以数组的下标返回的,所以实际运行的次数应-1
For i=0 to objs.count-1
RegExpTest方法,在某个字符串中查找是否今有某字符串,大于0表示找到,该方法的详细代码QTP帮助文档里面有,当然网络上也有,在此省略此方法的介绍。
If(RegExpTest(onlyStringInOuterHtml,objs(i).GetROProperty(“outerHtml”))>0)
SelectObjOnly=objs(i)
Exit For
End if
Next
End Function
2、获取WebTable中某行或某列中的对象,这些对象可以是checkBox或者link或者WebEdit等。或者获取页面中的某些对象来进行一次操作,比如点击所有link或者给所有WebEdit赋相同的值等。
下面的例子,例举了如何一次性选中所有的checkBox控件。
Set oDesc = Description.Create()
oDesc("micclass").Value = "WebCheckBox"
Set Lists = Browser().Page().WebTable().ChildObjects(oDesc)
NumberOfLists = Lists.Count()
For i = 0 To NumberOfLists – 1
Lists(i).set "ON"
Next
3、利用该方法的特性来再构建一个所谓的框架
我曾经在学习和实践的过程中利用该函数的属性创建了一个所谓的框架,利用这个框架中的函数完全可以脱离于录制对象库的生成,并使用Excel表来分离对象的属性,数据源也使用Excel来进行读取和存储,另外还有其它一些特性。不过,在使用之后发现对象回收没有做好,QTP在跑一段时间后老死掉,外加判断对象是否存在也没有做好,所以现在还在改进之中,在此也就不说它了,有时间的话我会详细介绍一下它。在此也仅用它来说明,该方法能起到的良好作用。
注意以上给出的方法很有可能运行会出错,至于出错原因我想您还是得仔细推敲一下,并把它改正之。学习的过程有时候在我看来就是不断改正错误的过程,所以让我们拥抱错误吧!
文青山
2011-4-28