2013-08-28 2 views
6

Давайте говорить я прохожу Browser("MyBrowser").Page("MyPage").WebCheckBox("MyBox") к функции:Как я могу получить логическое имя тестового объекта (существующего в связанном общем OR)?

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

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

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

Свойство объекта «имя» возвращает имя, которое было создано, если вы повторно добавляете тестовый объект. Для логического имени нет (документированного) свойства тестового объекта. Свойства объекта времени выполнения can't возможно содержат имя, так как это не имя из AUT GUI.

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

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

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

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

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

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

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

Если есть какой-то сверхразумный мастер QTP, ла-Мотти, который знает, что этого не может быть сделано, я действительно ценю ответ от него, даже если он читает «это не может быть сделано», если это правда.

ответ

8

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

В случае, если вам интересно, «TestObjName» является своего рода документированным ... но не для многих объектов. Найдите его в помощи UFT, и вы увидите, что он указан в отношении таких вещей, как WinButton или другие элементы управления Windows и ActiveX, но он должен работать для всех объектов. – Xiaofu

+0

Можно ли узнать, хранится ли тестовый объект в OR или генерируется описанием? TestObjName возвращает имя по умолчанию, которое присваиваемый дескрипцией объект получает, если он хранится в OR. – TheBlastOne

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 
1

Для удобства я присоединил все эти отдельные функции к одной функции (GetFullORName), и она работает GREAT! Я использую его, чтобы дать лучшее 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 
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 

Сообщите мне, если это поможет.

+0

Неудачи для TO, которые не находятся в репозитории объектов ... кроме того, принятый ответ - это один лайнер по существу. – TheBlastOne