51Testing软件测试论坛

标题: 【浅谈 QTP之识别机制与ChildObjects方法】 [打印本页]

作者: 假装不在    时间: 2008-10-20 17:34
标题: 【浅谈 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
沙发下先。实际测试当中得注意!谢谢共享
作者: angelia_liu    时间: 2008-10-20 17:43
呵呵,学习学习
作者: lantianwei    时间: 2008-10-20 19:42
不错,支持一下!
作者: hsjzfling    时间: 2008-10-20 20:42
LZ很仔细啊,以前都没太注意过那两个问题。

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

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

对于type为hidden的对象,QTP确实不能识别,因为该对象根本就不会载入到页面中。
作者: Randall    时间: 2008-10-20 21:06
谢谢分享
作者: 假装不在    时间: 2008-10-21 00:29
这个帖子其实我写了1个多星期,一直写不好,不是做web开发的,所以有些词语用得不是哪么顺,想了很久。还有为了让问题更直观,所以反复改了1个星期。
作者: hsjzfling    时间: 2008-10-21 01:33
原帖由 假装不在 于 2008-10-21 00:29 发表
这个帖子其实我写了1个多星期,一直写不好,不是做web开发的,所以有些词语用得不是哪么顺,想了很久。还有为了让问题更直观,所以反复改了1个星期。


有心的人啊~~偶就么这么勤劳
作者: 假装不在    时间: 2008-10-21 08:49
原帖由 hsjzfling 于 2008-10-21 01:33 发表


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



........
作者: kevin_swpi    时间: 2008-10-21 10:51
支持假装不在的原创!!
作者: 假装不在    时间: 2008-10-21 17:21
原帖由 kevin_swpi 于 2008-10-21 10:51 发表
支持假装不在的原创!!


学习到东西才重要...
作者: blueeagle9999    时间: 2008-10-26 23:57
学习到了,一直被ChildObjects获取到的对象个数疑惑着,明天验证下!
作者: Robel.Yi    时间: 2008-10-30 10:16
标题: 不错,支持下
写得不错,其实很多看似高深的东西,只在我们弹指一挥间,就看你有没有认真的去发现,表扬主人的探索精神!
作者: daren_liu    时间: 2008-10-30 10:55

作者: mayuping0516    时间: 2008-10-30 21:24
有点深奥哦 等慢慢研究一下
谢谢分享  
作者: 刀客    时间: 2008-11-3 12:48
所以说在测某个产品的时候,最好对其采用的技术有一定的了解,会事半功倍的
作者: edison1256    时间: 2009-12-29 15:50
如果学下js的话会很有帮助呀。。但是我总跟vbs混淆。。
作者: 小甘    时间: 2010-4-15 15:30
学习了!
作者: TIB    时间: 2010-4-15 15:48
msgbox browser("Browser").Page("Page").Object.getElementsByName("btnI").count 这句的count应该改为length
作者: FLY000    时间: 2010-9-16 16:31
楼主,是不是使用DOM的方法比较保险,得到的对象集合是按照页面上的顺序排列的?,如从上到下,从左到右,
作者: vikesgao    时间: 2010-10-9 10:42
十分感谢楼主,辛苦了,多谢




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2