[test][automation] sikuliを使ってGUI操作を自動化する

## はじめに
sikuliは画像認識(OpenCV)を利用したGUI自動操作ツールです。
操作対象を画像としてマッチングするため、スクリーン上に表示されているものであればアプリケーションの種類を問わず操作することができます。
スクリプトは[jython](http://www.jython.org/)で書きます。
詳細は[公式サイト](http://www.sikuli.org/)を参照して下さい。
開発者向けに[API](https://github.com/RaiMan/SikuliX-2014)も公開されています。

今回はSikuli 1.0.1のインストール方法と簡単なサンプルを紹介します。

## インストール手順(for windows 7)
### 1. JDKの準備(割愛。JDK6,7で動きました)
### 2. ダウンロード
1. [公式サイト](http://www.sikuli.org/)の"SikuliX Package - Learn More and Get It"を選択
2. "SikuliX powered by RaiMan"の"Stable Version"を選択
3. "launchpad"の"sikuli-setup.jar"をダウンロード

### 3. インストール
1. 適当なフォルダを作成し、sikuli-setup.jarを置く(例としてC:\sikuli\とする)
2. "sikuli-setup.jar"をダブルクリック(runSetup.cmdとSikuliX-1.0.1-SetupLog.txtが生成される)
3. "OK"を押す

![rapture_20140808230953.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/3ca81e4a-8713-8d20-6841-3a411d9089bb.jpeg)
4. 新たにフォルダに生成された"runSetup.cmd"をダブルクリック
5. "OK"を押す
![rapture_20140808231023.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/9e53bf60-d506-d20d-5748-d06f227e4c40.jpeg)
6. "Pack1"を選択して"Setup Now"を押す(※1 Proxy環境の方は後述)
![rapture_20140808231036.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/60b8d576-19d6-9b9c-9ddc-adbca5fce927.jpeg)

※1:Proxy環境でダウンロードが失敗する場合は以下の方法でjarファイルを取得する。
1. 上記の手順で作成したフォルダ(C:\sikuli\)に"Downloads"フォルダを作成する
2. [RaiMan's stuff for Sikuli](https://launchpad.net/raiman/+milestone/1.0.1)より、"1.0.1-1.jar"をダウンロードする
3. "1.0.1-1.jar"を"Downloads"フォルダに配置する
4. 3. インストールの4から実施する

### 4. 起動
1. 新しく生成された"runIDE.cmd"をダブルクリックして起動する
![rapture_20140808233300.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/205a20eb-ca66-db53-8a7a-bdd33a172578.jpeg)

## チュートリアル：「sikuli公式サイトを検索する」
以下の手順をsikuliに実行させます。
1. デスクトップにあるブラウザのアイコンをダブルクリックする(ホームページはgoogle.co.jpとする)
2. Googleのtopページが表示されるまで待つ
3. テキストボックスに"sikuli"と入力する
4. 検索ボタンを押す
5. 検索結果を待つ
6. 検索結果から公式サイトのリンクをクリックする
7. 公式サイトのロゴが表示されるまで待つ
8. 公式サイトのロゴ見つけたら終了

### スクリプト作成手順
1. sikuliを起動する
2. 左端のコマンドリストから"doubleClick"を選択する<br>
![rapture_20140809001241.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/5f770f68-1ee4-c8b9-3f15-f3ee2960a11d.jpeg)
3. キャプチャモードに切り替わるのでブラウザのアイコンをドラッグする<br>
![rapture_20140809012154.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/ae62ad10-4566-f04c-c54c-609e96675266.jpeg)
4. コードが生成される<br>
![rapture_20140809002455.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/15d1264c-6fba-292f-2fb5-096cdaa7dc26.jpeg)
5. 左端のコマンドリストから"wait"を選択する<br>
![rapture_20140809002603.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/00f467e8-a26d-7ee0-44da-85d7f845b865.jpeg)
6. Googleのトップページのアイコンを選択する<br>
![rapture_20140809012433.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/6388ff1a-9f92-b543-f09a-18d07d79243c.jpeg)
7. コードが生成される<br>
![rapture_20140809002736.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/6487c914-32cf-61dd-0eab-6f6c238f926c.jpeg)
8. 何秒waitするか指定できるので最大10秒待つことにする<br>
![rapture_20140809002926.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/5fa3dcaa-e7af-75fd-9460-03e064756481.jpeg)
9. コマンドを選択→キャプチャ取得を繰り返してこんなスクリプトを作る<br>
![rapture_20140809003130.jpg](https://qiita-image-store.s3.amazonaws.com/0/13446/dfc420af-e04a-a122-ab30-8829ce6fa70b.jpeg)

ここで、最後のpopupはアラートを表示させるコマンドです。コマンドリストに無いものは、[ドキュメント](http://sikulix-2014.readthedocs.org/en/latest/genindex.html)を参照して探して下さい(tips集のようなものを次回書く予定)
10. 実行ボタンを押す(保存するか質問されるので適宜選択する)
11. うまく動かない場合はトライ・アンド・エラーしてみてください。

## 所感
* ポジティブな感想
  * 何より凄いのはWebアプリ→Androidエミュレータ→OS操作といったように様々な対象を横断した操作ができること
  * jythonが比較的取っ付きやすいためテストを回すという目的を(保守性を考えなければ)簡単に達成できる
  * jython(python)が書けると自由度が増す、また保守性を考慮した設計も応用できる
  * コードに画像が入ってくるというなかなか衝撃的な絵面
  * 慣れてくると何でも自動化できそうなスーパーハカー気分を味わえる


* ネガティブな感想
  * 認識パラメータのチューニングが必要になる場合は少し面倒
  * 認識が不安定になる時がある
  * デフォルトだと操作が遅い
  * 進まない1.1.0のリリース(頑張れRaiMan!!)。。。

次はテストでよく使うメソッドの紹介などを中心に紹介したいと思います。

## リンク
* 公式サイト
  * http://www.sikuli.org/
* 開発者サイト
  * http://www.sikulix.com/