4

UI Automation COM-to-.NET Adapterを使用して、Windows 7 で FLASH コンテンツを再生するターゲットの Google Chrome ブラウザーのコンテンツを読み取ります。動作します。

コンテンツと要素を取得することに成功しました。しばらくはすべて正常に動作しますが、数時間後に要素にアクセスできなくなります。

0の子を(AutomationElement).FindAll()返します。

UIAutomation で使用される文書化されていない内部タイムアウトはありますか?

このIUIAutomation2 インターフェイスによると 2 つのタイムアウトがありますが、IUIAutomation インターフェイスからはアクセスできません。IUIAutomation2 は、Windows 8 (デスクトップ アプリのみ) でのみサポートされています。

したがって、タイムアウトがあると思います。デスクトップ ツリーの先頭から要素の検索と監視を再開する回避策を作成しましたが、要素はまだ利用できません。しばらくすると (どれくらいかはわかりませんが)、要素が再び利用可能になります。私の要件は、値を常にできるだけ速く読み取ることですが、この動作はアーキテクチャ全体に損害を与えます。3分のタイムアウトがあるとどこかで読みましたが、よくわかりません。

タイムアウトがある場合、それを変更することは可能ですか? 何かを再起動したり、何かを解放/破棄したりすることは可能ですか? MSDN で何も見つかりません。

何が起こっているのか、どのように解決するのか、誰にも分かりませんか?

4

1 に答える 1

1

このうまく配置された質問をありがとう。セットアップが大きく異なる同様の問題があります。私は Win7 を使用しており、C# から UIAutomationCore.dll を直接使用して、開発中のアプリケーションをテストしています。一連のアクションとイベント サブスクリプションなどを実行した後、断続的に UIA インターフェイスが機能しなくなるのを観察します (私の場合は約 8 ~ 10 分ですが、UIA インターフェイスを頻繁に使用しています)。

COM インターフェイスのディスパッチ、さまざまな場所でのスリープなど、さまざまなことが失敗しました。面白いことに、テスト中に AccEvent.exe (inspect.exe のような SDK の一部) を使用することができたのですが、イベントも AccEvent へのフローを停止していることがわかりました。したがって、停止したのはクライアントのインターフェイスではなく、応答を停止したのは COM サーバー (または UIAutomationCore が行うもの) でした。

UIA を使用すると追加の負荷がかかるため、解決策として (ほとんどの場合はうまくいくか、状況が大幅に改善されるようです)、テスト対象のアプリケーションに息抜きを与える必要があると判断しました。これはクライアントにスマートに設定されたスリープ ポイントかもしれませんが、一定時間スリープする代わりに、アプリケーションのプロセッサ負荷を監視し、それが落ち着くまで待ちます。

問題が発生したときに受け取る断続的なエラーの 1 つは、「... サブスクライバーのいずれにも電話をかけることができませんでした..」であり、私の検索の結果、CUIAutomation8 インターフェイスで改善されたという msdn ページが見つかりましたが、これはWindows8 固有のもので、まだ試す機会がありませんでした。

また、UI キャッシング (FindAllBuildCache) を増やすことで UIA の呼び出し回数も減らしたことも付け加えておく必要があります。別の質問での Guy の回答に感謝します:アプリケーションを監視している間、UI Automation イベントの受信が停止し、しばらくしてから再起動します。

于 2016-06-15T05:13:55.447 に答える