Android自動化追本溯源系列(2):在控件上執(zhí)行操作
ArrayList<View> views = getAllViews(); 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自動化測試框架,我們也可以提供這樣一個方法嘛~
相關鏈接:
posted on 2013-05-20 10:16 順其自然EVO 閱讀(704) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄 、android