Tales of Verifier

テストエンジニアが自分の将来に不具合が起こらないことを確かめ合うRPG

AutoItを使ってダイアログの出現を検知する

GUIのテストを自動で回してるときに、〇〇ダイアログが出てくるかor出てこないかチェックしたいというシチュエーションもある。
AutoItだと便利な関数、AdlibRegisterが用意されている。

AdlibRegisterの説明

詳細はこちら。
Function AdlibRegister
第一引数で指定した関数を、第二引数(ミリ秒)感覚で実行する。
メインの処理をしながら裏で一定時間おきに別の関数を実行できるので、マウス操作やキーボード操作をしながらダイアログの検出を行うことができる。

サンプル

ここでは、「警告」というタイトルのダイアログが出たらそれを消して、警告ダイアログが見つかった旨を表示させる、という処理をAutoItのAdlibResigsterを使って実現してみる。

;AdlibRegisterを使い、一定時間おきに特定の関数を実行する
;第二引数を省略するとデフォルトの250msおきに実行される
AdlibRegister("DetectDialog")

;何かしらの処理。簡単のため1000秒待機。
Sleep(1000000)

;警告ウインドウを検知する関数
Func DetectDialog()
	if WinExists("警告") Then
		WinClose("警告")
		MsgBox(0, "発見", "警告ダイアログを発見しました。")
	EndIf
EndFunc

上のAutoItのコードを動かすためには、警告ダイアログを出す何かが必要。というわけでいいかげんに作った。
f:id:yoshikiito_el:20140624220438p:plain
「ただの警告」を押すと、5秒後に「警告」というタイトルのダイアログを出す。
「任意のタイトル」を押すと、5秒後に左のテキストボックスに入れた文字列をタイトルに持つダイアログを出す。

AutoItを動かしたあとに「ただの警告」を実行

上で書いたAutoItのコードを実行した状態=警告ダイアログが無いかチェックしている状態で、「ただの警告」を押してダイアログを出してみる。
f:id:yoshikiito_el:20140624220745p:plain
すると、警告ダイアログが出てもすぐWinCloseされて、発見ダイアログが出てくる。

「警告 - 不正なアクセスを確認しました」というダイアログは検知してくれるのか

先に書いたAutoItのコードでは、「警告」というタイトルを持つダイアログを検知して消すようにしていた。
じゃあ、「警告」の後ろに警告内容が書いてあるようなダイアログだと検知してくれるのか。
結論を先に言うと、検知する。・・・デフォルトでは。
このウインドウタイトルのマッチングについてはWinCloseがどうとかAdlibRegisterがどうとかとはまた別で、AutoItのオプションとして用意されている。
詳しくは以下を参照。
Window Titles and Text (Advanced)

本当に「警告」というタイトルのダイアログだけを検知したければ、ウインドウタイトルをマッチするときのモードを完全一致に変えてやる必要がある。
もしくは、ウインドウタイトルじゃなくウインドウハンドルとか別の要素で判別するか。
今回の話とはそれるのでまた別の機会に。