2011-08-05 21 views
2

現在、Microsoft UIオートメーションライブラリとC#を使用してWindowsフォームアプリケーションを自動化しようとしていますが、パフォーマンスに関して大きな問題があります。 PropertyConditionを使用して単一要素を識別したり、ウィンドウのすべての要素を反復するには非常に時間がかかります(最大4分)。 AutomationElementを持ってすぐにすべてが問題ありません(例:GetCurrentPropertyValueが100ms以内に反応します)。Microsoft UIオートメーションライブラリのパフォーマンスが低い

パフォーマンスの低下は、1つのアプリケーションにのみ適用されます。私はソースにアクセスすることはできませんが、何かを変更またはチェックする必要がある場合は、責任あるプログラマーに話すことができます。私が知る限り、アプリケーションのいくつかのイベント(塗料など)が上書きされていました。アプリケーションの典型的なウィンドウは、FindAllメソッドによって見つけられる約100個の要素を含む。

UIオートメーションライブラリのCOMインターフェイスも試しましたが、これは約2倍高速ですが、これは実際には問題を解決しません。

誰もがこの問題を解決する方法を知っていますか、または同様の動作を経験しましたか?

答えて

1

メインループを詳しく見てみると、答えが見つかりました。ほとんどの場合、Application.Runのメインウィンドウを起動し、アプリケーションを実行するために使用されているが、何らかの理由で、次のコードを使用した:マイクロソフトUIオートメーションライブラリとして

[...]  
    MainForm.Show(); 
    while DoStop == false 
    { 
     System.Threading.Thread.Sleep(10); 
     Application.DoEvents(); 
    } 
[...] 

は、ウィンドウメッセージを使用して、すべてのSystem.Threadingを.Thread.Sleep(10);合計され、オブジェクトの検出が非常に遅くなりました。 Application.Runが使用されている場合、これは発生しません。

+2

正しく理解されていれば、パフォーマンスの低下は基本的にテスト中の誤って書かれたアプリケーションに関連していて、UIオートメーションフレームワーク自体には関係していませんでしたか? – tomalone

+0

オートメーションが使用されているUIのThread.Sleepコードですか?または、自動化を実行しているアプリケーションですか? Btw、4歳のSOの投稿が互いに2日以内に最初の2つのコメントを取得する確率はどのようなものですか? –

+1

@Tobias:Thread.Sleepでコードを書いた人は誰でも完全なばかだ。残念ながら、あなたの答えはUIオートメーションが極端に遅いことを観察している他のすべての人を助けるものではありません。自動化されたアプリケーションでこのような愚かなプログラミングエラーがなくても、UIAは大変なことです。バグがたくさんあり、機能が不足していて、スレッドセーフではなく、非常に遅いです。 – Elmue

関連する問題