新しいネイティブMicrosoftUIオートメーションインターフェイス3.0(VC ++ 2010、Win7)を使用して自動テスターアプリケーションをプログラミングしようとしています。テスト対象アプリケーション(AUT)はWPFアプリケーションです。
ほとんどすべてが正常に機能します...イベントハンドラーをインストールし、ツリーをナビゲートし、さまざまな条件を使用して要素を検索し、パターンを使用して見つかった要素を制御できます。
しかし、昨日、私は絶望したままの動作を見つけました。AUTのUIAツリーは、メインメニューボタンの1つをクリックしてGUIメインパネルを切り替えた後、単に更新されません。
メインメニューボタンをクリックすると、AUTのGUIに新しいウィジェットが表示されますが、UIAツリーには、メインメニューボタンをクリックする前に存在していたコントロールが含まれています。(古い)UIAツリーは、検索機能またはウォーカーを使用して完全に読み取ることができますが、ウィジェットが存在しないため、もちろん書き込むことはできません。
これは、古いキャッシュがあるように見えます...ただし、キャッシュUIA関数はまったく使用していません。なし。一度もない。どこにも。
UIAツリーをプログラムで更新することはできませんでした...UIA関数を呼び出したり、テスターアプリケーションを再起動したり、AUTのGUIを前後に切り替えたりすることはできませんでした。これは毎回発生するわけではありません。メインボタンをクリックした後、ツリーが適切に最新のように見え、すべてが正常に機能する場合があります。ただし、ほとんどの実行は失敗します。UIAツリーを確実に更新する(不可思議な)方法は1つだけです。inspect.exeを使用することです。inspect.exeツールを使用してAUTのUIAサブツリーを簡単に調べると、問題は突然解消され、テスターアプリケーションは実際の更新されたツリーにすぐにアクセスできるようになります。もちろん、AUTを再起動すると問題が再発します。
(別のアプリケーションの!!!)UIAツリーを更新するためにinspect.exeは何をしますか?キャッシュを使用せずに、なくなった要素にアクセスするにはどうすればよいですか?私は何を取りこぼしたか?
本当に助けが必要です。
わかりました、さらにいくつかの調査結果:
UISpy.exeは、inspect.exeと同じようにUIAツリーを更新できます(inspect.exeは私と同じネイティブインターフェイスを使用しますが、UISpy.exeは.NETインターフェイスAFAIKを使用するため、これは特に奇妙です)。これは、これが一種のシステム全体で永続的なUIAの問題であり、純粋なネイティブUIAの問題ではないことを意味します。
ビューを切り替える前にツリーにアクセスしなくても、問題は発生しません。つまり、テスターアプリケーションがメインメニューボタンをクリックしてビューを切り替える前にAUTのビューにアクセスしない場合、問題なく新しいウィジェットが表示されます。これは、ネイティブUIA APIのキャッシュの問題を強く示しています。キャッシュをまったく行わないため、これがどのように発生するかわからない場合でも同様です。内部キャッシングが行われているかどうか誰かが知っていますか?
これはAPIのバグである可能性があると思います。しかし、Microsoft Connectでの現在の経験を考えると、私はそのショートッパーに少し迷っています:-(
誰かアイデアはありますか?
スヌープツールもテストしました。Snoopを使用しても、InspectやUISpyのように一時的に問題が解決することはありません。Inspect.exeに関しては、別の詳細があります...一時的に問題を解決するには、AUTのサブツリーを折りたたんで展開するだけで十分です。