Как я могу получить логическое имя объекта (который существует в связанном или общей)?

допустим, я передаю Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox") функции:

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

позже, функция хочет войти логическое имя полученного тестового объекта (который в данном случае, конечно же, является "MyBox").

как он мог это сделать?

свойство тестового объекта "name" возвращает имя, которое создается при повторном добавлении тестового объекта. для логического имени нет (документированного) свойства тестового объекта. Объект среды выполнения свойства не возможно содержат имя, так как это не имя из AUT GUI.

поэтому я думаю, что тестовый объект не знает своего имени. Только репозиторий "знает", под каким именем там хранится тестовый объект.

поэтому мне придется проверять сам репозиторий, а не тестовый объект.

на ObjectRepositoryUtil API позволяет мне (через GetChildren или другие методы), чтобы найти тестовый объект в коллекции тестовых объектов repositorys и использовать GetLogicalName метод, чтобы получить его имя. Штраф.

но единственный способ заставить это работать-получить ссылку на репозиторий по загрузка его. У меня создается впечатление, что этот API предназначен для манипулирования (или анализа) репозиториями извне QTP, а не внутри тестового запуска. Я не хочу повторно загружать репозиторий. Я хочу найти тестовый объект в одном из уже загруженных репозиториев.

на RepositoriesCollection API может сказать мне, какие загружены (по их имени и пути), но это не дает средства для получения ссылка экземпляру объекта, который представляет один из этих хранилищ.

так как can Я получаю ссылку на уже загруженный репозиторий, поэтому я могу использовать GetLogicalName?

или вообще спрашивать: учитывая ссылку на" обычный " тестовый объект, содержащийся в текущем общем репозитории действий, как я могу узнать его логическое имя программно?

если есть какой-то ультра-мудрый Мастер QTP a la Motti, который знает, что это невозможно сделать, я действительно ценю ответ от него, даже если он читает "это невозможно сделать", если это правда.

4 ответов


вы хотите свойство" 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")"

для удобства я объединил все эти отдельные функции в одну функцию (GetFullORName), и она отлично работает! Я использую его, чтобы дать лучшего репортера.Информация о событии в моих пользовательских функциях...

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

единственный обходной путь, который я только что придумал, имеет много очевидных недостатков, включая его неполноту, и выглядит так:

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

логическое имя может быть получено простой строкой кода вместо стольких строк:

в вашем случае:

функция должна возвращать логическое имя объекта от аргумента

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

Function MyFunction(obj)  

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

End Function  

Дайте мне знать, если это поможет.