假装不在 发表于 2008-10-20 17:34:18

【浅谈 QTP之识别机制与ChildObjects方法】

很多时候,我们使用了ChildObjects去捕获页面的某些元素,很多人会很郁闷的发现捕获得很不全,或者根本就捕获不到。
关于QTP自身的方法中,它封装了很多其它语言的方法,并自己做了修改,让自己的方法更适合用户使用在自动化中,自然也有它自己的好好坏坏。
给大家一个我自己随便写的page,里面的元素的节点都是Input,name=btnI。然后大家再用QTP把这个page添加到对象库中去,并修改下下面代码,运行下效果
先给大家看看下面代码片:
Dim Ele_name
Set Ele_name=description.Create()
Ele_name("name").value="btnI"
msgbox browser("Browser").Page("Page").ChildObjects(Ele_name).count
msgbox browser("Browser").Page("Page").Object.getElementsByName("btnI").count

有时候大家在某些页面上运行上面代码后,你会惊讶的发现,怎么Child_Input和GetName_Input怎么会不相等呢,而且会是child_Input<=GetName_Input?
在我们的想象范围内,ChildObjects(Ele_name)和getElementsByName("btnI")应该是一样的才对,但实际上,它们之间是存在的类似继承的关系。
首先我们来了解getElementsByName方法的由来:
getElementsByName是一个element的方法,是一个比较底层,基于JS等的方法。getElementsByName返回一个element数组,包含具有指定标记名的所有Element节点的子孙节点,其顺序为在文档中出现的顺序。而它捕获到的元素的方式是通过对HTML的节点进行了遍历,去得所有name为btnI的元素。
ChildObjects,它则是QTP自身的方法,返回对象中包含的子对象的集合。
如果细心的朋友,会想,哪么究竟ChildObjects抓到的是那几个元素,为什么其它的不是呢?然后会用spy点击下sumbit,你会发现它的name不是我们脚本中写的“btnI”,而是“sumbit”!!
问题就是出现在这里!QTP的识别机制中,会把某些webelement对应的属性识别做修改,就类似sumbit的name属性是"btnI"但是在QTP面前,它的属性识别却是一个sumbit一样。
这也就导致了childObjects捕获不到这个元素的原因。
通用,如果喜欢研究的读者,也可以使用getElementsByTagName去试验,会发现INPUT节点中,type为hidden的元素,是不被QTP所识别的。

songyq521 发表于 2008-10-20 17:41:47

沙发下先。实际测试当中得注意!谢谢共享

angelia_liu 发表于 2008-10-20 17:43:18

呵呵,学习学习

lantianwei 发表于 2008-10-20 19:42:14

不错,支持一下!:victory:

hsjzfling 发表于 2008-10-20 20:42:53

LZ很仔细啊,以前都没太注意过那两个问题。

补充小结下咯,就目前观察到的web来看,只有对于WebButton对象,QTP封装name属性时会取其value属性的值,而对于其它诸如WebEdit等等对象而言,QTP封装name属性时还是取name属性的值。

而在使用ChildObjects方法时,不能想当然的去描述对象,而需要将每类对象的属性都好好spy下,避免各种意外的特例干扰。描述属性的选择也要好好琢磨下,做的多了熟练了就会比较轻松。

对于type为hidden的对象,QTP确实不能识别,因为该对象根本就不会载入到页面中。

Randall 发表于 2008-10-20 21:06:21

谢谢分享

假装不在 发表于 2008-10-21 00:29:40

:hug: 这个帖子其实我写了1个多星期,一直写不好,不是做web开发的,所以有些词语用得不是哪么顺,想了很久。还有为了让问题更直观,所以反复改了1个星期。

hsjzfling 发表于 2008-10-21 01:33:34

原帖由 假装不在 于 2008-10-21 00:29 发表 http://bbs.51testing.com/images/common/back.gif
:hug: 这个帖子其实我写了1个多星期,一直写不好,不是做web开发的,所以有些词语用得不是哪么顺,想了很久。还有为了让问题更直观,所以反复改了1个星期。

有心的人啊~~偶就么这么勤劳

假装不在 发表于 2008-10-21 08:49:32

原帖由 hsjzfling 于 2008-10-21 01:33 发表 http://bbs.51testing.com/images/common/back.gif


有心的人啊~~偶就么这么勤劳


:L ........

kevin_swpi 发表于 2008-10-21 10:51:44

支持假装不在的原创!!:lol :lol

假装不在 发表于 2008-10-21 17:21:24

原帖由 kevin_swpi 于 2008-10-21 10:51 发表 http://bbs.51testing.com/images/common/back.gif
支持假装不在的原创!!:lol :lol

学习到东西才重要...

blueeagle9999 发表于 2008-10-26 23:57:22

学习到了,一直被ChildObjects获取到的对象个数疑惑着,明天验证下!

Robel.Yi 发表于 2008-10-30 10:16:42

不错,支持下

写得不错,其实很多看似高深的东西,只在我们弹指一挥间,就看你有没有认真的去发现,表扬主人的探索精神!

daren_liu 发表于 2008-10-30 10:55:46

:victory:

mayuping0516 发表于 2008-10-30 21:24:16

有点深奥哦 等慢慢研究一下
谢谢分享:lol

刀客 发表于 2008-11-3 12:48:29

所以说在测某个产品的时候,最好对其采用的技术有一定的了解,会事半功倍的

edison1256 发表于 2009-12-29 15:50:38

如果学下js的话会很有帮助呀。。但是我总跟vbs混淆。。

小甘 发表于 2010-4-15 15:30:02

学习了!

TIB 发表于 2010-4-15 15:48:53

msgbox browser("Browser").Page("Page").Object.getElementsByName("btnI").count 这句的count应该改为length

FLY000 发表于 2010-9-16 16:31:08

楼主,是不是使用DOM的方法比较保险,得到的对象集合是按照页面上的顺序排列的?,如从上到下,从左到右,
页: [1] 2
查看完整版本: 【浅谈 QTP之识别机制与ChildObjects方法】