2013-08-28 12 views
6

Let'sは、私は関数にBrowser("MyBrowser").Page("MyPage").WebCheckBox("MyBox")を渡すと言う:テストオブジェクト(関連する共有ORに存在する)の論理名を取得するにはどうすればよいですか?

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

その後、関数はこの場合には、当然のことながら、「MyBoxで受信したテスト対象の論理名を(ログしたいです")。

どうすればできますか?

「名前」テストオブジェクトプロパティは、テストオブジェクトを再追加すると作成される名前を返します。 論理名には、(文書化された)テストオブジェクトプロパティはありません。 実行時オブジェクトのプロパティは、AUT GUIの名前ではないため、おそらくには名前を含めることはできません。

だから、テストオブジェクトはその名前を知らないと思います。リポジトリだけが、テストオブジェクトがそこに格納されている名前の下に「知っている」。

したがって、テストオブジェクトではなく、リポジトリ自体を検査する必要があります。

ObjectRepositoryUtil APIを使用すると、GetChildrenやその他の方法でリポジトリのテストオブジェクトコレクション内のテストオブジェクトを検索し、GetLogicalNameメソッドを使用してその名前を取得することができます。ファイン。

しかし、これを実現させる唯一の方法は、をロードしてにリポジトリへの参照を取得することです。私は、このAPIがテスト実行からではなく、QTPの外部からreposを操作(または分析)するように設計されているという印象を受けます。 私はリポジトリを再ロードしたくありません。すでにロードされているリポジトリの1つでテストオブジェクトを検索したいと思います。

RepositoriesCollection APIは、(自分の名前とパスで)ロードされている私に言うことができますが、それはは、これらのリポジトリの 1を表すオブジェクトのインスタンスへ参照を得る手段を提供していません。

は、どのように私はすでにロードされたリポジトリへの参照を取得することができますので、私はGetLogicalNameを使用することができますか?

一般的に質問:現在のアクションの共有リポジトリに含まれている「通常の」テストオブジェクトへの参照を考えて、どのようにして論理名をプログラムで見つけることができますか?

これを行うことができないということを知っているMottiさんが超うまいQTPウィザードを使用している場合は、「これを実行できません」というメッセージが表示されても本当に感謝します。

答えて

8

あなたが「TestObjName」プロパティをしたい:

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

使用法:

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

あなたは文字列としてオブジェクト全体チェーンを再構築する必要性を感じるべき、あなたは(もGetRepoNameプラス、以下の2つの余分な方法を必要とする)は、以下の方法「GetFullQtpName」を使用することができます。

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

便宜上、これらの別々の関数をすべて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 
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のために失敗します...さらに、受け入れられた答えは本質的に1つのライナーです。 – TheBlastOne

関連する問題