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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。