Appium インストールして起動まで/ iOS・Androidのトラブルシューティング

初投稿

#やること
Android・iOSそれぞれの実機で実行するところまで
普通にやるとエラーだらけな上に情報少ないのでまとめる

#インストール
公式
http://appium.io/

node.jsが必要
なければhttps://nodejs.org/

自分の時はnodeのバージョンいくつか試した結果v0.12.7を使ってるので
https://nodejs.org/en/blog/release/v0.12.7/ からMacOS用インストール

```shell-session
> brew install node      # get node.js
> npm install -g appium  # get appium
> npm install wd         # get appium client
> appium &               # start appium
```
appium自体はただのhttpサーバーなので起動までできたらテストコードを準備する
自分の場合起動コマンドは下記にしてる
```nohup appium --no-reset >> /path/to/tmp/appium.log 2>>/path/to/tmp/appium.log < /dev/null &```

##テストコード
テストコードはappiumのgithubレポジトリに各言語でsampleが置いてあるのでとりあえずそれを流用
https://github.com/appium/sample-code/

2015/11現在では下記言語が使えるらしい
>dotnet
>java
>node
>perl
>php
>python
>ruby

※dotnetはC#

#Androidで実行

自分の場合、まずnode.jsで試したので下記実行してみる
```
cd sample-code/examples/node/
node android-simple.js
```

###エラー1
で、普通は下記のようなエラーが出る

```
module.js:338
    throw err;
          ^
Error: Cannot find module 'wd'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
```
このandroid-simple.jsのコードは実機かシミュレータにsample-code/apps/ApiDemos/bin/ApiDemos-debug.apkをインストールして.elementByAccessibilityId('Graphics').click()等してくれるテストです。
wdはWebDriverモジュールの略？で指定したアプリをインストール等してくれます。

実は下記のREADME.mdにやり方書いてあって
https://github.com/appium/sample-code/tree/master/sample-code/examples/node
```
npm install -g -f mocha
npm install
```
が必要

###エラー2
npm install後nodeコマンドじゃなくてmochaコマンドで実行

```mocha android-simple.js```

>  1) android simple "before all" hook:
     [init({"browserName":"","appium-version":"1.3","platformName":"Android","platformVersion":"4.4.2","deviceName":"Android Emulator","app":"http://appium.github.io/appium/assets/ApiDemos-debug.apk"})] connect ECONNREFUSED

インストール時のコマンドで実行してれば出ないけど、appiumに繋がらないよエラー。
ターミナルでappiumコマンド実行

###エラー3
再び下記実行
```mocha android-simple.js```
多分こんなエラー出る

>
  1) android simple "before all" hook:
     Error: [init({"browserName":"","appium-version":"1.3","platformName":"Android","platformVersion":"4.4.2","deviceName":"Android Emulator","app":"http://appium.github.io/appium/assets/ApiDemos-debug.apk"})] The environment you requested was unavailable.
      at node_modules/wd/lib/webdriver.js:129:15

これだとリクエスト失敗したよってことしか分からないので、appium.log側見る

>info: [debug] Error: Could not find adb. Please set the ANDROID_HOME environment variable with the Android SDK root directory path.

環境変数が足りないよう。
export ANDROID_HOME="/path/to/adt-bundle-mac-x86_64/sdk"
して下記コマンドでチェックする

```appium-doctor --android```

```✖ JAVA_HOME is not set```
JAVA_HOMEも足りないと言われるので下記セット
```export ANDROID_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home"```
※JAVA_HOME確認は下記
```/usr/libexec/java_home -V```

###エラー4
再び下記実行
```mocha android-simple.js```

成功すると、一瞬アプリの画面が立ち上がってからquitされる。

>Driving the web on session: 976c-fe5-b0f7-4b8c-a808-8703615057c7

 > RESPONSE init({"browserName":"","appium-version":"1.3","platformName":"Android","platformVersion":"4.4.2","deviceName":"Android Emulator","app":"http://appium.github.io/appium/assets/ApiDemos-debug.apk"}) "9712-fe5-b0f7-4b8c-a808-8703615057c7",null
 > CALL setImplicitWaitTimeout(3000)
 > POST /session/:sessionID/timeouts/implicit_wait {"ms":3000}
 > RESPONSE setImplicitWaitTimeout(3000)
 > CALL elementByAccessibilityId("Graphics")
 > POST /session/:sessionID/element {"using":"accessibility id","value":"Graphics"}
    ✓ should find an element (78ms)
 > CALL quit()
 > DELETE /session/:sessionID

