【続】iOSでAirtestを動かす


はじめに

AirtestIDE でスマホアプリ(ゲーム)のテスト自動化に取り組んでいます。そこで実際に作成したスクリプトを実行する環境をつくるために実施したことを綴っていきたいと思います。

こちらは、昨年の記事「iOSでAirtestを動かしてみる」の続編になります。
前回課題となっていた横向きアプリへの対応が解決しましたので、そちらの情報共有と、当該環境を使用して本格的に取り組みを進めるにあたり、CLI環境からの複数端末での動作確認を行いましたので、いくつかの関連トピックを交えつつ共有できればと考えています。

環境

macOS Big Sur 11.6.1
Xcode 13.1
Airtest IDE 1.2.12(Python)
iPhone XS(iOS 14.7.1)
iPhone 8(iOS 15.1)

セットアップ

Step1 WebDriverAgent

前回紹介していた iOS-Tagent を Appiumの提供する WebDriverAgent に置き換えることで、横向きのアプリにも対応することができました。
WebDriverAgent をクローンします。

$ git clone https://github.com/appium/WebDriverAgent.git

Xcodeで開きます。

ここで、PCに実機をUSB接続しておきます。
スキーム(ここでは「IntegrationApp」となっている箇所)をタップします。

WebDriverAgentRunner を選択し、先程接続したiOS端末をタップします。(ここでは「iPhone」となっている箇所)

とりあえず、動かしてみます。

ワーニングを順次解消していきます。



次に、エラーを解消していきます。

WebDriverAgentRunner にて、Teamを選択します。(無い場合は AppleIDから作成)

Product Bundle Identiferを設定します。(ユニークな文字列にする)

再度、ビルドします。

問題なさそうであれば、実機のスリープを解除した状態で、Testを実行します。

実機に WebDriverAgentRunnerがインストールされます。ここで、「設定」アイコンをタップします。

設定から「一般」をタップします。

「プロファイルとデバイス管理」をタップします。

WebDriverAgentRunner のデベロッパを信頼します。

PCに戻って、再度 Testを実行します。(手動で停止するまで実行中の状態となります)

Step2 Set Ploxy

iproxyをインストールします。

インストール
$ brew install libimobiledevice

iproxyを実行します。

実行
$ iproxy 8100 8100
実行中のメッセージ
Creating listening port 8100 for device port 8100
waiting for connection

Step3 AirtestIDE

接続情報を入力して「Connect」ボタンをクリックします。

iOS端末に接続されます。これでAirtestのスクリプトを実行することができるようになりました。

関連ノウハウ

コマンドラインからの実行

CLIから実行することで、並行して複数端末での個別実行が可能となります。ここでは、2台の端末(iPhone XS、iPhone 8)を接続している状態を想定しています。

WebDriverAgentの複数起動

デバイスidを指定して複数起動する(それぞれ別枠で起動する)
$ xcodebuild -project project/appium/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'platform=iOS,id=<iPhone XSのデバイスid>' test
$ xcodebuild -project project/appium/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'platform=iOS,id=<iPhone 8のデバイスid>' test

iproxyの複数起動

ポート番号とデバイスidを指定する(それぞれ別枠で起動する)
$ iproxy 8100 8100 --udid <iPhone XSのデバイスid>
$ iproxy 8200 8100 --udid <iPhone 8のデバイスid>

AirtestIDE スクリプトの複数実行

ポート番号とデバイスidを指定する(それぞれ別枠で起動する)
$ /Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE runner "<スクリプト>.air" --device iOS:///localhost:8100//<iPhone XSのデバイスid>
$ /Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE runner "<スクリプト>.air" --device iOS:///localhost:8200//<iPhone 8のデバイスid>

デバイスidの確認

デバイスidは idevice_id コマンドで確認できます。

セットアップ
$ brew install libimobiledevice
実行
$ idevice_id

アプリのインストール

AirtestIDEの install() は iOS環境でサポートされていないので、ios-deploy を使うことにしました。

セットアップ
$ npm install -g --unsafe-perm=true ios-deploy
ipaのインストール
$ ios-deploy --bundle <ipaファイル>.ipa

インストール先のiOS端末を指定する場合は --id <デバイスid> を使います。

ipaのアンインストール
$ ios-deploy --uninstall_only --bundle_id <バンドルid>

スリープモードからの復帰

リモート環境から随時利用できるようにiOS端末がスリープ状態から復帰するコードを試してみました。

airtest
home()
sleep(2)
home()
text("<iOS端末のパスコード>")

タップできないポップアップへの対応

アプリ初回起動時にiOSが出すダイアログが何故かタップできませんでした。しかし、一度アプリを終了すると当該ダイアログが残っており、タップできるようになりました。(テスト対象のアプリによるかもしれません)

参考

appium/WebDriverAgent
macにUSB接続されたiPhoneの情報を取得する方法(libimobiledevice)

おわりに

参考になった箇所などありましたでしょうか。
これをベースにiOSのテスト環境も構築していきたいと考えています。この記事が何かの助けになりましたら幸いです。