7

新しいネイティブ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は何をしますか?キャッシュを使用せずに、なくなった要素にアクセスするにはどうすればよいですか?私は何を取りこぼしたか?

本当に助けが必要です。


わかりました、さらにいくつかの調査結果:

  1. UISpy.exeは、inspect.exeと同じようにUIAツリーを更新できます(inspect.exeは私と同じネイティブインターフェイスを使用しますが、UISpy.exeは.NETインターフェイスAFAIKを使用するため、これは特に奇妙です)。これは、これが一種のシステム全体で永続的なUIAの問題であり、純粋なネイティブUIAの問題ではないことを意味します。

  2. ビューを切り替えるにツリーにアクセスしなくても、問題は発生しません。つまり、テスターアプリケーションがメインメニューボタンをクリックしてビューを切り替える前にAUTのビューにアクセスしない場合、問題なく新しいウィジェットが表示されます。これは、ネイティブUIA APIのキャッシュの問題を強く示しています。キャッシュをまったく行わないため、これがどのように発生するかわからない場合でも同様です。内部キャッシングが行われているかどうか誰かが知っていますか?

これはAPIのバグである可能性があると思います。しかし、Microsoft Connectでの現在の経験を考えると、私はそのショートッパーに少し迷っています:-(

誰かアイデアはありますか?


スヌープツールもテストしました。Snoopを使用しても、InspectやUISpyのように一時的に問題が解決することはありません。Inspect.exeに関しては、別の詳細があります...一時的に問題を解決するには、AUTのサブツリーを折りたたんで展開するだけで十分です。

4

2 に答える 2

3

わかりました、これについて更新します。UIA はひどくバグが多いようです。要素のコンテンツ配列とその配列の長さを読み取ると、隠しキャッシュが更新されることがわかりました。また、タブのサブツリーが更新されていないが、別のタブに切り替えて元に戻すことで更新できる場合もありました (その場合、パターンによるコンテンツの読み取りは役に立ちませんでした)。どちらのケースも再現可能でしたが、予測または防止する方法は見つかりませんでした。また、多くのサードパーティの WPF コンポーネントにはバグがあるようです。最終的にその API を使用することを断念しました。

于 2012-12-23T15:03:25.840 に答える