>Ending your web drivage..

 > RESPONSE quit()


>  1 passing (10s)

現状自分が確認できたのはここまで。

###Androidは以上。


#iOSシミュレータで実行
```mocha ios-simple.js```

まぁ、大体こうなる

###エラー5

>  1) ios simple "before all" hook:
     Error: [init({"browserName":"","appium-version":"1.3","platformName":"iOS","platformVersion":"8.1","deviceName":"iPhone Simulator","app":"http://appium.github.io/appium/assets/TestApp7.1.app.zip"})] The environment you requested was unavailable.
      at node_modules/wd/lib/webdriver.js:129:15

The environment you requested was unavailableはリクエストができませんよ的な。このエラーほんとわかりにくいですがappium.logを見ます

>info: [debug] Final device string is: 'iPhone 6 (8.1)'
error: Could not find a device to launch. You requested 'iPhone 6 (8.1)', but the available devices were: ["iPad 2 (8.4) [106BB5B1-B349-418A-8002-1510F0A5E029]","iPad 2 (9.0) [102D14B1-97A3-4396-ADD5-A835C9EE3CAD]","iPad Air (8.4) [10E00B31-BF1C-43DF-ABCD-D744BC28066E]","iPad Air (9.0) [10F6B26F-AD90-484A-85B7-5EDC01BCC834]","iPad Air 2 (9.0) [10982FDB-9B87-4ABE-BD56-91C90891B18D]","iPad Retina (8.4) [104CF10E-3172-4AE5-A47B-9072292A5A29]","iPad Retina (9.0) [106321B4-1984-40F8-AFEF-2557F225CD23]","iPhone 4s (8.4) [102F7E17-EB7E-461E-B4AB-96A3DD60986E]","iPhone 4s (9.0) [10024631-B9D8-46E2-A086-51CD112E10AE]","iPhone 5 (8.4) [1052C1F3-C896-43D8-92FB-7B13B7807553]","iPhone 5 (9.0) [10253E08-1A22-484F-979D-60EE4727DF74]","iPhone 5s (8.4) [10876010-D90A-4C11-B742-C3DBB821BBC8]","iPhone 5s (9.0) [1050E22B-7762-43E8-B21B-59A98245E968]","iPhone 6 (8.4) [105CF89D-48BC-4A2C-B8FD-0817F4969032]","iPhone 6 (9.0) [10669B9D-1CE5-4B9B-8F68-5A84E6B244E4]","iPhone 6 (9.0) + Apple Watch - 38mm (2.0) [10B2D2DD-F2CC-437E-986E-2BAA08B52DE8]","iPhone 6 Plus (8.4) [104969B4-9BE5-4B2C-84FB-E20474320DC6]","iPhone 6 Plus (9.0) [10B0E1BC-F7FD-4BDF-8D56-A2D22F74F13C]","iPhone 6 Plus (9.0) + Apple Watch - 42mm (2.0) [1057ED9C-FD6B-43C5-B948-7E75900588C3]","iPhone 6s (9.0) [1039E0E5-8E47-4135-96F9-936D9EF0961E]","iPhone 6s Plus (9.0) [10E84F5B-3BF1-47EA-BAB9-1612649CD681]"]
info: [debug] Cleaning up appium session

指定した"iPhone 6 (8.1)"というデバイスが使えませんというエラー

###エラー5修正
使えるやつが一覧で出てきてくれるので適当に選んでコードを修正

iOSの端末指定はhelpers/caps.jsの中で下記のように指定していると思います

>  browserName: '',
  'appium-version': '1.3',
  platformName: 'iOS',
  platformVersion: '8.1',
  deviceName: 'iPhone 6',
  app: undefined // will be set later

