4

アプリケーションのテストを自動化しようとしていますが、トラブルシューティングに苦労している問題に悩まされています。

アプリケーションには標準のWindowsボタンがあり、AutoITとUser32dllの両方でこれらのボタンのいくつかをクリックしてみました。ボタンが適切にクリックされることもあれば(イェーイ!)、失敗することもあります(ブー!)-しかし、さらに悪いことに、AutoITはボタンをクリックした(ダブルブー!)と誤検知(トリプルブー!)を生成すると確信しています。納得しているのを見たとき、クリックが成功しなかったのに成功したということです。

Win Server 2K8でアプリケーションを実行していますが、このアプリケーションにはMDIウィンドウを使用する以外に特別なことはなく、一部のボタンはMDIウィンドウに含まれています。ただし、一部はMDIウィンドウ内にありません(たとえば、親ウィンドウが作成される前のログインウィンドウ)。

コマンドの順序は次のとおりです。

ウィンドウ内のボタンを見つける(成功、常に)ウィンドウを前面に移動する(成功)ウィンドウをアクティブにする(成功)ボタンをアクティブにする(成功)ボタンにフォーカスする(成功)ボタンにフォーカスがあり、ボタンが有効になっている場合は、クリックして。(成功/失敗、予測できない動作。なぜ成功するのか、なぜ失敗するのかを絞り込むことはできません...)

その他の情報:

注文でボタンがクリックされている場合があります。これにより、別のウィンドウが開きます。そのウィンドウを閉じてから、ボタンをもう一度クリックします。今回は何も起こりません。それ以外の場合は、期待どおりに機能します。

管理者として実行していますが、UACは完全に無効になっています。

私の知る限り、これはタイミングの問題ではありません。ボタンをクリックする前に、ボタンがフォーカスされ、有効になっていることを確認し、ボタンの周りにフォーカスされたハイライトが表示されることを確認します。

また、前述したように、単純なUser32 / SendMessage呼び出しだけでこれを試しましたが、これも失敗します。

最後になりましたが、これは、アプリケーションを手動で操作した場合には発生しません。私はいつも実際のボタンクリックを機能させてきました。

何かご意見は?

アップデート

これが私が言及すべき方程式の別の変数です-これはVMで起こっています(それは私がそれを実行する必要がある場所だからです)。自分のマシンで限定的なテストを行うことはできますが、実際のテストを行うには、VM上にある必要があります。私自身の開発ボックスをクリックすることは信頼できるようであり、これはさらに不可解なものになります。

私はこれを別のVMで試してきましたが、そこでも機能しているようです。2つのVMは、同じバージョンのWindows、同じバージョンのアプリケーション、同じバージョンのAutoITなどを実行しています。

私はそれを1つの詳細に減らしました-運が良ければ、私は自分自身を構成することができず、構成を変更するためにチケットを入れる必要があります。構成の違いは次のとおりです。

動作していないVMで、デバイスマネージャーはvmwareマウスであるマウスを表示します。動作しているVMで、デバイスマネージャはPS/2マウスであるマウスを表示します。明らかにどちらもソフトウェアマウスですが、VMWareマウスの動作が異なり、ボタンのクリックが常に機能するとは限らないのではないかと思います。私の理解では、User32 SendMessage呼び出しを使用しても実際にはマウスは使用されず、代わりにマウスが送信したのと同じメッセージが送信されるため、これが解決策としてどの程度可能性があるかはわかりませんが、一見の価値があります。 ..。。

4

3 に答える 3

2

Focusボタンの編集に成功したとのことですが、 ?Spacebarではなくイベントを送信してみましたMouseClickか?

Send("{SPACE}")

(それが構文だと思います。私は実際には AutoIt の常連ではありません)

通常、スペースバーは、ボタンやチェックボックスなど、ほとんどのクリック可能なコントロールを操作するために使用できます。私の経験では、シミュレートされたマウス クリックやControlClicks. お悔やみ申し上げます。

ボタンがクリックされたことの検出に関しては、おそらく最も簡単な方法は、ボタンをAutoIT検出できるフォームに変更することです。たとえばReady、ユーザーがボタンを押すまで続くステータス ラベルです。ユーザーがボタンを押すと、テキストが に変わりますProcessing。必要に応じて、ラベルを非表示にする (またはフォームの境界の外に配置する) ことができる場合があります。これにより、ユーザーはラベルを表示できなくなりますが、AutoIt は表示できます。

于 2012-02-14T22:59:51.653 に答える
0

あなたのケースをシミュレートしましたが、Windows 7で 100% 動作します。

using System.Runtime.InteropServices;

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

void ClickFocusedControl()
{
    const uint KEYEVENTF_EXTENDEDKEY = 0x1;
    const uint KEYEVENTF_KEYUP  = 0x2;

    keybd_event(13, Convert.ToByte(0), KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero); //Generates a KEY_DOWN
    keybd_event(13, Convert.ToByte(0), KEYEVENTF_KEYUP, UIntPtr.Zero); // Generates a KEY_UP
}
于 2012-02-19T21:40:45.327 に答える
0

この質問を投稿するまでに、おそらくこの問題を解決することに成功しましたが、まだ良い答えがないので、私のものを投稿します。

Windows Server 2008 R2 を実行している仮想マシンでも同じ問題が発生しました。キーストロークを送信したり、Win32 API SendMessage を介して特定のプログラム (およびそのメイン ウィンドウ) に何も実行したりできませんでした。

このQ/Aによると、これは UIPI の問題です (これは Windows Vista 以降にあります)。この問題を解決するには、UAC をオフにするだけです。私はそれをテストし、それは動作します。私が提供したリンクから、より多くの代替手段を見つけることができます。

于 2012-06-08T16:38:15.513 に答える