あわせて読みたい:
①Appiumを使ってみた【iOS編】
②Appium+JUnitで自動テストを書いてみた【iOS編】
③Appiumでどこまで出来るか試してみた【iOS編】
はじめに
今回はiPhone実機のSafariで、Webアプリのテストを実行する手順です。
結果的に起動には成功しましたが、正直思いっきりハマりました・・・。
事前準備
ios-webkit-debug-proxyをインストール
MacからiOS実機のSafariを操作するために、ios-webkit-debug-proxy
を使用します。
このツールはGoogleのGitHub上で公開されており、以下のコマンドでインストール可能です。
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