setup appium in Mac for iOS + Android (Mojave + iOS13 + Android10 + appium@1.15) 

# Outline

昨年、MacでiOS,Androidのスマホ実機のテスト自動化の構築手順を作成した

- <A HREF="https://qiita.com/emurin/items/5cb9632514a74b056217">setup appium in Mac for Android</A>
- <A HREF="https://qiita.com/emurin/items/a9ef9674308dd5cfcbac">setup appium in Mac for iOS</A>

iOS,Android,MacOSなどなど、バージョンアップしたこともあり改めてテスト環境を構築した（OS reflesh）
その最新テスト環境の構築手順になる

# Environment

用意するもの

- Mac (mojave 10.14.6)
- iPhone (iOS 13.x)
- Android (Android 10)
- USBケーブル
- apple developer account


# 設定
## 1. JDK
### install
Java SE Development Kit 8 をdownloadして、インストールする
インストール時のversionは <B>1.8.0_211</B> を使った

download
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

### 環境変数
環境変数に以下を設定する
Mac環境次第ですが、例えば .bashrc

<TABLE BORDER=1>
<TR><TH>変数</TH><TH>意味 </TH></TR>
<TR><TD>JAVA_HOME  </TD><TD>Javaのinstall path <BR> (ex. export JAVA_HOME=`/usr/libexec/java_home` )</TD></TR>
<TR><TD>Path </TD><TD>実行フォルダのパス <BR>(ex. export PATH=\${JAVA_HOME}/bin:$PATH ) </TD></TR>
</TABLE>

### 実行確認
コマンドプロンプトを起動し、パスを確認する

```
java -version
```

## 2. Android Studio
### install
Android Stduioをdownloadして、インストールする

https://developer.android.com/studio/?hl=ja
インストール時の android studioのversionは <B>3.5</B> を用いた

### 環境変数
環境変数に以下を設定する

<TABLE BORDER=1>
<TR><TH>変数</TH><TH>意味 </TH></TR>
<TR><TD>ANDROID_HOME</TD><TD>androidのSDKのinstall path <BR> 「File」＞「Other Settings」＞「Default Setting Structure…」の"SDK location" <BR> (ex. export ANDROID_HOME=$HOME/Library/Android/sdk ) </TD></TR>
<TR><TD>Path </TD><TD>adb等の実行フォルダのパス <BR>(ex. export PATH=\$PATH:$ANDROID_HOME/platform-tools) </TD></TR>
</TABLE>


### 実行確認
コマンドプロンプトを起動し、パスを確認する

```
adb
```

## 4. Android Deviceの設定
appiumからandroid deviceへ接続許可設定をする
1 開発者モードにする
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/f865ce9e-fa59-94f5-e4ca-72312909dd67.png" width=30%> ビルド番号を数回タップすると、デベロッパーモードに切り替わる

2 開発者向けオプションを開く
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/62a458c6-84e1-30b3-aadb-53e4b8906662.png" width=30%>

3 USB接続の設定
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/f1f0c513-1c35-f4cf-c843-efef2dd7f4af.png" width=30%>USBデバッグ、スリープモード非設定（※任意）をOnにする

4 USB接続
USBで接続後、android device側で接続承認の確認が出てくるので、OKにする。

5 adb server 起動
コマンドプロンプトを立ち上げて、以下コマンドを実行する

```
adb devices
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267085/054dbab3-f408-f484-d3f2-1bc01a5d616f.png)


これにより、接続したandroid deviceが正しく接続されていることを確認する

6 chrome version 固定
chromedriverのversionに依存するため、chromeのアプリバージョンアップを停止したほうがよい。
GooglePlayで自動更新を停止しておいたほうが良い。

今回、chromeのversionは <B>75.0.3770</B> を使用する


## 5. Xcode

### install
XcodeをApp Storeからインストールしてもよいが、appiumとxcodeの相性がある
そのため、version指定してインストールする場合、以下サイトから対象のversionをダウンロード、インストールする。
https://developer.apple.com/downloads/index.action#
※自分が構築時、Xcode 10.2.1

### xcode-select
Xcodeのcommand line実施時のversionを指定する

```
xcode-select --install
sudo xcode-select --switch /Applications/Xcode.app
```
もし複数versionをインストールしている場合、該当versionのXcodeのpathを指定する

※以降の手順でインストール時にエラーが出る可能性があるため、xcodeを一度起動し、同意規約をすませておく



## 6. brew & npm
appiumをinstallするとき、npmコマンドを利用する。
defaultではmacに入っていないので、使えるようにする

### install brew

以下コマンドを実施

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

動作確認

```
brew -v
```

### install npm

```
brew install nodebrew
 
