Edited at

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

More than 3 years have passed since last update.

あわせて読みたい:

①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のビルドが出来ずにハマりました・・・。

最終的にはnodeappiumを再インストールしたところ何事もなくビルドに成功するようになったのですが、明確な原因はわからず。

もし同じような現象が起きる方は、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を設定

TARGETSSafariLauncherを選択し、GeneralタブのIdentityでBundle IdentifierSafariLauncherと入力


参考: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