4

コード化された UI の WaitForControlExist() 関数で奇妙な動作に直面しています。2 回目のクエリを実行すると、コントロールが存在するにもかかわらず、値が false を返します。これはコード化された UI の予想される動作ですか? 私のプログラムは以下のようになります..

//A sample program that Checks for Run window when "Windows + R" key is pressed

public void TestFunction()
{
   bool isExists = false;

   #region Variable Declarations

   UIMap uiMap = new UIMap();

   WinWindow uIRunWindow = uiMap.UIRunWindow;
   WinComboBox uIOpenComboBox = uiMap.UIRunWindow.UIItemWindow.UIOpenComboBox;
   WinButton uICancelButton = uiMap.UIRunWindow.UICancelWindow.UICancelButton;

   #endregion

   //1st Run

   Keyboard.SendKeys("R", ModifierKeys.Windows);
   isExists = uIRunWindow.WaitForControlExist(7000);
   Console.WriteLine("Is Run Window Appears :: " + isExists); 
   Mouse.Click(uICancelButton);
   Playback.Wait(2000);
   isExists = uIRunWindow.WaitForControlNotExist(7000);
   Console.WriteLine("Is Run Window Closes :: " + isExists);

   //2nd Run 

   Keyboard.SendKeys("R", ModifierKeys.Windows);
   isExists = uIRunWindow.WaitForControlExist(7000);
   Console.WriteLine("Run Window Appears :: " + isExists); 
   Mouse.Click(uICancelButton);
   Playback.Wait(2000);
   isExists = uIRunWindow.WaitForControlNotExist(7000);
   Console.WriteLine("Is Run Window Closes :: " + isExists);

}

上記のプログラムでは、実行ウィンドウが存在するにもかかわらず、2 回目の実行イベント中に値が false として返されます。

私が遭遇した回避策は、1回目と2回目の実行に2つの異なるオブジェクトを使用するか、ここに示すようにUIMapオブジェクトを再初期化することです

このシナリオで他の解決策やベストプラクティスがあれば助けてください

4

2 に答える 2

2

検索結果と MSAA/UIAutomation によって作成されたツリーがキャッシュされます。コントロールの検索構成では、コントロールを再作成する必要なく、問題を解決する AlwaysSearch を有効にすることができます。

于 2012-05-30T12:53:04.090 に答える
1

確かに、ウィンドウが閉じられた後、uIRunWindow参照は「使用済み」であり、再初期化する必要があります。

テストを複数回実行するための完全に正しいアプローチは、同じステートメントを繰り返す代わりにfor()ループを使用することです。uiMap割り当ての前にループを開始して、新しいマップを取得します。

for (int test = 0; test < 2; ++test) {
    UIMap uiMap = new UIMap();
    // etc..
}
于 2012-05-28T19:16:21.530 に答える