51Testing软件测试论坛

标题: 【象随我动】 [打印本页]

作者: 假装不在    时间: 2009-11-25 00:41
标题: 【象随我动】
【象随我动】

作者:卢晨之 转载请注明

许久没写帖子,笔头有点硬,今天小编特此路过此地献上丑文一篇。
一,让对象库动起来的三个“积木”
为什么叫积木呢,积木的特点就是只要在它能站立的基础上,任意拼凑都能出现一个小建筑,多一个是,少一个也是。
大家先了解3个对象,ObjectRepositoryUtil,RepositoriesCollection,Repository。
这三个对象是QTP内置的对象,它们分别可以理解为QTP UI function的各个部分,只不过QTP提供了给我们用代码实现的方法:
1,ObjectRepositoryUtil   QTP的合并对象库工具与对象库管理工具;

[attach]57695[/attach][attach]57696[/attach]                         
2,RepositoriesCollection   QTP的运行时候关联的对象库,可以在Action Property中设置,效果一样;
3,Repository                                QTP运行时候的公共与本地对象库;
而我们都可以在帮助文档中看到这3个对象的相关帮助(“HP\QuickTest Professional\help\GeneralHelp.chm”),可以查看到它的方法,属性等。
二,        各个“积木”的功能与代码实现
1,        ObjectRepositoryUtil,如果你想了解它能做什么,你可以先摸摸看对象库合并工具与对象库管理工具,你可以知道它能够导出,导出对象库,或者使用XML存储,对象复制,对象命名,对象查找,对象复制与粘贴等等。所以,你读起代码来,你会更容易理解它与吸收:
Dim ImageObj, PageObj, RepositoryFrom, RepositoryTo

Set RepositoryFrom = CreateObject("Mercury.ObjectRepositoryUtil")
Set RepositoryTo = CreateObject("Mercury.ObjectRepositoryUtil")
RepositoryFrom.Load "C:\All.tsr"
RepositoryTo.Load "C:\Only.tsr"
Set ImageObj=RepositoryFrom.GetAllObjects.item(3) 'From对象库的Iamge对象
Set PageObj  =RepositoryTo.GetAllObjects.item(1)   'To对象库的Page对象
RepositoryTo.AddObject ImageObj,PageObj,"AA"    '把这个Image粘贴到这个To 对象库Page下面,并命名为AA
RepositoryTo.Save
2,        RepositoriesCollection ,这个主要用途就是让脚本在跑的过程中,可以添加使用其它闲置对象库。这样当前的Action就能使用这个对象库中的对象,但是它同时也存在主次之分,就是本地对象库的优先级别是高过这个调进来的对象库。并且有点需要注意的是,本地对象库中,对象AA因为某些问题,QTP在应用程序中找不到,哪么QTP不会“乐意”再去这个调进来对象库中查找是有有匹配AA的对象,直接就抛个绝望的红XX给你。
RepPath = "C:\All.tsr"
RepositoriesCollection.RemoveAll()
RepositoriesCollection.Add(RepPath)
3,        Repository 。当前运行Action的对象库,包括了外调对象库与本地对象库。
三,        我们要如何拼这个“积木”让它“动”呢?它们的可行性?
方案一:
1,        通过ObjectRepositoryUtil导出XML并实现准备好各个对象的XML片段,通过VBS操作来粘贴,并重新导入XML来实现动态添加对象。
2,        RepositoriesCollection 导入刚才修改的对象库。
方案二:
1,        在QTP9.5中,对象库是有自己的参数,也就是一个对象库有自己一个或者多个Parameters(参数)。可以在对象库管理期中设置。
[attach]57697[/attach]
2,        在这个对象库中,把里面的某个对象参数化,与这个参数挂钩。完成了“独立对象库参数化”的操作。使用代码如下:
RepPath = "C:\All.tsr"
RepositoriesCollection.RemoveAll()
RepositoriesCollection.Add(RepPath)
msgbox browser("百度一下,你就知道").Page("百度一下,你就知道").Link("新 闻").GetROProperty("Text")   ‘新闻
Repository("AA")="贴 吧"
msgbox browser("百度一下,你就知道").Page("百度一下,你就知道").Link("新 闻").GetROProperty("Text")   ‘贴吧
3,        在这个独立的对象库中,建立多个对象,例如WebEdit,Link,Image等等,把关键的设别属性都挂接起来。
4,        区别与方案一,我们需要用2个对象库,一个就是刚才新建出来的“样板”对象库,这另一个,是来存储我们的“成品”对象。而这些成品对象,就是通过我们的场景恢复搭建起来的。(后面详解)

这2个方案,我们可以看出,方案一代码量会比较大,而方案二确实比较简单,实现简单,但需要用2个对象库来做一个“样板”与“成品”的操作。
这个时候突然有人问我,为什么这么做呢?读到这里很多人想,是啊,它这么动,只是能在跑的过程中添加对象而已,又没有什么好处!存在即是合理,做自动化的人或者应该多突发奇想!
突然我们想起了一个,在过去很多个QTP版本都被我们遗忘的功能,叫场景恢复!
                它其实也是积木的一块。那要怎么拼呢?
1,        新建一个场景恢复,“Test Run Error”—“Object not found”
2,        然后我们指定一个VBS文件,自然可以新建一个,它会自动新生成一个函数:
Function RecoveryFunction1(Object, Method, Arguments, retVal)
End Function
3,        我们知道,当这个场景触发时候,QTP就会给这个函数传递4个参数进去,自然,我们也可以使用Object.gettoproperty(“text”)之类去获取它的文本等等,这里只能使用To的,为什么啊?如果能使用Ro它也不会被触发了。
4,        接着我们就拿上面的方案二,在“样板”对象库中找出一个我们喜欢的,接着粘贴到我们的“成品”对象库中,update下对象库。
5,        例如到了webedit(“A”).set “123”  哪么到这步停下来,我们就让它进入场景,构造“成品”,调用成品,而调用成品方法是:
Dim NewObject
Set NewObject=Webedit(“成品”)
ExecuteGlobal “NewObject.”& Method&” ”& Arguments
这个这个就是最终我们拼成的“积木”!自然,它有很多其他的组合与用法,发挥想象,能让你进步更快!

[ 本帖最后由 假装不在 于 2009-11-25 00:44 编辑 ]
作者: 假装不在    时间: 2009-11-25 00:49
::yiwusuoyou:::   我要编辑……
作者: nbkhic    时间: 2009-11-25 08:49
沙花,很实用的文章。
作者: fishy    时间: 2009-11-26 17:16
您好,我是51Testing软件测试网的编辑,您的本篇博文被推荐至51Testing软件测试网首页发表:http://www.51testing.com/html/35/n-196535.html
感谢您关注并支持51Testing博客,期待您更多的优秀原创博文。
《51测试天地》电子杂志第十六期征稿进行中,详情请查看:
http://bbs.51testing.com/thread-174850-1-1.html
作者: 假装不在    时间: 2009-12-4 20:00
原帖由 nbkhic 于 2009-11-25 08:49 发表
沙花,很实用的文章。

::yiwusuoyou:::  一起学习。
作者: vikesgao    时间: 2010-10-9 11:16
不错,学习了
作者: houxilixxzj    时间: 2010-12-29 17:52
印象




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