Android自動化測試初探(四): 模擬鍵盤滑鼠事件(Socket+Instrumentation實現)
通過Socket + Instrumentation實現模擬鍵盤滑鼠事件主要通過以下三個部分組成:
* Socket程式設計:實現PC和Emulator通訊,並進行迴圈監聽
* Service服務:將Socket的監聽程式放在Service中,從而達到後臺執行的目的。這裡要說明的是啟動服務有兩種方式,bindService和startService,兩者的區別是,前者會使啟動的Service隨著啟動Service的Activity的消亡而消亡,而startService則不會這樣,除非顯式呼叫stopService,否則一直會在後臺執行因為Service需要通過一個Activity來進行啟動,所以採用startService更適合當前的情形
* Instrumentation傳送鍵盤滑鼠事件:Instrumentation提供了豐富的以send開頭的函式介面來實現模擬鍵盤滑鼠,如下所述:
sendCharacterSync(int keyCode) //用於傳送指定KeyCode的按鍵
sendKeyDownUpSync(int key) //用於傳送指定KeyCode的按鍵
sendPointerSync(MotionEvent event) //用於模擬Touch
sendStringSync(String text) //用於傳送字串
注意:以上函式必須通過Message的形式拋到Message佇列中。如果直接進行呼叫加會導致程式崩潰。
對於Socket程式設計和Service網上有很多成功的範例,此文不再累述,下面著重介紹一下發送鍵盤滑鼠模擬事件的程式碼:
1. 傳送鍵盤KeyCode:
步驟1. 宣告類handler變數
private static Handler handler; |
//在Activity的onCreate方法中對下列函式進行呼叫 private void createMessageHandleThread(){ //need start a thread to raise looper, otherwise it will be blocked Thread t = new Thread() { public void run() { Log.i( TAG,"Creating handler ..." ); Looper.prepare(); handler = new Handler(){ public void handleMessage(Message msg) { //process incoming messages here } }; Looper.loop(); Log.i( TAG, "Looper thread ends" ); } }; t.start(); } |
handler.post( new Runnable() { public void run() { Instrumentation inst=new Instrumentation(); inst.sendKeyDownUpSync(keyCode); } } ); |
2. Touch指定座標,如下例子即touch point(240,400)
Instrumentation inst=new Instrumentation(); inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 240, 400, 0)); inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 240, 400, 0)); |
3. 模擬滑動軌跡
將上述方法中間新增 MotionEvent.ACTION_MOVE