nodebrew install-binary latest
```
※ 初めての時、Failed to create xxxx のエラーが起きる場合がある。その時はmkdirしよう

別のバージョンをinstallしたい場合、以下手順でinstallする
1 対応可能versionの確認

```
nodebrew ls-remote
```
実行例
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/87348698-cdf6-309e-85a1-a62a6a1345a5.png" width=70%>
2  version指定のinstall

```
nodebrew install v0.1.0
```


### nodebrewのversion指定

```
nodebrew list
```
ここで出てきたversion（もし別のバージョンを使う場合、それをinstallする）を確認

```
nodebrew use v12.11.0
```

実際に設定されてるかの確認

```
ls -l .nodebrew/
```
実行例
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/68aa74c0-27b0-1cc4-b802-992592861140.png" width=70%>
currentのsymbolic linkが希望したversionになっていることを確認できる

### pathの設定
pathを通す
ex. export PATH=\$PATH:$HOME/.nodebrew/current/bin

パスの確認

```
npm -v
```

### npm init

以降のlibrary installでjsonが存在しないエラーが出る時がある
それを回避するため、npmの初期化を行う。json定義の項目はdefaultのままでよい

```
npm init
```


## 7. library 等

### install
以下パッケージをインストールする
<TABLE BORDER=1>
<TR><TH>package</TH><TH>version (インストールしたときのもの。それでないといけないわけではないと思う)</TH><TH>Memo</TH></TR>
<TR><TD>libtool </TD><TD>2.4.6 </TD><TD> -</TD></TR>
<TR><TD>xquartz </TD><TD> -</TD><TD>- </TD></TR>
<TR><TD>automake </TD><TD>1.16.1 </TD><TD> -</TD></TR>
<TR><TD>pkg-config </TD><TD>0.29.2 </TD><TD> -</TD></TR>
<TR><TD>usbmuxd</TD><TD>1.0.10 </TD><TD>- </TD></TR>
<TR><TD>libimobiledevice </TD><TD>1.2.0 </TD><TD>- </TD></TR>
<TR><TD>ios-webkit-debug-proxy  </TD><TD>1.8.5 </TD><TD>- </TD></TR>
<TR><TD>ideviceinstaller   </TD><TD>1.1.0 </TD><TD> -</TD></TR>
<TR><TD>carthage   </TD><TD>0.33.0 </TD><TD>- </TD></TR>
<TR><TD>ios-deploy   </TD><TD>1.9.4 </TD><TD> -</TD></TR>
<TR><TD>deviceconsole   </TD><TD>1.0.1 </TD><TD> -</TD></TR>
<TR><TD>xcpretty  </TD><TD>0.3.0 </TD><TD>- </TD></TR>
<TR><TD>authorize-ios  </TD><TD>1.2.1 </TD><TD>- </TD></TR>
<TR><TD>applesimutils  </TD><TD>0.7.0 </TD><TD>Option</TD></TR>
<TR><TD>opencv4nodejs</TD><TD>5.1.0 </TD><TD>Option</TD></TR>
<TR><TD>idevicelocation</TD><TD>xxx </TD><TD>Option</TD></TR>
</TABLE>

```
brew install libtool
brew link libtool
brew info libtool
```

```
brew cask install xquartz
```

```
brew install automake
brew info automake
```

```
brew install pkg-config
brew info pkg-config
```

※usbmuxd , libimobiledevice  , ios-webkit-debug-proxy , ideviceinstaller , ios-deploy は以下の順でinstallしないと、WebDriverAgent の設定作業やios-webkit-debug-proxyでデバイス認識が上手くいかなかった。

```
[bin] ios_webkit_debug_proxy -c "$UID:27751" -d
ss.add_fd(3)
ss.recv fd=3 len=294
ss.recv fd=3 len=1656
ss.add_server_fd(4)
Abort trap: 6
```

その場合、いったん関連するlibraryをuninstallして再度入れ直す必要がある。

```
brew uninstall ideviceinstaller
brew uninstall ios-webkit-debug-proxy
brew uninstall libimobiledevice
brew uninstall usbmuxd

