【続】iOSでAirtestを動かす

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

こちらは、昨年の記事[「iOSでAirtestを動かしてみる」](https://qiita.com/s_noza/items/f2cc1f398270d3572e5b)の続編になります。
前回課題となっていた横向きアプリへの対応が解決しましたので、そちらの情報共有と、当該環境を使用して本格的に取り組みを進めるにあたり、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](https://github.com/appium/WebDriverAgent) に置き換えることで、横向きのアプリにも対応することができました。
WebDriverAgent をクローンします。

```
$ git clone https://github.com/appium/WebDriverAgent.git
```
Xcodeで開きます。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/4b775752-e7f3-0d3a-55c2-0173df1c0792.png">

ここで、PCに実機をUSB接続しておきます。
スキーム（ここでは「IntegrationApp」となっている箇所）をタップします。
![スクリーンショット 2021-11-30 13.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/559a0398-256a-04a7-94aa-9c06aeb3dfc2.png)

WebDriverAgentRunner を選択し、先程接続したiOS端末をタップします。（ここでは「iPhone」となっている箇所）
![スクリーンショット 2021-11-30 13.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/abe6cdb4-024d-a07d-6523-31f28486d7db.png)

とりあえず、動かしてみます。
![スクリーンショット 2021-11-30 11.19.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/c2e41d2c-dcb0-7c65-1719-6ddc11366ec4.png)

ワーニングを順次解消していきます。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/261387bb-1be1-875b-08f6-af30668ea031.png">
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/b4b22307-98fb-67ed-014f-7b7a1031b9e7.png">
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/bd95a737-5ad1-fff6-0520-14c11a7e6ec8.png">
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/a22670ff-d3eb-871f-1d35-b67668fb3a3b.png">

次に、エラーを解消していきます。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/b0e6e786-c556-5480-b2e8-b3de9def2b8f.png">

WebDriverAgentRunner にて、Teamを選択します。（無い場合は AppleIDから作成）
![スクリーンショット 2021-11-30 14.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/a9cc8cf2-793a-33eb-5b65-0c1eacd69e92.png)

Product Bundle Identiferを設定します。（ユニークな文字列にする）
![スクリーンショット 2021-11-30 14.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/4835cbc5-ede4-3c34-d178-8545231748d1.png)

再度、ビルドします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/9ac6d90d-3c99-5ba9-3ede-bd32393b79ca.png">

問題なさそうであれば、実機のスリープを解除した状態で、Testを実行します。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/66a974b2-fe2c-1bcc-f0fb-1f275c8c0e51.png">


実機に WebDriverAgentRunnerがインストールされます。ここで、「設定」アイコンをタップします。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/78a96bcc-a33a-725a-c3ca-26afe781ca8b.png">

設定から「一般」をタップします。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/b06d2094-7639-ca75-f146-b7a8d74e6b21.png">

「プロファイルとデバイス管理」をタップします。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/b021102a-82c4-eb6d-5191-78b60ae63637.jpeg">


WebDriverAgentRunner のデベロッパを信頼します。
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/43a0ed7e-89f1-8877-b36c-c0cdbe40fe08.png">

PCに戻って、再度 Testを実行します。（手動で停止するまで実行中の状態となります）
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/66a974b2-fe2c-1bcc-f0fb-1f275c8c0e51.png">

##Step2　Set Ploxy
iproxyをインストールします。

```cmd:インストール
$ brew install libimobiledevice
```
iproxyを実行します。

```cmd:実行
$ iproxy 8100 8100
```

```cmd:実行中のメッセージ
Creating listening port 8100 for device port 8100
waiting for connection
```

##Step3　AirtestIDE
接続情報を入力して「Connect」ボタンをクリックします。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/df2af042-fcce-28bb-83e3-b5cc95467ba2.png">


iOS端末に接続されます。これでAirtestのスクリプトを実行することができるようになりました。
![スクリーンショット 2021-11-30 15.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/4126752e-674c-6876-1955-34d01f478023.png)


#関連ノウハウ
##コマンドラインからの実行
CLIから実行することで、並行して複数端末での個別実行が可能となります。ここでは、2台の端末（iPhone XS、iPhone 8）を接続している状態を想定しています。

WebDriverAgentの複数起動

```cmd:デバイス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の複数起動

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

AirtestIDE スクリプトの複数実行

```cmd:ポート番号とデバイス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 コマンドで確認できます。

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


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

```cmd:セットアップ
$ npm install -g --unsafe-perm=true ios-deploy
```

```cmd:ipaのインストール
$ ios-deploy --bundle <ipaファイル>.ipa
```

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

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

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

```python:airtest
home()
sleep(2)
home()
text("<iOS端末のパスコード>")
```
##タップできないポップアップへの対応
アプリ初回起動時にiOSが出すダイアログが何故かタップできませんでした。しかし、一度アプリを終了すると当該ダイアログが残っており、タップできるようになりました。（テスト対象のアプリによるかもしれません）
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542670/b972273e-6477-ee45-9f5a-552e45aff177.png">


#参考
[appium/WebDriverAgent](https://github.com/appium/WebDriverAgent)
[macにUSB接続されたiPhoneの情報を取得する方法（libimobiledevice）](https://mizutanikirin.net/mac%E3%81%ABusb%E6%8E%A5%E7%B6%9A%E3%81%95%E3%82%8C%E3%81%9Fiphone%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%88libimobiledevice%EF%BC%89)

https://qiita.com/lazyppp/items/d517e0c75d139935c772

https://qiita.com/s_noza/items/f2cc1f398270d3572e5b



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