qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Android自動化追本溯源系列(2):在控件上執(zhí)行操作

          上回說到,在Android自動化測試時,通過反射機制,我們能獲得頁面的所有控件。來看一個簡單的應用例子:

          ArrayList<View> views = getAllViews();
          for(View view : views)

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

            這樣在LogCat里我們就可以打印出所有的View了:

          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.LinearLayout
          -27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarContainer
          -27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.LinearLayout
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.LinearLayout
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarView$HomeView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView
          -27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.view.menu.ActionMenuView
          -27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.widget.ActionBarContextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.FrameLayout
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.RelativeLayout
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.RelativeLayout
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.ImageView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.RelativeLayout
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.TextView
          -27 22:24:52.369: D/Views On Activity:(2123): android.widget.Button
          -27 22:24:52.369: D/Views On Activity:(2123): com.android.internal.policy.impl.PhoneWindow$DecorView

            我們看到這里羅列了所有的控件,有Layout, TextView, Button 等等。而獲得了這些控件,對我們有什么用呢?

            Yes,有了這些控件,我們就可以執(zhí)行相應的操作了!

            比如:

            1、有了Button,我們可以執(zhí)行Click On Button操作

            2、有了TextView,我們就可以得到頁面的所有Text,去驗證Message或者做Localization Testing

            3、同樣有了ImageView,我們可以執(zhí)行Click操作,甚至可以得到頁面顯示的圖片

            4、.......

            下面分享一些我們項目中用到的關于這些操作的典型片斷:

            ● 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框架,但是如果追本溯源的話,我們不禁要問:

            這些操作是如何實現(xiàn)的?我們自己能不能寫?

            我們知道Robotium框架是基于Instrumentation,并且市面上大多數(shù)的Android測試框架都是基于 Instrumentation的,而Instrumentation就是我們做自動化的基石,一層層的跟進Robotium的Click方法,我們會看 到最終它是調用Instrumentation的:

            public void sendPointerSync (MotionEvent event)

            來實現(xiàn)Click操作。

            For Example:Solo.clickOnView(View 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的操作是這么實現(xiàn)的!

            總結

            要是我們自己來寫Android自動化測試框架,我們也可以提供這樣一個方法嘛~

          相關鏈接:

          Android自動化追本溯源系列(1):獲取頁面元素

          posted on 2013-05-20 10:16 順其自然EVO 閱讀(704) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄android

          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 和田市| 五台县| 霸州市| 贵定县| 修水县| 西藏| 临安市| 雅安市| 奉节县| 徐汇区| 兴山县| 东兰县| 若羌县| 东至县| 芦溪县| 固镇县| 朝阳县| 新巴尔虎右旗| 手游| 汉沽区| 达尔| 武隆县| 吉水县| 康保县| 潞西市| 常山县| 湟中县| 黑水县| 上蔡县| 静乐县| 瑞丽市| 广宗县| 潢川县| 寻甸| 金乡县| 拉孜县| 阿图什市| 马关县| 永寿县| 卓尼县| 临洮县|