Androidオートメーショントレースシリーズ(2):コントロール上での操作
7507 ワード
前回お話ししたように、Android自動化テストでは、反射メカニズムによってページのすべてのコントロールを得ることができます.簡単な応用例を見てみましょう.
これでLogCatですべてのViewを印刷できます.
ここには、Layout、TextView、Buttonなど、すべてのコントロールが羅列されています.これらのコントロールを手に入れたのは、私たちに何の役に立つのでしょうか.
Yes、これらのコントロールがあれば、対応する操作を実行することができます!
例: Buttonがあり、Click On Button操作 を実行できます. TextViewがあれば、ページのすべてのTextを得ることができ、Messageを検証したり、Localization Testing をしたりすることができます.同様にImageViewがあり、Click操作を実行することができ、ページ表示の画像 を得ることもできます. ......
次に、これらの操作に関する一般的なセクションをいくつか説明します. Click操作
待機中
ページ画像を取得
ここでの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)をフォローすると、次のコードが表示されます.
これでわかりました.Android Automation testingでは、Clickの操作がこのように実現されていました.
まとめ
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、これらのコントロールがあれば、対応する操作を実行することができます!
例:
次に、これらの操作に関する一般的なセクションをいくつか説明します.
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自動化テストのフレームワークを自分で書くなら、このような方法も提供できますか?