[iOS] Appiumを試したメモ - 起動させるまでの道のり


はっきり言ってめっちゃハマりました( ;´Д`)
ので、あったことをつらつらとメモしていこうと思います。

まずは[こちらから諸々をダウンロード](http://appium.io)。
利用するにはNode.jsが必要なので、インストールしていない場合は事前にインストールしておく必要があります。

*ちなみに`nodebrew`などのNode.js自体のバージョン管理ができるツールから導入したほうがいいでしょう。*

Node.jsが準備出来たら、以下のように必要なモジュールをインストールします。

```shell
npm install -g appium
npm install wd
appium &
```

appiumはサーバです。
起動すると以下のようにメッセージが表示され、接続を待機します。
（`wd`はWebDriverです。Seleniumの作者がAppiumを作っているので、Seleniumも調べてみるとより分かりやすいと思います）

```shell
info: Welcome to Appium v1.0.0-beta.1 (REV 6fcf54391fb06bb5fb03dfcf1582c84a1d9838b6)
info: Appium REST http interface listener started on 0.0.0.0:4723
info: socket.io started
```

## Rubyのインストール

ちょっと簡単にテストためそーっていう気軽な気持ちで始めたものの、各所でハマるハマる。

* Mac OSXに最初から入ってるRubyだとselenium-webdriverがインストール出来ない
* rbenvでruby 2.1.1がインストールできない
* やっとruby新しくしたもののselenium-webdriverのdocumentインストールで止まる

と散々でした。
最終的には`rbenv`を使って`ruby 2.2.0dev`を手動ビルドし、ドキュメントのインストールをスキップすることでなんとかテスト起動まで持って行きました。

### rbenvのインストール

インストールでは以下の記事を参考にしました。

* [rbenvとruby-buildでRuby環境を最新に保つのんなー](https://gist.github.com/mochiz/4736183)
* [OS X で rbenv を使って ruby 1.9.3 or 2.0.0 の環境を作る](http://qiita.com/sora_h/items/9dd797f42e7bea674705)

ちなみに途中でたエラーはこんな感じのものです↓

```shell
Last 10 log lines:
compiling ossl_x509crl.c
1 warning generated.
compiling ossl_x509ext.c
compiling ossl_x509name.c
compiling ossl_x509req.c
compiling ossl_x509revoked.c
compiling ossl_x509store.c
installing default openssl libraries
linking shared-object openssl.bundle
make: *** [build-ext] Error 2
```

OpenSSLやreadlineがうんぬん、という記事を見かけて色々やってみたものの解決せず。
結局、手動ビルドの方法でインストールしました。

### selenium-webdriverのインストール

なぜかこれが最初から入っているRubyではインストールできませんでした。
なので、`rbenv`を使って`ruby 2.2.0dev`をインストールし、そこから改めてインストール。

ただ、そのインストールでもドキュメントのパースで止まる（CPU使用率が100%になる）という問題があり、以下のようにドキュメントのインストールをスルーする設定を書いて対処しました。

```shell
$ vi ~/.gemrc
```

```.gemrc
gem: --no-ri --no-rdoc
```

### rspecをインストール

こちらも`gem`からインストールします。

```shell
sudo gem install rspec
```


これで諸々の準備が整いました。



## Appium起動・・instrumentsのcrashでハマる

準備出来ていざテスト！　というところでまたハマりました。
なぜかinstrumentsのstart upでcrashする。
色々なエラーでググってみるもこれといった解決策なし。

色的に緑だったのでしばらくエラーと気付かずスルーしていたんですが、どうもよくよく見てみるとnodeが見つからないよって書いてあった。

```shell
Script threw an uncaught JavaScript error: Could not find node, where is it?
```

いやいやいや、appiumさん、あなたnodeで動いてるんですけど、とか思いながらも検索してみるとAppiumのgithubのissueに上がってた。

回答としてはnodeの検索ロジックを変えてみるよ、ってことだったんだけど、ちょっと前に立てられたものだったのでおそらくまだ解決したものは上がってない模様。
そこで、最終的に`/usr/local/bin/node`に対してnodebrewで入れたnodeへのパスをシンボリックリンクを張ってみて試すことに。
ドキドキしながらテストを実行すると・・・ **動いた！！！！！**

ということで、node見つからないんだけどって言われている場合はシンボリックリンクを張って解決するとうまくテストが動きます。


## 無事起動、そしてアプリ一掃へ( ;´Д`)

やっと動いたーと思っていたら、最後に問題がありました。
なんと、appiumはテスト完了後にデフォルトで（？）シミュレータの状態をclean upしてくれちゃうようです。
なのでテストが無事に終わったあとシミュレータを見ると、今まで開発時にインストールされていたアプリやらが綺麗さっぱりに。
まぁシミュレータなので大した問題にはなりませんが、毎回消されるのは困る。

ってことで、さらに調べてみました。
結論としては`--no-reset`フラグを立ててappiumを起動すると最後のclean upをしないようになるみたい。

いやーやっとこれでテスト自体を書いて行けます。道のりが長かった( ;´Д`)

## その他、色々メモ

Appiumを使うにはアプリをビルドしておく必要があります。（テスト実行時にアプリのパスを指定する）
ビルドには`xcodebuild`コマンドを使って行いますが、コマンドからだとうまくビルドできなかったのでメモ。

### 出ていたエラー

```shell
clang: error: invalid architecture 'arm' for deployment target '-mios-simulator-version-min=5.0'
```

最終的には[こちらの記事](http://stackoverflow.com/questions/13051479/xcodebuild-test-command-for-using-with-jenkins-doesnt-work/18325089#18325089)を見て引数を変えてみたら動きました。

引数に指定したのは以下↓

```shell
xcodebuild \
-project "any.xcodeproj/" \
-target ANY_TARGET \
-sdk iphonesimulator7.1 \
-arch i386 \
-configuration Debug \
VALID_ARCHS="armv6 armv7 i386" \
ONLY_ACTIVE_ARCH=NO \
TARGETED_DEVICE_FAMILY="1" \
clean install
```


## 参考にした記事

* [Finding Elements](http://appium.wikia.com/wiki/Finding_Elements)
* [xcodebuild test command for using with jenkins doesn´t work](http://stackoverflow.com/questions/13051479/xcodebuild-test-command-for-using-with-jenkins-doesnt-work/18325089#18325089)
* [UI Automation JavaScript Reference](https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html#//apple_ref/doc/uid/TP40009771)