如何获取测试对象的逻辑名称(存在于关联的共享OR中)?

时间:2013-08-28 13:58:17

标签: qtp hp-uft

假设我将Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox")传递给函数:

MyFunction (Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox"))

稍后,该函数想要记录收到的测试对象的逻辑名称(在这种情况下,当然是“MyBox”)。

怎么可能呢?

“name”测试对象属性返回重新添加测试对象时生成的名称。 逻辑名称没有(已记录的)测试对象属性。 运行时对象属性不可能包含名称,因为它不是来自AUT GUI的名称。

所以我认为测试对象不知道它的名字。只有存储库“知道”测试对象存储在哪个名称下。

所以我必须检查存储库本身,而不是测试对象。<​​/ p>

ObjectRepositoryUtil API允许我(通过GetChildren或其他方法)在存储库的测试对象集合中查找测试对象,并使用GetLogicalName方法获取其名称。细

但实现这一目标的唯一方法是通过加载来获取对存储库的引用。我得到的印象是,这个API旨在操纵(或分析)来自QTP外部的回购,而不是来自测试运行。 我不想重新加载存储库。我想在一个已经加载的存储库中查找测试对象。<​​/ p>

RepositoriesCollection API可以告诉我哪些是加载的(通过它们的名称和路径),但它没有提供一种获取引用的对象实例的方法表示其中一个存储库。

那么 如何我获取对已经加载的存储库的引用,所以我可以使用GetLogicalName

或者通常会问:给定对当前操作的共享存储库中包含的“普通”测试对象的引用,如何以编程方式找到其逻辑名称?

如果有一些非常明智的QTP向导,那么知道这一点的Motti就无法完成,我真的很感激他的回答,即使它是“如果这是真的那就无法完成”。

4 个答案:

答案 0 :(得分:9)

您需要“TestObjName”属性:

function GetRepoName(obj)
    GetRepoName = obj.GetTOProperty("TestObjName")
end function

用法:

logicalName = GetRepoName(Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox"))
'logicalName now equals "MyBox"

如果您觉得需要将整个对象链重建为字符串,可以使用以下方法“GetFullQtpName”(这也需要GetRepoName加上下面的2个额外方法):

function GetFullQtpName(obj)
    dim fullQtpName : fullQtpName = MakeQtpName(obj)
    dim objCurrent : set objCurrent = obj

    do while not IsEmpty(objCurrent.GetTOProperty("parent"))
        set objCurrent = objCurrent.GetTOProperty("parent")
        fullQtpName = MakeQtpName(objCurrent) & "." & fullQtpName
    loop

    GetFullQtpName = fullQtpName
end function

function MakeQtpName(obj)
    MakeQtpName = GetClassName(obj) & "(""" & GetRepoName(obj) & """)"
end function

function GetClassName(obj)
    GetClassName = obj.GetTOProperty("class Name")
end function

用法:

fullQtpName = GetFullQtpName(Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox"))
'fullQtpName now equals "Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox")"

答案 1 :(得分:1)

为方便起见,我将所有这些单独的函数加入到一个函数(GetFullORName)中,它的工作原理很棒!我使用它在我的自定义函数中提供更好的Reporter.Event信息...

Function GetFullORName (obj)
    Dim fullUFTName : fullUFTName = obj.GetTOProperty("class name") & "(""" & obj.GetTOProperty("TestObjName") & """)"
    Dim objCurrent : Set objCurrent = obj
    Do While Not IsEmpty(objCurrent.GetTOProperty("parent"))
        Set objCurrent = objCurrent.GetTOProperty("parent")
        fullUFTName = objCurrent.GetTOProperty("class name") & "(""" & objCurrent.GetTOProperty("TestObjName") & """)" & "." & fullUFTName
    Loop
    GetFullORName = fullUFTName
End Function


Public Function CheckObjExist (obj)
    If obj.Exist Then
        Reporter.ReportEvent micPass, "CheckObjExist [" & obj.GetTOProperty("TestObjName") & "]", "Object = [ " & GetFullORName(obj) & " ]" & Chr(13) & "Object exists"
        CheckObjExist = True
    Else
        Reporter.ReportEvent micFail, "CheckObjExist [" & obj.GetTOProperty("TestObjName") & "]", "Object = [ " & GetFullORName(obj) & " ]" & Chr(13) & "Object does NOT exist"
        CheckObjExist = False
    End If
End Function

答案 2 :(得分:0)

我刚才想出的唯一解决方法有很多明显的缺点,包括它的不完整性,看起来像这样:

Function GetLogicalName (ByVal TestObject)
    Dim NameWithType: NameWithType=TestObject.ToString
    Dim TypeProp: TypeProp=TestObject.GetTOProperty ("micclass")
    Dim Suffix
    Select Case TypeProp
        Case "Page" 
            Suffix=" web page"
        Case "Browser" 
            Suffix=" browser"
        Case "JavaApplet" 
            Suffix=" applet"
        Case "JavaButton" 
            Suffix=" button"
        Case "WebCheckBox" 
            Suffix=" check box"
        Case "WebEdit" 
            Suffix=" edit box"
        Case "WebElement" 
            Suffix=" object"
        Case "WebFile" 
            Suffix=" edit box"
        Case "WebTable" 
            Suffix=" table"
        Case "JavaObject" 
            Suffix=" object"
        Case else
            MsgBox "Unknown micclass '" & TypeProp & "'"
            ExitTest
    End Select
    GetLogicalName=Left (NameWithType,Len (NameWithType)-Len (Suffix))
End Function

答案 3 :(得分:0)

逻辑名称可以通过一行简单的代码检索,而不是那么多行:

在你的情况下:

该函数应从arguement

返回对象的逻辑名称
MyFunction (Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox"))  
Function MyFunction(obj)  

MyFunction= obj.ToString()  'This is an inbuilt method of object in QTP

End Function  

如果有帮助,请告诉我。