- [Vue.js]時計?タイムコードを表示するWebアプリ
- (2021/11/16)
- ポエム
- (2020/09/30)
- メトロノームアプリをリリース
- (2017/04/22)
- Sikulix勉強中:便利関数
- (2017/02/25)
- [JavaFX]学習メモ
- (2016/09/22)
「sikulix」というアプリを使うことがあって、ちょっと遊んでいます。 sikulixは、画面に表示されているボタンやリンクを画像認識するソフトウェアです。テスト自動化にも使えます。
sikulixの勉強がてら、便利関数を幾つか作りました。現状の成果ということで、ここに添付して説明したいと思います。
# utility function import time # wait and click # @param picture a string of picture file name or a Pattern instance # @param time a integer of timeout # @throws Exception when timeout def wc(picture, time): pic_name = picture if isinstance(picture, Pattern): pic_name = picture.getFilename() print "> wc " + pic_name target = exists(picture, time) if target: click(target) else: print "> ->wc pic not found:"+pic_name raise Exception("wc error. pic not found "+pic_name) # find and click # @param picture a string of picture file name or a Pattern instance # @param time a integer of timeout def fc(picture, timeout): pic_name = picture if isinstance(picture, Pattern): pic_name = picture.getFilename() print "> fc %s %d"%(pic_name, timeout) start_time = time.time() while(start_time + (timeout/1000.0) > time.time()): try: icons = findAll(picture) sorted_icons = sorted(icons, key=lambda m:m.y) print "> ->found:"+pic_name target = sorted_icons[0] click(target) return except: print "> ->not found... continue:"+pic_name continue print "> ->not found... timeout!" raise Exception("fc timeout") # wait and keep clicking until the specified picture appears # @param picture a string of picture file name or a Pattern instance # @param loc a Location instance specifying a point to click untile picture appears def wkc(picture, loc): while(True): if exists(picture): print "> wkc end" return else: print "> wkc click (%d, %d)" % (loc.x, loc.y) click(loc)
※引数の「画像」について
画像となっている部分は、パターンオブジェクト、画像ファイル名のどちらの型でも受け付けます。Sikulixの関数には、見つけたい画像を画像ファイル名だけでも指定できますが、Patternクラスのインスタンスを作成して類似度(similarity)や、オフセット(targetOffset)を合わせて指定することができます。そのため、作成した便利関数では、ファイル名、Patternオブジェクトのどちらも受け付けるようにしました。
wc関数
指定された画像が表示されるまで、画像認識を続けます。見つけたら、見つかった部分をクリックします。
最初の3行はログ出力のための画像ファイル名の取得を行っています。
5行目のexists関数呼び出しで、画像認識を行います。戻り値はMatchオブジェクトで、見つからなかった場合はNoneが得られます。見つかった場合は、Matchオブジェクトをクリック対象とします。見つからなかった場合は、エラーを出力して例外を発生させます。
exists関数の代わりにwait関数を使っても良かったのですが、独自のログを出力して分かりやすくしたかったため、exists関数を使用しています。
fc関数
指定された画像が表示されるまで、画像認識を続けます。複数見つかった場合、一番上にあるものをクリックします。wc関数を発展させたものです。
最初の3行は同じく、ログ出力のための画像ファイル名の取得を行っています。
5行目では、タイムアウトを計算するために、現在時刻を取得しています。次の行で、タイムアウトの判定を行っています。(time.time関数では、秒単位で時刻を返すため、timeout引数を1000で割っています)
8行目では画像認識にて見つかったすべてのMatchオブジェクトを返すfindAll関数を呼び出しています。得られた結果を、次の行でソートしています。ソートに使うキーの指定は、key=lambda m:m.y
であり、Matchオブジェクトの属性"y"でソートされることになります。
ソートされたMatchオブジェクトのリストのうち、先頭のオブジェクトを取り出してクリック対象としています。クリック後は、関数を抜けます。画像認識で見つからなかった場合は、findAll関数にて例外が発生します。ログを出力して、whileの中をループします。
whileのループが終わるのは、タイムアウトしたときになりますので、ログを出力して、例外を発生させます。
wkc関数
指定された画像が表示されるまで、画像認識とクリックを続けます。クリックする場所は引数で指定します。画像が見つかっても、その場所はクリックしません。
1行目から無限ループになっています。ループの終了条件は、2行目の「画像が見つかったら」です。
画像が見つからない場合は、5行目のelse節に入ります。引数で指定された位置(Locationオブジェクト)をクリックします。