为什么对象库脚本的执行效率比描述性编程高?
同样一个目录树的展开操作,用对象库和描述性编程(使用了与对象库同样的识别属性)两种方式,两者执行效率相差甚远。对象库方式,执行用了2秒
描述性方式,执行用了7秒
脚本如下:
Browser("XXX").Page("XXX").WebElement("AA").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("BB").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("CC").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("DD").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("innertext:=AA","html tag:=SPAN").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("innertext:=BB","html tag:=SPAN").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("innertext:=CC","html tag:=SPAN").FireEvent "ondblclick"
Browser("XXX").Page("XXX").WebElement("innertext:=DD","html tag:=SPAN").FireEvent "ondblclick"
两者执行速度上的差别的原因应该在对象的查找上,但为什么会有这么大的差异呢?
描述性语句中同样也有对象层次关系,用了与对象库同样的识别属性呀?
哪位同行解答一下我的疑惑,谢谢。 :( 我认为是不是你开了相似对象识别的原因呢? 描述性编程有两种
Browser("Mercury Tours").Page("Mercury Tours").WebElement("Name:=UserName", "Index:=0").Click
建议使用以下这种 上面这种当对象多时就会越变越慢
set WebObjDesc = Description.Create()
WebObjDesc("Name").Value = "UserName"
WebObjDesc("Index").Value = "0"
Browser("Mercury Tours").Page("Mercury Tours").WebElement(WebObjDesc).Click
原帖由 ppent 于 2008-8-5 16:46 发表 http://bbs.51testing.com/images/common/back.gif
同样一个目录树的展开操作,用对象库和描述性编程(使用了与对象库同样的识别属性)两种方式,两者执行效率相差甚远。
对象库方式,执行用了2秒
描述性方式,执行用了7秒
脚本如下:
Browser("XXX").Page("XXX") ...
就我的理解,描述性编程需要先去创建个临时对象,再建立临时的对象层次与应用程序中的关联,最后再查找匹配的对象;而对象库相当于进行了些预处理,执行时只需要在已有的关联中查找匹配的对象即可。 楼主如果尝试一下将对于同一个对象的描述性编程所列举的识别属性与和对象库所列举的属
性完全相同。再去比较效率会怎么呢?
比如对象WebElement("AA")在对象库的识别属性有PA、PB、PC
则将其描述成:WebElement("PA:=?","PB:=?","PC:=?") 原帖由 tanky 于 2008-8-6 00:33 发表 http://bbs.51testing.com/images/common/back.gif
楼主如果尝试一下将对于同一个对象的描述性编程所列举的识别属性与和对象库所列举的属
性完全相同。再去比较效率会怎么呢?
比如对象WebElement("AA")在对象库的识别属性有PA、PB、PC
则将其描述成:WebEle ...
这个我很早前就试验过了,在某些测试环境下,描述性编程会慢一倍多~
回复 1# 的帖子
我的看法:描述性编程是根据给定属性值一个一个的FINDWINDOW,而对象库是根据本身存在在对象库里的属性进行查找对象, 虽然你指定了相同的属性,但是并不是说对象库模式就不去根据其他属性查找对象了阿, 你给定对象库模式的属性只是主属性,我相信QTP肯定有优化的机制,会优先选择更快定位对象的属性(比如对象所在的位置),当然前提是找到的对象必须满足你给定的主属性,而描述性编程是只能无奈的根据你给定的属性一个个的匹配对象,所以就会导致描述性编程比对象库慢些。 3楼的方法我试了,代码如下
set WebObjDesc = Description.Create()
WebObjDesc("micclass").Value = "Browser"
WebObjDesc("Index").Value = "0"
If Browser(WebObjDesc).Exist(1) then
msgbox "a"
end if
和
if Browser("index:=0").Exist(1) then
msgbox "a"
end if
的执行效率一样,不高。(注:当存在两个以上的网页时效率才快,否则,很慢)
支持4楼看法 个人理解是
描述性编程是自己创建了一个对象然后根据描述去找相应的对象(这个是只知道特征)
而QTP则是根据描述去找一个已经存在的对象(这个不仅知道特征,还知道放在那里)
所以 两个执行起来就有速度上的问题 对象库类似于使用了Cache的数据库机制。而描述性编程这从头开始。 谢谢以上各位的热心解答,这个问题的探讨有助于我们更深入的理解qtp的对象识别原理。
1、我认同hsjzfling所说的,但有疑问。qtp在运行时会根据描述性编程的对象描述建立临时对象,但我觉得仅仅是这个差别的话好像不足以使效率大幅降低?我觉得qtp大可把临时对象挂在其对象库的父节点上。毕竟我只是在WebElement这一层才使用了描述编程。我们知道,如果从Browser这一层就要描述性的话,那才是需要临时创建整个对象层次,这样的效率更低。
2、对于lantianwei的看法,我也觉得qtp对象库确实应该有它的优化策略,我从对象库的导出xml上看到一下一些信息,这个我们在对象的识别属性上是看不到的,但是否这些信息能够帮助qtp能够快速定位到对象呢?
<qtpRep:Object Class="WebButton" Name="Yes">
<qtpRep:Properties>
<qtpRep:Property Name="micclass" Hidden="1" ReadOnly="1" Type="STRING"> <qtpRep:Value RegularExpression="0">WebButton</qtpRep:Value> </qtpRep:Property>
<qtpRep:Property Name="source_index" Hidden="1" ReadOnly="1" Type="NUMBER"> <qtpRep:Value RegularExpression="0">53</qtpRep:Value> </qtpRep:Property>
<qtpRep:Property Name="class" Hidden="0" ReadOnly="0" Type="STRING"> <qtpRep:Value RegularExpression="0">button-buttonbar button-bgicon-yes</qtpRep:Value> </qtpRep:Property>
</qtpRep:Properties>
<qtpRep:BasicIdentification>
<qtpRep:PropertyRef>micclass</qtpRep:PropertyRef>
<qtpRep:PropertyRef>class</qtpRep:PropertyRef>
</qtpRep:BasicIdentification>
<qtpRep:LastUpdateTime>2008年6月12日 13:28:20</qtpRep:LastUpdateTime>
<qtpRep:ChildObjects>
</qtpRep:ChildObjects>
</qtpRep:Object>
由于没有直接资料证实,以上想法纯属猜测,真正原因,有待大家一起深入研究。
回复 10# 的帖子
qtp运行时是将界面的逐个元素拿来比较,其速度问题在于在众多的界面元素中的快速获取和准确比较,和对象库的cache关系不会太大吧?[ 本帖最后由 ppent 于 2008-8-6 12:19 编辑 ] 7楼是不是做过开发。
你的FINDWINDOW是指那个API吗?
这个我赞同。 原帖由 ppent 于 2008-8-6 12:18 发表 http://bbs.51testing.com/images/common/back.gif
qtp运行时是将界面的逐个元素拿来比较,其速度问题在于在众多的界面元素中的快速获取和准确比较,和对象库的cache关系不会太大吧?
我说的Cache机制是一个比喻,QTP应该先访问Object Repository来识别当前的对象;如果当前的对象不能识别,才用上描述性编程的方法。这个可能是一个机制先后的问题。 以前做的测试结果找不到了~刚花了点时间又做了几次小测试,以下的测试结果是连续3次的平均值,每次测试都是重置测试环境之后再执行的
1
Browser("Browser").Page("Page").Link("Meeting Room Booking").Click
Transaction "click" ended with "Pass" status (Total Duration: 0.8440 sec Wasted Time: 0.0781 sec).
Processing Time: 0.7656 sec
2
Browser("Browser").Page("Page").Link("text:=Meeting Room Booking","html tag:=A").Click
Transaction "click" ended with "Pass" status (Total Duration: 1.1722 sec Wasted Time: 0.3282 sec).
Processing Time: 0.844 sec
3
[Set oLink=Description.Create
oLink("text").Value = "Meeting Room Booking"
oLink("html tag").Value = "A"]
Browser("Browser").Page("Page").Link(oLink).Click 'calculate processing time of this statement only
Transaction "click" ended with "Pass" status (Total Duration: 0.9532 sec Wasted Time: 0.1875 sec).
Processing Time: 0.7657 这个问题大家也都是猜.
我打个比喻,看看大家能不能接受.
话说,两个红娘给A介绍B,其中一个是介绍前一天就见过B,而另一个没见过,你们说,介绍当天,哪个红娘介绍的速度快啊! http://bbs.51testing.com/thread-123509-1-1.html 呵呵,这里好热闹啊,发现多半都是我们的同学,哈哈 :lol 我不是吧,LS 顶个。
页:
[1]
2