SikuliスクリプトのTips
GUI(グラフィカルユーザインタフェース)の操作(テスト)を画像認識で自動化できるツール「Sikuli(Script)」のTipsです。 JRubyで書いていますが、Jythonでもあんまり変わらないと思います。
Ruby力はないです。
Sikuliについて
インストールと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')