6

新しいネイティブMicrosoft UIオートメーションインターフェイス3.0(VC++ 2010、Win7)を使用して自動テスターアプリケーションをプログラミングしようとしています。テスト中のアプリケーション(AUT)はWPFアプリケーションです。旧式のUIオートメーションツリー

ほとんどすべてが正常に動作します...私は、イベントハンドラをインストールし、ツリーをナビゲートし、さまざまな条件を使用して検索要素とそれらのパターンを使用して見つかった要素を制御することができます。

しかし、昨日、私は私が絶望葉行動が見つかりました:私のAUTのUIAツリーは、単にその主なメニューボタンのいずれかをクリックすることにより、そのGUIメインパネルを切り替えた後に更新されていませんが。

メインメニューボタンをクリックした後、私は AUTのGUIで新しいウィジェットを見ることができますが、UIAツリーはまだメインメニューボタンをクリックする前にそこに されているコントロールが含まれています。 (古い)UIAツリーは、検索機能やウォーカーを使用して完全に読み取ることができますが、ウィジェットがもう存在しないため、書き込むことはできません。

これはまさに、古くなったキャッシュが存在することになるように...しかし、私はまったくのキャッシュUIA機能を使用しないでくださいに見えます。なし。決して。どこにもない。

私はプログラム的UIAツリーの更新を行うことが...どのUIA機能を呼び出すことによっても、テスターアプリケーションを再起動しても、前後AUTのGUIを切り替えることでもないことができませんでした。 これは毎回発生しません。時には、メイン・ボタンをクリックした後、ツリーが正しく最新のものになり、すべて正常に動作します。しかし、実行のほとんどは失敗します。 UIAツリーを確実に更新する唯一の(神秘的な)方法があります:inspect.exeを使用します。 AUTのUIAサブツリーを簡単に調べるためにinspect.exeツールを使用すると、問題は突然消え、テスターアプリケーションは実際の更新されたツリーにすぐにアクセスできます!もちろん、AUTを再起動した後に問題が再現されます。

(別のアプリケーションの)UIAツリーを更新するためにinspect.exeは何を更新しますか?どのようにキャッシングを使わずに要素を削除することはできますか?私は何を取りこぼしたか?

私は本当に助けが必要です。


[OK]を、いくつかのより多くの調査結果:

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

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

これはAPIのバグだと思います。 Microsoft Connectの私の現在の経験を考慮すると、私はそのショーストッパで失われてしまった:-(

誰か考えていますか?


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

+0

私は同様の[problem](http://stackoverflow.com/questions/11014771/contentcontrol-is-not-visible-when-application-starts-via-ui-automation-test-bu)を持っています。解決策があればお勧めします! – stukselbax

+0

ツリーをどのようにナビゲートしますか?通常は、更新後のある時点で新しい開始要素(ルート/最上位)を取得する必要があります。しかし、..あなたはプログラムの再起動後にも問題があると言いますから? UISpyなどを使って強制的にツリーを更新するのに役立つのですか?さらに、UI要素を取得するためにさまざまな方法を試しましたか?要素上にマウスを置いたときにAutomationElement.FromPointを使うのと同じですか?また..私はいくつかのアプリケーションで気づいた、UIツリーが途方もなく壊れている、いくつかのリンクがどこにも、または周期的につながることを意味します。だから下りが上がっても必ずしも出発点が得られるとは限りません。 –

+0

多分あなたは、いくつかのコードを提供することができ、interessting問題音。 – Kooki

答えて

2

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

1

これはかなり古いですが、Inspect.exeが他のアプリケーション用にUIAツリーをリフレッシュする方法を理解しました。オプションメニューを見てください。「SPI_SCREENREADERフラグ」という項目があります。デフォルトでチェックされています。

あなたのコードでこれを行うと、あなたはおそらく、新鮮なUIAツリーました:

てSystemParametersInfo(SPI_SETSCREENREADER、TRUE、NULL、SPIF_UPDATEINIFILE | SPIF_SENDCHANGEを)。

PostMessage(HWND_BROADCAST、WM_WININICHANGE、 SPI_SETSCREENREADER、0);

関連する問題