自分の場合はplatformVersionを8.4に書き換えて再度実行
シミュレータが起動すれば成功です

###iOSシミュレータ以上

#iOS実機で実行
driver.initしてるオプションで実機かシミュレータか指定できます
上記エラー5で修正したものを書き換え
>'appium-version': '1.3',
      platformName: "iOS",
      platformVersion: "9.1",
      deviceName: 'summerのiPad',
      udid:'7v0zn7kb5ijfgyl89of4wl5flk14ujifhogehoge', 
      app: undefined // will be set later

上記修正して実行

#エラー6
```mocha ios-simple.js```

>info: [debug] Couldn't find ideviceinstaller, trying built-in at /usr/local/lib/node_modules/appium/build/libimobiledevice-macosx/ideviceinstaller
error: Could not initialize ideviceinstaller; make sure it is installed and works on your system
info: [debug] Cleaning up appium session
error: Failed to start an Appium session, err was: Error: Could not initialize ideviceinstaller; make sure it is installed and works on your system

実機のインストールには「ideviceinstaller」というツールが使われています。
http://macappstore.org/ideviceinstaller/
```brew install ideviceinstaller```
で入ると思います。


#エラー7

>error: Failed to start an Appium session, err was: Error: Command failed: /bin/sh -c ideviceinstaller -u 7v0zn7kb5ijfgyl89of4wl5flk14ujifhogehoge -i /var/folders/68/g7lphy394fb4gf7fl909s4lm0000gn/T/115108-56392-axrap7/TestApp.app

>info: [debug] Error: Command failed: /bin/sh -c ideviceinstaller -u 7v0zn7kb5ijfgyl89of4wl5flk14ujifhogehoge -i /var/folders/68/g7lphy394fb4gf7fl909s4lm0000gn/T/115108-56392-axrap7/TestApp.app

>    at ChildProcess.exithandler (child_process.js:751:12)
    at ChildProcess.emit (events.js:110:17)
    at maybeClose (child_process.js:1015:16)
    at Socket.<anonymous> (child_process.js:1183:11)
    at Socket.emit (events.js:107:17)
    at Pipe.close (net.js:485:12)

ideviceinstaller起動に失敗してるようです
コマンドで直打ちしてみます

```appium  ideviceinstaller -u b42a6441d5f5fae583a97938d1e9ffb43a14a20c -i /var/folders/68/g7lphy394fb4gf7fl909s4lm0000gn/T/115108-56392-axrap7/TestApp.app```
>Uploading TestApp.app package contents... DONE.
Installing '(null)'
 - CreatingStagingDirectory (5%)
 - ExtractingPackage (15%)
 - InspectingPackage (20%)
 - TakingInstallLock (20%)
 - PreflightingApplication (30%)
 - VerifyingApplication (40%)
 - Error occurred: ApplicationVerificationFailed

ビルド設定周りがうまくいってないようです。
端末設定のapp:をXcode上でビルドできる自分のアプリのBundle Identifierにすると起動成功。


#Appium Inspectorによるエレメント解析+コード生成
こんな感じでできる
https://www.youtube.com/watch?v=6ARqrN-d8TI
…はずだがそのままだとうまくいかなかったので下記にやり方を追記

##やりかた
http://appium.io/
からdmgダウンロード&インストール

起動するとこんな感じ
<img width="666" alt="スクリーンショット 2015-11-08 18.45.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/99683/0b92ea69-a207-e829-09ee-00577424e685.png">

Launch押すと普通はappiumサーバーが起動するらしいが、自分の場合はなにを設定してもLaunching Appium with command: から先に進まなかった
--logのオプション追加してもlog出力されないので直コマンドで起動したらサーバー起動した
>/Applications/Appium.app/Contents/Resources/node/bin/node lib/server/main.js --command-timeout "7200" --debug-log-spacing --log "/tmp/appium.log" --log-level "debug" --automation-name "Appium" --platform-name "Android" --platform-version "4.4" --app-pkg "" --app-activity "" --device-name ""

ターミナルで↑起動しつつ、AppiumのGUI上にある虫眼鏡ボタンをクリックするとInspectorが起動できた



#以上