Как я могу получить логическое имя объекта (который существует в связанном или общей)?
допустим, я передаю 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
Дайте мне знать, если это поможет.