|
【象随我动】
作者:卢晨之 转载请注明
许久没写帖子,笔头有点硬,今天小编特此路过此地献上丑文一篇。
一,让对象库动起来的三个“积木”
为什么叫积木呢,积木的特点就是只要在它能站立的基础上,任意拼凑都能出现一个小建筑,多一个是,少一个也是。
大家先了解3个对象,ObjectRepositoryUtil,RepositoriesCollection,Repository。
这三个对象是QTP内置的对象,它们分别可以理解为QTP UI function的各个部分,只不过QTP提供了给我们用代码实现的方法:
1,ObjectRepositoryUtil QTP的合并对象库工具与对象库管理工具;
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(参数)。可以在对象库管理期中设置。
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 编辑 ] |
|