QTP之reporter对象方法全解析

来源:互联网 发布:lego moc 搭建软件 编辑:程序博客网 时间:2024/06/04 15:30

原文链接: http://hi.baidu.com/widebright/blog/item/8b08ca95230a0247d1135ef5.html


QTP默认提供的reporter公开方法显然不能满足我们通常的需求,所以有人就挖掘出了未公开方法。其一种挖掘方式就是利用qtp的debug功能,定位到reporter对象并查看其属性值、方法名。同理对于其他我们想了解的QTP对象,如果其公开方法不够用的时候,也可以试试看是否有未公开的方法可以利用。


关于如何增强QTP调试功能的方法见:

http://www.advancedqtp.com/2008/03/vs2008-pdm-dll-dramatically-improves-qtp%E2%80%99s-debug-engine/comment-page-1/

主要步骤就是:

1、安装VS2008【不是必要的】

2、或者在安装了IE8的情况先注册一个DLL,regsvr32 “C:\Program Files\Internet Explorer\pdm.dll”

3、或者下载一个pdm.dll然后注册一下

4、重启机器


关键字:QTP、reporter、报告、父节点、根节点、结构化

===================================================转载的分割线=========================================================


在QTP调试时,在watch窗口添加对QTP的Reporter对象的监视,可以找到如下函数:
-----------------------------------------------------------------------------------------------------------------------------------
GetContext() '返回一个表示当前节点的id
GetParentId(Id) ‘得到父节点的id,没用过这个呵呵
LogEvent(et, pDescription, ParentId) ’这个主要的函数,第一个参数固定用“User”? 第二个参数一个描述节点的字典对象,第三个是要加到父节点的id。主要就是用这个函数来新建一个节点了。函数返回新建的节点号码
ReportEvent(EventStatus, ReportStepName, Details, [ImageFilePath]) 这个公开的,QTP的文档里面有了。
ReStoreContext()   ‘从栈上还原当前节点状态,呵呵,根据名字猜的
SetContext(EventId) ’这个把当前节点设置为 EventId参数指定的节点。以后的report都作为这个节点的子节点而存在。
SetRegistryRoot(Root) ‘这个不知道什么来的
SetStatus(Id, Status) ’设置id指定的节点的状态,micFail/micPass 等表面节点是不是运行成功。
StoreContext() ‘把当前的节点状态保持到栈上咯
UnSetContext() ’ 取消当前节点的设置。
-----------------------------------------------------------------------------------------------------------------------------------
使用:有人说有时UnSetContext这个不好用,不知道UnSetContext之后还原回来的是哪个节点。所以最好先用GetContext保持以前的节点号码,然后SetContext切换到子节点去,需要退回父节点的时候使用保存起来的节点号码再SetContext一次就是了。也可以用StoreContext,ReStoreContext来帮你做这个保存和切换工作了。

那个字典描述对象的,DLL那个几个属性是指定里面的资源图标的,作为浏览树里面第二个图标。需要指定其他图标的可以自己指定dll路径和ico资源号码了。如果什么都不指定也有一个图标,不过不是很好看。QTP根据节点的执行结果,还会把对错的勾和红色叉叉的图标放到前面的。


QTP Custom Report Entry

dim curNodeId , childNodeId
curNodeId = Reporter.GetContext()
Set objDict = CreateObject("Scripting.Dictionary")
objDict("Status") = micPass
objDict("PlainTextNodeName") = "custom node"
objDict("StepHtmlInfo") = "<DIV align=left><H1>HTML layout

testing</H1><b>This</b> can be handy to have.</DIV>"
objDict("DllIconIndex") = 206
objDict("DllIconSelIndex") = 206
objDict("DllPAth") = "C:\HP\QuickTestProfessional\bin\ContextManager.dll"


' report the custom entry
childNodeId = Reporter.LogEvent ( "User", objDict, Reporter.GetContext)
Reporter.SetStatus childNodeId, micFail
Reporter.StoreContext
Reporter.SetContext(childNodeId)
Reporter.ReportEvent micFail,"step1","step1,failed"
' 这里添加其他调用action 的代码等等

childNodeId = Reporter.LogEvent ("User", objDict, childNodeId )
Reporter.SetStatus childNodeId, micDone 
Reporter.SetContext(childNodeId)
Reporter.ReportEvent micFail,"step2","step2,failed" 
' 这里添加其他调用action 的代码等等

childNodeId = Reporter.LogEvent ("User", objDict, childNodeId )
Reporter.SetStatus childNodeId,micPass
Reporter.SetContext(childNodeId)
Reporter.ReportEvent micPass,"step3","step3,failed"

Reporter.RestoreContext
Reporter.ReportEvent micPass,"step4","step4,failed"


===========================
上面代码最终生成的报告如图:



测试的时候发现一个问题就是,调用LogEvent来添加的时候,只能顺这执行顺序来添加节点。就是说我们创建了某个节点1之后,又退出到父节点来,再做了一下其他平行关系的东西,比如添加平行一级的节点2,这时就不能再倒过头来给节点1添加一个子节点了,只能给节点2添加或者添加平行一级的。不知道我说清楚了没有,不过等你们碰到的时候就明白了呵呵。不过这个问题不大吧。

两个通用函数:

---------------------------------------------------

Function EnterChildNode(nodeName, decription)
dim curNodeId , childNodeId, objDict

Set objDict = CreateObject("Scripting.Dictionary")
objDict("Status") = micPass
objDict("PlainTextNodeName") = nodeName
objDict("StepHtmlInfo") = decription
objDict("DllIconIndex") = 206
objDict("DllIconSelIndex") = 206
objDict("DllPAth") = Environment("ProductDir") & "\bin\ContextManager.dll"

curNodeId = Reporter.GetContext()
childNodeId = Reporter.LogEvent ("User", objDict, curNodeId)
Set objDict = Nothing
Reporter.SetContext(childNodeId)
EnterChildNode = curNodeId
End Function


Function LeaveChildNode(parentID)
Reporter.SetContext parentID
End Function

用法
Dim currentID 
currentID =EnterChildNode ("节点名字" , "可以使用html语法的描述")
       '这这里调用子节点的代码
       '这这里调用子节点的代码
LeaveChildNode(currentID)
---------------------------------------------------
保存当前id然后 SetContext恢复办法的最好了,StoreContext 和RestoreContext 好像有时还是不太准确,可能别的内部应用也调用这两个函数吧



原创粉丝点击