忍者ブログ

2007/03/04開始。ソフトウェア管理やDelerer SEの作者であるおにぎりくんの試行錯誤の記録です。
2024
前の月へ 04 : 12345678910111213141516171819202122232425262728293031 : 06 次の月へ
93  92  91  90  89  88  87  86  85 
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

「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オブジェクト)をクリックします。

PR
スポンサード・リンク
この記事にコメントする
Name
Title
Color
Mail
URL
Comment
Pass Vodafone絵文字 i-mode絵文字 Ezweb絵文字
フリーソフト指向::開発日記 by LapisCactus
忍者ブログ | [PR]

今日の聖書
自己紹介
名前:
LapisCactus (おにぎりくん)
Twitter:
Mail:
onigirikun_hsp@hotmail.com
自己紹介:
ふつうのしすてむえんじにあ。
趣味で「ソフトウェア管理」や
「TextView」を作っています。
仕事でもコンピュータを触っているのに
趣味も同じという。
健康に悪いですね。
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
ブログ内検索
最新CM
[03/03 kusakari]
[11/12 おにぎりくん]
[11/08 れい]
アクセス解析