androidスマホ動作テストとuiautomator

はい。  
動作環境を整えてサンプルまでとかの参照先さまは下記リンクから参照先さまを
[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)
メニューの呼び出しなどで pressKeyCode(82);とか使ったりします。
ただし内部の命令で直接だったりするので、ユーザー利用で行われる操作・挙動と少し違うのでアレです。
androidSDK内のuiautomatorviewerというツールから見えないものはおそらく処理が色々大変っぽいです。  
またスマホの画面上では見えてる・触れるアイコンもuiautomatorviewerでは見えない、ヒエラルキーでも存在が確認できないものは触れなかったりします。  
・主な動作確認端末はXperiaです。

```java:うちのサンプル
package com.fukadori.android.nachtigall;

//import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import android.widget.TextView;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

/**
Docomoバージョン
・ホーム画面がdocomoLIVE以外
・インストールしようとしたアプリが既にインストール済み
・ログインしようとしたアカウントが既にログイン済み
・通信が遅く読込や画面遷移に時間がかかるとき


ざっくりと動作フロー
1.Facebook、google、Xperia用Facebookログイン
2.プレイストア起動でアプリダウンロード
3.
4.LINEやTwitterをログインデ


**/
public class and42 extends UiAutomatorTestCase {
    public void testAddition() throws UiObjectNotFoundException, IOException {

/////account情報のメアドとパス読込準備
        BufferedReader buf1 = new BufferedReader(new InputStreamReader(System.in));
        int flag = 1;
        ///<EASは現状スルー予定_ここの分は何もデータを読み込みません。
        int EASflag = 1;
        String EASAddress = "ad";
        String EASPassword = "pass";
        ///EASは現状スルー予定>

		//メアドとパスは現行でgoogle,twitter,facebook,LINE全て同じものであることを想定。
        String mailadress = buf1.readLine();
        String password = buf1.readLine();

 //////kihon_button
        UiObject GOTOtsugihe = new UiObject(new UiSelector().text("次へ"));
        UiObject AddAccount = new UiObject(new UiSelector().text("アカウントを追加"));
        UiObject Agreement = new UiObject(new UiSelector().text("同意する"));
        UiObject confirmationOK = new UiObject(new UiSelector().text("OK"));
        UiObject confirmationkakunin = new UiObject(new UiSelector().text("確認"));
        UiObject CheckBox1 = new UiObject(new UiSelector().className("android.widget.CheckBox").index(1).clickable(true));
        UiObject Sankaku3 = new UiObject(new UiSelector().className("android.widget.Button").index(3).clickable(true));
        UiObject InstallAPK = new UiObject(new UiSelector().text("インストール"));
        UiObject KoushinAPK = new UiObject(new UiSelector().text("更新"));
        UiObject LoginButton = new UiObject(new UiSelector().text("ログイン"));

    //ホームから設定に入る		
        getUiDevice().pressHome();
        if (flag == 1) {
        	String cmd = "am start -a android.intent.action.MAIN -n com.android.settings/.Settings";
    		Runtime.getRuntime().exec(cmd);
		    //getUiDevice().pressMenu();
            //UiObject HomeToSettings = new UiObject(new UiSelector().text("本体設定"));
            //HomeToSettings.click();
    //スクロールさせて探さす
            UiScrollable SearchSetLang = new UiScrollable(new UiSelector().scrollable(true));
    // スワイプ時のスクロール方向を垂直方向に設定
            SearchSetLang.setAsVerticalList();
    // アプリランチャーの子ビューから以下の条件を満たすUIオブジェクトを取得
    // 「クラス名が"android.widget.TextView"」、かつ、「テキストが"アカウントを追加"」
            UiObject SetLangClick = SearchSetLang.getChildByText(
                new UiSelector().className(TextView.class.getName()),
      	        "言語と入力");
            SetLangClick.click();
            UiObject currentlang = new UiObject(new UiSelector().text("現在の入力方法"));
            currentlang.click();
            UiObject changelang = new UiObject(new UiSelector().text("外国語キーボード"));
            changelang.click();
            getUiDevice().pressBack();
      //getUiDevice().pressKeyCode(4);

        UiScrollable SearchAddAccount = new UiScrollable(new UiSelector().scrollable(true));
		// スワイプ時のスクロール方向を垂直方向に設定
        SearchAddAccount.setAsVerticalList();
      // アプリランチャーの子ビューから以下の条件を満たすUIオブジェクトを取得
      // 「クラス名が"android.widget.TextView"」、かつ、「テキストが"アカウントを追加"」をそっと探すだけ
        UiObject AddAccountClick = SearchAddAccount.getChildByText(
      	    new UiSelector().className(TextView.class.getName()),
            "アカウントを追加");
        }
      //AddAccountClick.click();
//ここからがアカウントログイン
//{(設定画面であることを想定)アカウントを追加をタップからログインして設定に戻るまで}
        ///現状でEASのログインはフラグ設定で強制スキップします。
        if (EASflag != 1) {
      	    AddAccount.click();
            UiObject ExActiveSyncAccount = new UiObject(new UiSelector().text("Exchange ActiveSync"));
            ExActiveSyncAccount.clickAndWaitForNewWindow();
            UiObject editEASAccount = new UiObject(new UiSelector().text("Eメールアドレス"));
            editEASAccount.setText(EASAddress);
          //getUiDevice().pressEnter();
            UiObject editEASPassword = new UiObject(new UiSelector().className("android.widget.EditText").index(2));
            editEASPassword.setText(EASPassword);
            getUiDevice().pressEnter();

            GOTOtsugihe.clickAndWaitForNewWindow();
            sleep(30000);
            GOTOtsugihe.clickAndWaitForNewWindow();
            GOTOtsugihe.clickAndWaitForNewWindow();
        }

        if (flag == 1) {
            AddAccount.clickAndWaitForNewWindow();
            UiObject FacebookAccount = new UiObject(new UiSelector().text("Facebook"));
            FacebookAccount.clickAndWaitForNewWindow();
            //FacebookAccount.click();
            UiObject FacebookAdress = new UiObject(new UiSelector().className("android.widget.EditText").index(1));
            FacebookAdress.click();
            getUiDevice().pressKeyCode(122);
            for (int bs=0;bs<35;bs++){
                getUiDevice().pressKeyCode(112);
            }
            FacebookAdress.setText(mailadress);
            UiObject FacebookPassword = new UiObject(new UiSelector().className("android.widget.EditText").index(2));
            FacebookPassword.setText(password);
            LoginButton.click();
            sleep(5555);
             //getUiDevice().pressKeyCode(4);

          //連絡帳同期の確認を聞かれる対策
            UiObject FacebookSync = new UiObject(new UiSelector().text("同期しない"));
            try {
                FacebookSync.click();
          //UiObject FacebookSync2 = new UiObject(new UiSelector().text("完了"));
          //FacebookSync2.clickAndWaitForNewWindow();
                UiObject FacebookSync2 = new UiObject(new UiSelector().className("android.view.View").index(0).clickable(true));
                FacebookSync2.clickAndWaitForNewWindow();
            } catch (UiObjectNotFoundException e) {
          	    sleep(777);
            }
        }

        if (flag == 1) {
            AddAccount.clickAndWaitForNewWindow();
            UiObject GoogleAccount = new UiObject(new UiSelector().text("Google"));
            GoogleAccount.clickAndWaitForNewWindow();	
            UiObject ExistingAccount = new UiObject(new UiSelector().text("既存のアカウント"));
            ExistingAccount.click();	
            UiObject editAccount = new UiObject(new UiSelector().className("android.widget.EditText"));
            editAccount.setText(mailadress);
            getUiDevice().pressEnter();
            getUiDevice().pressEnter();
            UiObject editPassword = new UiObject(new UiSelector().className("android.widget.TextView"));
            editPassword.setText(password);
            getUiDevice().pressEnter();
            UiObject confirmationBox = new UiObject(new UiSelector().textStartsWith("Google"));
            confirmationBox.click();
            confirmationOK.clickAndWaitForNewWindow();
            sleep(4000);
            CheckBox1.click();
            Sankaku3.clickAndWaitForNewWindow();
            sleep(3000);
          //GOTOtsugihe.click();
        }
/**        UiObject SENAccount = new UiObject(new UiSelector().text("Sony Entertainment Network"));
      SENAccount.clickAndWaitForNewWindow();
      UiObject SENAdress = new UiObject(new UiSelector().className("android.widget.EditText").index(1));
      SENAdress.setText("beachboy5678@gmail.com");
      getUiDevice().pressEnter();
      UiObject SENPassword = new UiObject(new UiSelector().className("android.widget.EditText").index(3));
      SENPassword.setText("vs9770vs");
      getUiDevice().pressEnter();**/
        if (flag == 1) {
            AddAccount.clickAndWaitForNewWindow();
            UiObject XperiaFBAccount = new UiObject(new UiSelector().text("Xperia?用Facebook"));
            XperiaFBAccount.clickAndWaitForNewWindow();
            UiObject XperiaFBCompletion = new UiObject(new UiSelector().text("完了"));
            XperiaFBCompletion.click();
        }

    //ここからPlayストアでアプリをダウンロード
        getUiDevice().pressHome();
        
        if (flag == 1) {
        	Runtime.getRuntime().exec("am start -W com.android.vending");
            //UiObject HomePlaystore = new UiObject(new UiSelector().text("Playストア"));
            //HomePlaystore.clickAndWaitForNewWindow();

    //先にtwitterでLINEもダウンロード
            UiObject PlaystoreApkSearch = new UiObject(new UiSelector().description("Google Playを検索"));
            PlaystoreApkSearch.click();
            UiObject editSearch = new UiObject(new UiSelector().className("android.widget.EditText"));
            editSearch.setText("twitter");
            //getUiDevice().pressKeyCode(140);
            //getUiDevice().pressEnter();
            getUiDevice().pressEnter();
            sleep(2525);
            //bottom_t
            // 指定したパッケージ名のアプリの存在を確認する
            UiObject AppsButtonTwit = new UiObject(new UiSelector().text("Twitter"));
            AppsButtonTwit.click();
      //button1.click();
            try {
                InstallAPK.clickAndWaitForNewWindow();
                Agreement.clickAndWaitForNewWindow();
            } catch (UiObjectNotFoundException e) {
      	    sleep(2525);
            }


            PlaystoreApkSearch.click();
            editSearch.setText("line");
            getUiDevice().pressEnter();
            sleep(2525);
            UiObject AppsButtonLINE = new UiObject(new UiSelector().textContains("無料通話"));
            AppsButtonLINE.click();
      //button1.click();
            try {
                InstallAPK.clickAndWaitForNewWindow();
                Agreement.clickAndWaitForNewWindow();
            } catch (UiObjectNotFoundException e) {
      	        sleep(2525);
            }
            getUiDevice().pressKeyCode(4);
            getUiDevice().pressKeyCode(4);
            getUiDevice().pressKeyCode(4);

            UiObject allAppsButtonPlay2 = new UiObject(new UiSelector().text("アプリ"));
            allAppsButtonPlay2.clickAndWaitForNewWindow();
            // スワイプしながらアイテムを検索できるUiScrollableインスタンスを作成
            UiScrollable appViewsPlay = new UiScrollable(new UiSelector().scrollable(true));
            // スワイプ時のスクロール方向を水平方向に設定
            appViewsPlay.setAsHorizontalList();
            // アプリランチャーの子ビューから以下の条件を満たすUIオブジェクトを取得
            // 「クラス名が"android.widget.TextView"」、かつ、「テキストが"電卓"」
            UiObject targetAppMuryo = appViewsPlay.getChildByText(
                new UiSelector().className(TextView.class.getName()),
                "人気（無料）");
        // 見つかったUIオブジェクトをクリックする
            targetAppMuryo.clickAndWaitForNewWindow();

            for (int i=1;i<20;i++){
                String na=(Integer.toString(i)) +".";
                UiObject allAppsButtonInstall = new UiObject(new UiSelector().textStartsWith(na));
                allAppsButtonInstall.clickAndWaitForNewWindow();
                try {
                    InstallAPK.clickAndWaitForNewWindow();
                    Agreement.clickAndWaitForNewWindow();
                } catch (UiObjectNotFoundException e) {
          	        sleep(777);
                }
                getUiDevice().pressKeyCode(4);

        //現行機種の大半が5個目まで全表示で6個目は半分途切れているので5で割り切れる番目インストール後に画面スクロール
            if (i%5==0) {
            	sleep(2525);
        	    getUiDevice().pressKeyCode(20);
        	    sleep(2525);
        	    getUiDevice().pressKeyCode(62);
        	    sleep(2525);
        	    getUiDevice().pressKeyCode(62);
	        //getUiDevice().pressKeyCode(4);
	            }
            }
        }
        
      ///ダウンロードここまで
        getUiDevice().pressKeyCode(3);
        sleep(777);
        Runtime.getRuntime().exec("am start -W com.twitter.android");
        //UiObject Twitterlaunch = new UiObject(new UiSelector().text("Twitter"));
        //Twitterlaunch.clickAndWaitForNewWindow();
        LoginButton.clickAndWaitForNewWindow();
        UiObject editTextlogin = new UiObject(new UiSelector().className("android.widget.TextView"));
        editTextlogin.setText(mailadress);
        getUiDevice().pressEnter();
        UiObject TwitterLogin2 = new UiObject(new UiSelector().text("パスワード"));
        TwitterLogin2.setText(password);
        LoginButton.clickAndWaitForNewWindow();
        UiObject allAppsButtonPlayTwLogin2K = new UiObject(new UiSelector().text("許可しない"));
        allAppsButtonPlayTwLogin2K.click();

        getUiDevice().pressHome();
        sleep(2525);
      
        UiObject LINElaunch = new UiObject(new UiSelector().text("LINE"));
        LINElaunch.clickAndWaitForNewWindow();
        UiObject LINELogin = new UiObject(new UiSelector().text("LINEユーザーログイン"));
        LINELogin.clickAndWaitForNewWindow();
        UiObject LINEAccount = new UiObject(new UiSelector().className("android.widget.EditText").index(0));
        LINEAccount.setText(mailadress);
        getUiDevice().pressEnter();
        UiObject LINEPassword = new UiObject(new UiSelector().className("android.widget.EditText").index(1));
        LINEPassword.setText(password);
        getUiDevice().pressEnter();
        confirmationkakunin.clickAndWaitForNewWindow();
        sleep(4000);
        getUiDevice().pressKeyCode(61);
        getUiDevice().pressKeyCode(61);
        getUiDevice().pressKeyCode(61);
        getUiDevice().pressKeyCode(61);
        getUiDevice().pressKeyCode(66);
      //OKボタンは座標がずれているため指定できません、触れません。。。
      //confirmationOK.clickAndWaitForNewWindow();
      //GOTOtsugihe.clickAndWaitForNewWindow();
      //以前は出てた確認画面が出なくなった？？？
      //UiObject SearchConfirm = SearchAddAccount.getChildByText(
      //		new UiSelector().className(TextView.class.getName()),
      //		"確認");
      //confirmationkakunin.click();
      
        UiObject LINESkip = new UiObject(new UiSelector().text("スキップする"));
        LINESkip.clickAndWaitForNewWindow();
        sleep(4000);
        getUiDevice().pressHome();

      /**
		AddAccount.clickAndWaitForNewWindow();
		UiObject XperiaTwAccount = new UiObject(new UiSelector().text("Xperia?用Twitter"));
      XperiaTwAccount.clickAndWaitForNewWindow();
      UiObject XperiaTwCompletion = new UiObject(new UiSelector().description(""));
      XperiaTwCompletion.click();**/

        }
    }
```

・clickAndWaitForNewWindowはあんまり辛抱強くは待ってくれないので強引にsleepで待たせている箇所が多いです。
・メアドとパスはtxtファイル1,2行目に用意しておいたものを読み込ませる使わせることを想定してます。  
・変数を増やせばSNS毎にメアドやパスを違うものを使ったり、ログイン操作自体をスキップしたり出来ます。  
・pressKeyCode(4)とpressBack()はほぼ同じ命令のはずですが、動作さすのにどちらが有効に/期待する風に動くかは書いた後に挙動を見ながらが必要だったりします。