Androidオートメーショントレースシリーズ(2):コントロール上での操作

7507 ワード

前回お話ししたように、Android自動化テストでは、反射メカニズムによってページのすべてのコントロールを得ることができます.簡単な応用例を見てみましょう.
        ArrayList<View> views = getAllViews();

        for(View view : views)

        {

            Log.d("Views On Activity:", view.getClass().getName());

        }

これでLogCatですべてのViewを印刷できます.
03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.LinearLayout

03-27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarContainer

03-27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.LinearLayout

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.LinearLayout

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarView$HomeView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView

03-27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.view.menu.ActionMenuView

03-27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarContextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.FrameLayout

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.RelativeLayout

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.RelativeLayout

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.RelativeLayout

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView

03-27 22:24:52.369: D/Views On Activity:(2123): android.widget.Button

03-27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.policy.impl.PhoneWindow$DecorView

ここには、Layout、TextView、Buttonなど、すべてのコントロールが羅列されています.これらのコントロールを手に入れたのは、私たちに何の役に立つのでしょうか.
Yes、これらのコントロールがあれば、対応する操作を実行することができます!
例:
  • Buttonがあり、Click On Button操作
  • を実行できます.
  • TextViewがあれば、ページのすべてのTextを得ることができ、Messageを検証したり、Localization Testing
  • をしたりすることができます.
  • 同様にImageViewがあり、Click操作を実行することができ、ページ表示の画像
  • を得ることもできます.
  • ......

  • 次に、これらの操作に関する一般的なセクションをいくつか説明します.
  • Click操作
        public void clickOnView(int id)
    
        {
    
            View view = solo.getView(id);
    
            if(view != null)
    
            {
    
                solo.clickOnView(view);
    
            }
    
        }


  •  
  • 待機中
        public boolean isViewGone(int id, long timeout)
    
        {
    
            final long endtime = SystemClock.uptimeMillis() + timeout;
    
            
    
            while(SystemClock.uptimeMillis() < endtime)
    
            {
    
                if(solo.getView(id).hasFocusable())
    
                {
    
                    solo.sleep(10);
    
                }
    
                else
    
                {
    
                    return true;
    
                }
    
            }
    
            
    
            return false;
    
        }

  • ページ画像を取得
        public Bitmap getSourceIcon()
    
        {
    
            BitmapDrawable drawable = (BitmapDrawable) sourceImageView.getDrawable();
    
            return  drawable.getBitmap();
    
        }

    ここでのsourceImageView変数は、ImageViewのインスタンスです.

  • 便宜上、プロジェクトではRobotiumフレームワークを使用していますが、遡及すると、思わず質問します.
    これらの操作はどのように実現されますか?自分で書けますか?
    RobotiumフレームワークはInstrumentationに基づいていることを知っています.また、市販されているAndroidテストフレームワークの多くはInstrumentationに基づいています.Instrumentationは自動化の礎であり、RobotiumのClickメソッドを次々とフォローしています.最終的にはInstrumentationを呼び出していることがわかります.
    public void sendPointerSync ( MotionEvent  event)
    を使用してClick操作を実行します.
    For Example:  Solo.clickOnView(View)はclickerを呼び出します.clickOnScreen(view)をフォローすると、次のコードが表示されます.
        public void clickOnScreen(float x, float y) {
    
            long downTime = SystemClock.uptimeMillis();
    
            long eventTime = SystemClock.uptimeMillis();
    
            MotionEvent event = MotionEvent.obtain(downTime, eventTime,
    
                    MotionEvent.ACTION_DOWN, x, y, 0);
    
            MotionEvent event2 = MotionEvent.obtain(downTime, eventTime,
    
                    MotionEvent.ACTION_UP, x, y, 0);
    
            try{
    
                inst.sendPointerSync(event);
    
                inst.sendPointerSync(event2);
    
                sleeper.sleep(MINISLEEP);
    
            }catch(SecurityException e){
    
                Assert.assertTrue("Click can not be completed!", false);
    
            }
    
        }

    これでわかりました.Android Automation testingでは、Clickの操作がこのように実現されていました.
    まとめ
    Android自動化テストのフレームワークを自分で書くなら、このような方法も提供できますか?