brew install --HEAD usbmuxd
brew install --HEAD libimobiledevice
brew install --HEAD ideviceinstaller
brew install --HEAD ios-webkit-debug-proxy
```



```
brew install usbmuxd --HEAD
brew info  usbmuxd
```

```
brew install libimobiledevice --HEAD
brew info  libimobiledevice
```

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

```
brew install ideviceinstaller
brew info  ideviceinstaller
```

```
brew install carthage
brew info  carthage
```

```
npm install -g ios-deploy
ios-deploy -V
```

```
npm install -g deviceconsole
npm list --depth=0 -g
```

```
gem install xcpretty
```

```
npm install -g authorize-ios
npm list --depth=0 -g
```

```
brew tap wix/brew
brew install applesimutils
```


### idevicelocation のinstall 参考
https://blue-developer.hatenablog.com/entry/idevicelocation

### opencv4nodejs のinstall 参考
https://qiita.com/hnw/items/3d390bfb64c1bde420e6


### chromedriver

appium 1.15.0 , android chrome 75.0.3770 の環境で実施した
この場合、appium側でエラーになった

```
No Chromedriver found that can automate Chrome '75.0.3770'. 
See https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md for more details. 
You could also try to enable automated chromedrivers download server feature 
```
どうやら、このセットではこのままでは動かないようだ。
そのため、chromedriverをdownloadしてくる

https://chromedriver.storage.googleapis.com/index.html

今回は75.0.3770.140のchromedriver_mac64.zipを使用する


## 8. appium

### install
androidに関しては、最新版のappiumで問題はない。
ただ、iOSもテストする環境として考えている場合、versionを注意したほうが良い。
自分が当時試したとき、最新版では動作しなかったのでversion指定でinstallした。

```
npm install -g appium@1.15.0
npm install -g appium-doctor
```

※ version指定しない場合

```
npm install -g appium
```

### 動作確認
```
appium-doctor
```
実行例
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/082e7600-bc89-0c44-02d3-4f2441f62f7d.png" Width=80%>

### 実行

```
appium --chromedriver-executable chromedriver
```

※chromedriverは先ほどダウンロードしてきたchromedriverのpathを指定する
※起動オプションはこちら
http://appium.io/docs/en/writing-running-appium/server-args/
よく使うオプションとしては以下の通り


<TABLE BORDER=1>
<TR><TH>option </TH><TH>mean </TH></TR>
<TR><TD>-p xxxxx </TD><TD>port指定</TD></TR>
</TABLE>

実行例
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/92a4e8e5-62a2-bddf-ac8f-60f182836f61.png" Width=80%>

WEB経由でアクセスして、API状況を確認できる
```
ex) http://localhost:9999/wd/hub/status
```

## 9. WebDriverAgent 設定
appiumからiOS端末にsafariへアクセスするとき、WebDriverAgent を利用する。
これはappiumをinstallしたときにprojectはセットでインストールされる
パスは以下
```
  ~/.nodebrew/current/lib/node_modules/appium/node_modules/appium-webdriveragent/
```

※ 1.15.0 からpathが変更されてます。　appium-xcuitest-driver -> appium-webdriveragent

これがコンパイルされ、かつiOS端末に正しく稼働するように、大きく以下３点実施する必要がある。
-project source codeの依存解消
-signingの解消
-test run

### project source codeの依存解消
source codeの依存解消のscriptを実施する

```
cd  ~/.nodebrew/current/lib/node_modules/appium/node_modules/appium-webdriveragent/
 
bash Scripts/bootstrap.sh -d
bash Scripts/bootstrap.sh
```
※appiumのinstallされたpathが異なる場合、そこのpathに変更して実施のこと。



### signingの解消
Xcodeを起動して、そのprojectを開く。
```
WebDriverAgent.xcodeproj
```

buildをすると、失敗する。２か所のsigningがエラーになっているのでそれを解消させる
-WebDriverAgent
-WebDriverAgentRunner

<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/6327e99d-2377-b0ab-a30e-965b38eec185.png" width=70%>
ここで、自身のSigning Certificationを設定する
その後、改めてxcodeでbuild


### test run
iOS端末に実際に接続できるかを確認する
WebDriverAgentのあるpathに移動し、build & test runを下記のように行う
尚、$udidは接続するiphoneのUDID番号である。
これはiTunesで取得することができる

```

xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=$udid' test
```

うまくいけば、failが出ず、以下のような画面になる。
<IMG SRC="https://qiita-image-store.s3.amazonaws.com/0/267085/bd09a26a-309b-c39a-5dbd-d9cb60735d7d.png" width=70%>

xcode と appiumのバージョンの相性が悪いとここでfailする

## 10. iOSデバイスの設定
safariにdebbugerがアクセスできるようにする
<img width="375" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/267085/e997b69f-5a4f-c8bc-c44a-a4333374d739.png">


## 11. iOS debbuger 起動
iosのsafariの表示内容を取得するツール
これを常駐させる

```
ios_webkit_debug_proxy  -c $udid:27753  -d
```
$udidは接続するiphoneのUDID番号
27753はios_webkit_debug_proxyの起動port。
任意の番号でよいはずだが、たまにappiumと接続がうまくいかず、27753がdefaultでよい（らしい）


▼▼▼▼▼▼

上記完了後、appium経由でiOSのsafariへテストができるようになる。