読者です 読者をやめる 読者になる 読者になる

とある地味なブログ

プログラミングとお絵かきに関する雑記。

SikuliスクリプトのTips

プログラミング Sikuli

f:id:sujoyu:20160830152609p:plain

GUI(グラフィカルユーザインタフェース)の操作(テスト)を画像認識で自動化できるツール「Sikuli(Script)」のTipsです。 JRubyで書いていますが、Jythonでもあんまり変わらないと思います。

Ruby力はないです。

Sikuliについて

公式
RaiMan's SikuliX

インストールとHello World
[test][automation] sikuliを使ってGUI操作を自動化する - Qiita

Tips

領域が示している画像を確認する

image.png画像パターンにマッチする領域の下20pxの、領域の画像を確認するサンプルです。 出力されるファイルパスに画像が保存されています。

r = find('image.png').below(20)
p Screen.new().capture(r).getFilename

複数種のボタンのうちどれが現れるかわからない

ended = false

for _ in 10.times
  if exists('image1.png')
    ended = true
    # image1.pngパターンが現れた時の処理
    break
  end
  if exists('image2.png')
    ended = true
    # image2.pngパターンが現れた時の処理
    break
  end
end

unless ended
  raise 'image1もimage2も見つかりませんでした。'
end

OCR機能を使わずに数値を認識する

Region#text()が使えないときに、整数を認識するサンプルです。
0.pngから9.pngは、スクリーンショットを取る機能を使って埋め込んだ、各数字の画像です。

8と3、6と5などはデフォルトのsimilar(70)では誤認識する場合があるので、 パターン設定 -> マッチングプレビュー から設定するのをおすすめします。

def number(reg)
    arr = ["0.png", "1.png", "2.png", "3.png", "4.png", "5.png", "6.png", "7.png", "8.png", "9.png"]
    numbers = arr.map.with_index do |pat, i|
        if reg.exists(pat, 0)
            begin
                reg.findAll(pat).map{|r| [r.getX, i]}
            rescue => e
                []
            end
        else
            []
        end
    end
    numbers.flatten(1).sort{|a, b| a[0] <=> b[0]}.map{|a| a[1]}.join.to_i
end

p number(find('image.png').below(20))

しばらく動作させていると劇的に遅くなる

Mac環境で、SikuliXを1分ほど動作させると、clickなどの動作が死ぬほど遅くなるバグがあります。(SikuliX 1.1.0現在)

https://bugs.launchpad.net/sikuli/+bug/1447096

解決策は、.appから起動するのではなく、コマンドで起動すれば問題ありません。
コマンドから起動するには、インストーラ実行後に生成されるrunsikulixを使用します。

./runsikulix hoge.sikuli

JRuby Tips

JRubyにgemパッケージをインストールする

jruby-complete-<version>.jarの場所を確認します。
Macなら~/Library/Application Support/Sikulix/SikuliDownloadsにあると思います。
Windowsならファイル検索でjruby completeとか検索してください。

そのパスに移動して、以下のコマンドを実行します。

java -jar jruby-complete-<version>.jar --command gem install <gemの名前> --user-install

あとはgemの使い方を見ながら、スクリプト内でrequireすれば、gemが使えます。

JRubyからメールを送信する(Mac環境)

Jythonからなら普通に送信できるのですが、SikuliX内蔵のJRubyからだと送信できませんでした。 特定のパッケージをrequireするとSikuli IDEがクラッシュして落ちるので、原因を調べるのが難しいです。 Macなのが原因なのかもよくわかりません。 なので、コマンドラインからメール送信するのをおすすめします。

Macの場合、以下の記事が参考になります。

Macでコマンドラインやプログラムからmailを送る - Qiita

Windowsは適当に調べてください。

スクリプトは以下のように書きます。

system('echo "メールだよ。" | mail -s "めーる" example@example.com')