2013/02/07

SikuliスクリプトでのUI操作自動化を試してみる

SikuliスクリプトOpenCVを使った画像認識を利用して、GUI操作の自動化を行うスクリプトです。

指定した画像に一致した領域にカーソルを動かしてクリックさせたり、キーボードでの入力をさせたりすることができます。

そこで、今回はSikuliがUIテストに利用できるのかどうかを調べるために、iOSシミュレータに対してSikuliスクリプトを試しに使ってみました。

なお、MITのUIデザイングループが始めたオープンソースの研究プロジェクトであり(ソースはGitHubにあります)、現在はコロラド大学ボルダー校Sikuli Labがメンテナンスしているようです。

ダウンロードから起動まで

Sikuliのサイトのダウンロードページからdmgファイルをダウンロードします。これをマウントして実行するだけです。

なお、Lion以降を利用している場合には、Gatekeeperの設定によって実行できないことがあります。 そのときは、Appleのサポートページを参照して、「すべてのアプリケーションを許可」してください。

なお、Terminalから無理矢理実行することも可能です。

> /Volumes/Sikuli-r930-osx-10.6/Sikuli-IDE.app/Contents/MacOS/JavaApplicationStub64

簡単な例

Sikuliを起動すると、次のようなIDEが表示されます。 真ん中はエディタ部で、スクリプトを書いていきます。左のパレットにはよく使いそうなスクリプト命令があります。

今回はその中からclickをクリックしてください。

画面が暗くなり、画像選択モードになります。 ここではクリックさせたい領域を選択します。画像認識を利用しているので、他と間違えないようなうまい範囲を選択してください。

今回は、起動中のiOSシミュレータ(で起動しているアプリケーション)から次の領域を選択しました。

すると、エディタ部にclick命令が追加されました。

さらに、エディタにtype("sample")を追加してから実行ボタンをクリックしてください。

すると、カーソルが虫眼鏡に移動してからクリックされます。それによって検索フィールドにキーボードフォーカスが与えられます。

そして、type命令は与えられた文字列をキーボード入力するので、結果的に検索フィールドにSampleと入力されます。

パターンの詳細設定

画像認識に用いられる画像をSikuliではパターンと呼びます。

エディタ上で画像のアイコンをクリックすると、このパターンについての詳細な設定を行うことができます。

Matching Previewでは画像認識の類似度と最大何個マッチさせるかを指定でき、そのときの認識領域が上プレビューで確認できます。

Target Offsetではクリックさせる場所を調整できます。

ちなみに、パターンは左上のTake screenshotで作成できます。

findAllで全ての要素を取得する

続いて、もう少し複雑な例をみてみましょう。

iOSシミュレータ上の画面が次のような状態であるとします。

このときに、次のようなSikuliスクリプトを実行するとどうなるでしょうか?

実行すると、まず設定をクリックして設定画面に行きます。そして、次のclick命令のパターン画像が「写真とカメラ」のアイコンと一致するのでこれがクリックされます。

続いて、オフになっているトグルスイッチをすべて見つけてきて、それぞれに対してクリックを行います。

結果として次のようになります。

なお、設定がバックグラウンド実行していた場合には、設定がアクティブになったときにトップレベルにいないことがあります (例えばSafariの設定ページなど)。

それに対処するには、例えば、「写真とカメラ」のアイコンを発見するまで上に戻るようにする、などする必要があります。

ちなみに、既にお気付きの方もいるかと思いますが、SikuliスクリプトはJythonです。

コマンドラインからのスクリプト実行

Sikuliではコマンドラインでスクリプト実行させることができます。

そのためには、まずメニュー→File→Export executable…で実行可能ファイルを作成します。

これで、実行させることができます。なお、-sはエラー発生時に標準エラーに出力させるオプションです。

> /Volumes/Sikuli-r930-osx-10.6/Sikuli-IDE.app/Contents/MacOS/JavaApplicationStub64 -s ~/Documents/my_sample_exec.skl
[info] Sikuli vision engine loaded.
[info] Mac OS X utilities loaded.
[info] VDictProxy loaded.
[log] CLICK on (543,658)
[log] CLICK on (208,1256)
[log] CLICK on (669,1108)
[log] CLICK on (669,1518)
[log] CLICK on (669,800)
[log] CLICK on (669,1606)

普通に保存した場合でも実行できるようなのですが、手元の環境では動作しませんでした。

  File "/Users/safx/Documents/my_sample.sikuli/my_sample.py", line 1, in <module>
    click("1360159491826.png")
         :    
org.sikuli.script.FindFailed: FindFailed: can not find 1360159491826.png on the screen.

保存した中身

普通に保存した場合は拡張子が.sikuliのディレクトリが作成されます。

> ls ~/Documents/my_sample.sikuli | cat
1360159491826.png
1360159508447.png
1360159829904.png
if.png
my_sample.html
my_sample.py

Pythonファイルの中身もまんまです。

> cat ~/Documents/my_sample.sikuli/my_sample.py
click("1360159491826.png")
while not exists("1360159508447.png"):
    click("1360159829904.png")
click("1360159508447.png")
for i in findAll("if.png"):
    click(i)

実行形式にした場合は拡張子が.sklとなりますが、実は単なるzipです。

> unzip -l ~/Documents/my_sample_exec.skl
Archive:  /Users/safx/Documents/my_sample_exec.skl
  Length     Date   Time    Name
 --------    ----   ----    ----
    18901  02-06-13 23:25   1360159491826.png
     8676  02-06-13 23:25   1360159508447.png
     1730  02-06-13 23:25   1360159829904.png
     4124  02-06-13 23:25   if.png
     2276  02-06-13 23:25   my_sample.html
      165  02-06-13 23:25   my_sample.py
      165  02-06-13 23:25   sikuli_exec.py
 --------                   -------
    36037                   7 files

まとめ

Sikuliの導入と利用法について簡単に紹介しました。Jythonベースなので、わかりやすいですし、複雑な処理も書くことができそうです。

うまくやれば、iOS SimulatorのUIテストにも利用できそうですので、機会があればそこらへんについても紹介したいと思います。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。