④AppiumでWebアプリのテストを実機で実行してみた【iOS編】


あわせて読みたい:
[①Appiumを使ってみた【iOS編】](http://qiita.com/kzm7/items/36629fe2a3c82e3e4933)
[②Appium＋JUnitで自動テストを書いてみた【iOS編】](http://qiita.com/kzm7/items/187ef263b6ac3ba7b3bd)
[③Appiumでどこまで出来るか試してみた【iOS編】](http://qiita.com/kzm7/items/85c31bda0fbe5f90a5b2)


# はじめに
今回はiPhone実機のSafariで、Webアプリのテストを実行する手順です。
結果的に起動には成功しましたが、正直思いっきりハマりました・・・。

　
# 事前準備

## ios-webkit-debug-proxyをインストール

MacからiOS実機のSafariを操作するために、`ios-webkit-debug-proxy`を使用します。
このツールはGoogleの[GitHub](https://github.com/google/ios-webkit-debug-proxy)上で公開されており、以下のコマンドでインストール可能です。

```
brew install ios-webkit-debug-proxy
```

## Webインスペクタを有効にする
`ios-webkit-debug-proxy`を使用するには、iOSの実機の設定で`Webインスペクタ`を有効にする必要があります。

```
設定 > Safari > 詳細 > Webインスペクタ
```

## SafariLauncherをビルドする
`SafariLauncher`はAppiumに付属する、Safariを起動するだけの単純なiOSアプリです。
`ios-webkit-debug-proxy`を使用するためには、あらかじめiOSの実機側でSafariを起動しておく必要があるのですが、Appiumではこのアプリを使用することでテストを実行する際のSafariの起動を自動化しています。

appiumディレクトリで`reset.sh`コマンドを実行して、SafariLauncherをビルドします。

```
cd appium
./reset.sh --ios --real-safari --verbose
```

以下のディレクトリにzipファイルが作成されるので、解凍してOrganizerでiPhoneにインストールできることを確認します。

```
/appium/build/SafariLauncher/SafariLauncher.zip
```

　
# テストの実行

## ios-webkit-debug-proxyを起動

引数にUDIDを指定して`ios_webkit_debug_proxy`を起動します。

```
ios_webkit_debug_proxy -c <実機のUDID>:27753 -d
```

## Appiumを起動

ターミナルを別タブで開き、そこでAppiumを起動します。

```
appium -U <実機のUDID> &
```


## テストを実行する

Safariでのテストの場合も、ネイティブアプリと同様にmvnコマンドで実行します。

```
cd sample-code/examples/java/junit
mvn -X -Dtest=com.saucelabs.appium.SafariTest test
```

コマンドを実行すると実機でSafariが起動して・・・と思ったら何故かここでエラーが発生。。

ログを見る限り`SafariLauncher.app`のインストールに失敗しているようです。

```
info: Cleaning up appium session
error: Failed to start an Appium session, err was: Error: Unable to install [/var/folders/78/xfdt2y2j60vcp39y422qbg1h0000gn/T/11457-11922-15lev6b/submodules/SafariLauncher/build/Release-iphoneos/SafariLauncher.app] to device with id [<実機のUDID>]. Error [Error: Command failed: ]
```

ためしに上記パスのappファイルをOrganizerを使ってインストールしてみたところ、やはり失敗してしまいます。

**何故だ・・・。**

`reset.sh`でビルドしたappファイルは問題なくインストールできていたので、そのファイルが使用されてないということ・・・？

---

さらに詳細にログを解析していきます。

どうやらAppiumは`SafariLauncher`を一度、`/usr/local/lib/node_modules/appium/〜`から`/var/folders/〜`フォルダにコピーしてからインストールを行っているようです。

```
info: Configuring Safari session
info: Using local .zip from command line: /usr/local/lib/node_modules/appium/build/SafariLauncher/SafariLauncher.zip
info: Copying local zip to tmp dir
info: /usr/local/lib/node_modules/appium/build/SafariLauncher/SafariLauncher.zip copied to /var/folders/78/xfdt2y2j60vcp39y422qbg1h0000gn/T/11457-11922-15lev6b/appium-app.zip
```

ということは、Appiumをインストールした際に作成された`SafariLauncher`をインストールしようとして、プロビジョニングプロファイルが一致しないため失敗しているということでしょうか。

そこで、`reset.sh`でビルドしたappファイルを`/usr/local/〜`にコピーして、

```
/appium/build/SafariLauncher/SafariLauncher.zip
```

　↓ コピーする

```
/usr/local/lib/node_modules/appium/build/SafariLauncher/SafariLauncher.zip
```

再度実行してみると・・・無事、 **起動に成功！**
長かった・・・。

　
# まとめ

本当は実際のテストコードの記述方法について触れたかったのですが、思いのほか起動するだけで手間取ってしまいました。
Safariでのテストはネイティブアプリと比べて、依存しているツールや設定が多いため、何かエラーが起きた時に原因を特定するのにすごく苦労します。

気を取り直して、次回は、実際のWebアプリのテストコードの書き方について調べてみたいと思います。

　
# メモ
上記には記載していないのですが、最初は`reset.sh`の実行でエラーが出てSafariLauncherのビルドが出来ずにハマりました・・・。
最終的には`node`と`appium`を再インストールしたところ何事もなくビルドに成功するようになったのですが、明確な原因はわからず。
もし同じような現象が起きる方は、`reset.sh`を使わずに手動でSafariLauncherをビルドするのも手かと思います。

### 手動でSafariLauncherをビルドする方法

**1. SafariLauncherのソースを取得**
Gitクローンしたappiumのフォルダーで以下のコマンドを実行

```
git submodule init
git submodule update
```

**2. Xcodeで`SafariLauncher.xcodeproj`を開く**

```
/appium/submodules/SafariLauncher/SafariLauncher.xcodeproj
```

**3. `Bundle Identifier`を設定**

`TARGETS`で`SafariLauncher`を選択し、`General`タブのIdentityで`Bundle Identifier`に`SafariLauncher`と入力

> 参考:https://groups.google.com/forum/#!topic/appium-discuss/fkksXT01iqc

**4. `Codesign`を設定**

`Build Settings`タブでCode Signingで`Code Signing Identity`を選択

**5. アプリをビルド**

```
xcodebuild -project "SafariLauncher.xcodeproj/" \
-sdk iphoneos \
-configuration "Release" \
-target "SafariLauncher" \
install DSTROOT="submodules/SafariLauncher/build/Release-iphoneos"
```

**6. appファイルをzip圧縮**
上記コマンドで作成された`submodules`フォルダをzip圧縮し、SafariLauncher.zipにリネーム
解凍後には以下の階層になるように注意する

```
/submodules/SafariLauncher/build/Release-iphoneos/SafariLauncher.app
```