uiautomatorでandroidスマホ動作テストしましょう。

はい。過去記事  
[http://qiita.com/clarinet758/items/1a66832716da1186f01a](http://qiita.com/clarinet758/items/1a66832716da1186f01a)
の焼き直しというか色々省略しすぎたので導入から書いてみようかと。。  
過去記事再編集か新記事か迷ったんですが新記事で行くことに。
色々参考先さま
[http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html](http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html)

はい。
公式リファレンスのような
[http://developer.android.com/tools/help/uiautomator/index.html](http://developer.android.com/tools/help/uiautomator/index.html)

これも必要
[http://developer.android.com/reference/android/view/KeyEvent.html](http://developer.android.com/reference/android/view/KeyEvent.html)

ただまぁ今回に新記事のために一からの導入させる環境がVirtualBox上のWindowsXp 32bitとか誰得なアレですが。。。Xpは明日で色々とアレなので4/9中に書き終えたいです。。。  
  
・ダウンロードやインストールするもの
1.Android Developer Tools(eclipseやAndroid SDKが同梱？されてます)
2.Java JDK
3.Ant  

##1.Android Developer Toolsをインストールしましょう。
すでに他の用途で使ってて既にインストール済ということも人それぞれであったりすると思います。  
1のAndroid Developer Tools(以降はADTと略称を使います)は、
[http://developer.android.com/sdk/index.html](http://developer.android.com/sdk/index.html)
よりダウンロードをします。
規約を良く読み慎重に同意のレ点をいれ、32/64bit版は個別の環境に合わせてですね。OSは勝手に判別されるっぽいですけど、Win/Mac/Linuxとかダウンロードボタンに表示あるはずなので一応見ましょう。  
ダウンロードしたものは解凍したらそのまますぐ起動できるツールです。
なお、解凍中にサブアーカイブが〜〜というような確認のポップアップが出た方は一旦解凍をキャンセルして、解凍ツールの設定を見直すかツールそのものを変えたほうが良いです。尋常でない回数の確認のポップアップが出ます。  
そして置き場所は色々と楽なのでウチではC:\直下に置きます。Program Filesとかディレクトリ名に半角スペースを含んでいるとこはちょっと。。。。  
あとPathなどはどこにおくにしても自前で通す必要があります。

既にeclipse使ってますーという方も今回のADTに応じたPathを通す必要があります。eclipse同居は未検証です。。申し訳ない。。。  
SDKなども既に先に入ってるものがある場合もあるかと思いますが、こちらは当方ではADTのSDKのみPathに書いて特に不具合は起きていないです。ただPathは通さなくてもディレクトリは残しておいたほうが良いと思います。  
>######通すPath
>c:\adt-bundle-*******\sdk\tools
>c:\adt-bundle-*******\sdk\platforms
>c:\adt-bundle-*******\sdk\platform-tools
>c:\adt-bundle-*******\sdk\buld-tools
  
######ではpathが通ってるか確認しましょう。
cmd窓でドコのディレクトリからでもよいので'android'と入力しましょう。そしたらばSDK Managerが起動するはずです。API19とAPI17の一式以外は多分特に何も必要ないと思います。
何も起きないor怒られる場合は(多分)toolsのpathを再度ご確認ください。  
お次は'android list target'と入力してください。先ほどインストールさせたAPI17,19などが見えると思います。後で必要になるのでコレの表示方法は覚えておきましょう。
表示されない場合は(多分)platformsのpathをご確認ください。以前に良くandroid端末を繋げて作業したことがある場合は既にSDKが入っていてそれが優先されている場合がありそうです。pathの通す順を変えてください。  
お次は'adb'と入力しましょう。色々な場面で使います。何も起きなかったらplatform-toolsのpathをご確認ください。  
  
##2.JDKをインストールしましょう。
開発元が違うなど色々大人の都合なのか、もっと別の理由なのか？？ビルドに必要なJDKは別途また配布サイトにからダウンロードしてからインストールになります(多分)。
ちなみにJava8まで出ている時代にアレですがJava6でしか動作確認したこと無いので今回もJavaSE6の導入です。  
[http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html)  
の'Previous Releases - Java Archive'からです。ライセンスの同意とオラクルIDが必要になります。OSに合わせたものを選択してダウンロード。  
ダウンロードしたらWin機の場合はexeをダブルクリックで。インストール先は選べるのでProgram Filesを避ける事も出来ます。ただ今回はそのままにしてしまいました。デフォ以外にして後で影響出るのが嫌だったので。。インストールの最後にJDKのチュートリアル開始の誘導がありますがお好みでどうぞです。  
>######通すPath
>%JAVA_HOME%\bin
>システム環境変数を新規作成で
>変数名： JAVA_HOME　変数値； C:\Program Files\Java\jdk1.6*****
新規作成のJAVA_HOMEはbinまで書かないです。  
######ではpathが通ってるか確認しましょう。
'javac -version' で今回のインストールで入れたバージョンが表示されれば多分大丈夫です。  
  
##3.Antをインストールしましょう。
公式ダウンロードは
[https://ant.apache.org/](https://ant.apache.org/)
からです。あんまり気にせず最新版使ってます(書いている当時1.9.3)。
今回の解凍先はまたC直下を使っています。
特に何かクリックでインストーラー起動などはなく解凍したモノにPathを通すだけです。  
>######通すPath
>%ANT_HOME%\bin
>システム環境変数を新規作成で
>変数名： ANT_HOME　変数値； C:\apache-ant*****
新規作成のANT_HOMEはbinまで書かないです。  
######ではpathが通ってるか確認しましょう。
'ant -version' で今回のインストールで入れたバージョンが表示されれば多分大丈夫です。

そうしたらもうadtのディレクトリ->eclipseの中にあるeclipseを起動させればもうウハウハです。  

##4.はじめてのuiautomator
リンク再掲で主たる参照先さま  
[http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html](http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html)  
一方的に私の不勉強なのが悪いのですがHello Worldと表示させる以外の用でほぼ初めてeclipseに触れた、Javaを書く身では初めて聞く単語ばかりで大変だった。  
ではビルドまで行きましょう。
1.起動するとworkspaceを聞かれますがデフォのworkspaceのままで良いと思います。  
使用する文字エンコードを変えましょう。File->PropertiesのText file encodingをUTF-8にしましょう。  
それからプロジェクト作成でFile->New->Java Projact でNew Java Projectというウィンドウで出てきます。  
![http://www.nowshika.com/joso/img04092211.png](http://www.nowshika.com/joso/img04092211.png)  
  
2.Project nameは用途に応じて許容される範囲で厨二病的な名前でも何でも良いと思います。 JREはよく分かってませんがJavaSE-1.6を指定しています。そしてNextをクリック。  
  
3.Java Settingsの画面でLibrariesタブをクリックで移動します。そうしてAdd Library…->JUnitを選択->Next->JUnit3を選択->Finish そして次はAdd External JARs…でファイルの場所の選択画面になるので先ほどまでのインストールやPath通しなどした\sdk\platforms下にあるandroid-17下のandroid.jarとuiautomator.jarを選びます。多分、2つ同時には選べないのでさい度Add External JARs…からはいることになると思います。そしてFinishで終わります。  
  
4.次はクラス作成を行います。命名は先頭を大文字にするのがJavaの習わしらしいです。  
![http://www.nowshika.com/joso/img04092237.png](http://www.nowshika.com/joso/img04092237.png)  
ここも状況に応じて初めは適度に厨二で良いと思います。後々は作成用途に応じたクラス名にするべきかと思いますが。。。作成でFinishするとこんな画面になるかと思います。  
![http://www.nowshika.com/joso/img04092245.png](http://www.nowshika.com/joso/img04092245.png)  
この画像では'com.fukadori.android'というプロジェクト・パッケージの下に'Loveplus'というクラスを作成しています。今回は目的と関係ない名前ですが、先々では用途に応じてMailやCallingなど操作対象のアプリなどわかるようにするべきかと思います。.javaのソース内でだけでパッケージ名やクラス名を変更/省略は出来ないようです。拾ってきたソースをコピペで使う場合も自身の環境のパッケージ名・クラス名に書きなおす必要があります。  
  
5.ではもうビルドして自動で操作させるスクリプト作成しましょう。  
えーっと、、すいません。。。わけあって今は手元にサンプルが無いです。。  
[http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html](http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html)  
[https://gist.github.com/nowsprinting/4131415](https://gist.github.com/nowsprinting/4131415)  
などからお願いします。。
サンプルを写経orコピペして保存したらDOS窓起動して、
〜workspace\プロジェクト名 のディレクトリへ移動します。そして、
```android create uitest-project -n <name> -t <target> -p <path>```
でbuild.xmlの作成をします。nameは結構自由に出来るっぽいです。build後にはこの時入力の名前.jarファイルが出来上がります。 targetはandroidのバージョンなどのことです。現在は世の中では4.2系、android-17が主なtargetになると思います。指定は ```android list target```で表示されるid: 以降の数字のみ入力してください。お後にpath は . で。ビルド成功したらおめでとうございます。失敗の際はエラーメッセージに応じて適当に対処してください。あと、eclipse上で赤い警告出ているときは絶対にビルドは通らないと思います(多分)。  
  
6.もう端末に押し込んで動かさせましょう。
特に何もしてなければ上記までで作業していたディレクトリにbinディレクトリが作成されてその下にJARファイルができているはずです。ファイル押し込みは```adb push .\bin\XXXXXX.jar /data/local/tmp``` 端末側の置き場所はどうしても厳密な指定はないですが /data/local/tmpへのアクセスやファイルを置く、実行させるなどの操作を行うのには特に改造やroot奪取などする必要はないのでココが使いやすいかと。。。  
  
##5.補足などあれこれ  
いちお過去記事  
[http://qiita.com/clarinet758/items/1a66832716da1186f01a](http://qiita.com/clarinet758/items/1a66832716da1186f01a)  
にサンプル出していると言えば出しているのですがお粗末なアレです。。
おそらく何をするにしてもsdk\tools下のuiautomatorviewerを起動しながらになるかと思います。
USBデバッグモードにしなければいけないのに開発者メニューが見えません＞＜ という時には  
![http://www.nowshika.com/joso/img04102310.png](http://www.nowshika.com/joso/img04102310.png)  
ビルド番号らへんを数回タップしましょう。多分開発者メニューが出てきます。  
そしてそしてviewerで見える情報に基づいて目的とする動作のコードを書くことになると思います。
※clickableかenabledがtrueでないと、クリック(人が操作を行う上ではタップと言われる操作です。命令文がclickなのでクリックと書きます) させて何かが起きる対象ではないです。  
※クリック対象が重複した場合は画面表示が、座標が上のものが優先になるっぽいです。
何かをクリックさせる命令は
  
```Java:e,g,
UiObject FacebookAccount = new UiObject(new UiSelector().text("Facebook"));
            FacebookAccount.clickAndWaitForNewWindow();
```
クリック対象によってはtext値が空なので他の手法で泣きそうになりながら指定方法を工夫することになります。  
text以外の方法の指定例  
・className("android.widget.EditText")  
・className("android.widget.EditText").index(1)    
・description("Google Playを検索")   
textもcontent-desc(descriptionで指定させられる)も空ですと、おそらくはclassnameか座標を直指定しかないと思います。ただ座標指定は試したことはないです。。classnameが同画面内で被った場合はindex値を更に指定してあげることになります。  
画面でのボタンの表示位置とuiautomatorviewer上で認識されるボタンの位置が違うケースがとあるSNSのアプリであります。  
![http://www.nowshika.com/joso/img04102336.png](http://www.nowshika.com/joso/img04102336.png)  
uiautomatorでOKボタンをクリックさせる命令文を書くと赤い枠部分をクリック動作になってしまい何も起きません。。。。。
```getUiDevice().pressKeyCode(61);``` //tabキーを押すのと同等を数回のあとに  
```getUiDevice().pressKeyCode(66);```  //enterキーを押すのと同等  
でOKボタン確定を実現させることが出来ます。  
補足の補足で参考画像はありませんがホーム画面のアイコンをクリックでアプリを起動させようとする場合に、Docomoの羊がアイコンの上に居たならば羊をクリックしたことになります。(何か御用ですか？ ってお前を消す方法が知りたい以外に何も用事はないアレです)  
試したことは無いですがOK→戻る→OK 以下ループさせて繰り返すでOKボタン付近に広告が被って押しにくいことがある とかの動作確認に使えたりするかもしれないです。  
期待通りに動かなかった場合のおそらく9割以上がクリック対象を見つけられないエラーで終了になると思います。  
![http://www.nowshika.com/joso/img04102353.png](http://www.nowshika.com/joso/img04102353.png)  
UTF-8とShift-JISがアレな事情により文字化けしてますのでアレです。  
画面上で見えてないアプリなど起動させるには
  
```Java
String cmd = "am start -a android.intent.action.MAIN -n com.android.settings/.Settings";
            Runtime.getRuntime().exec(cmd);
```
で起動させています。adbやJUnitの命令文に近いのでしょうか？？  
  
スクロールさせて何か探させてクリックする時  
  
```Java
UiScrollable SearchAddAccount = new UiScrollable(new UiSelector().scrollable(true));
        // スワイプ時のスクロール方向を垂直方向に設定
        SearchAddAccount.setAsVerticalList();
```  
は一度最上部に戻ってから下へ探しに行きます。uiautomatorが画面に表示されている範囲のものしか認識していない、現在地が最上部でない場合に必ず現在地より下にスクロールした先にある保証がない等の事情による動作かと思います。


そのうちにまた補足書くかもしれません。。
最終更新2014/04/11 00:10