1. 程式人生 > >Android自動化測試初探(四): 模擬鍵盤滑鼠事件(Socket+Instrumentation實現)

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;
  步驟2. 迴圈處理Message
//在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();
}
  步驟3. 在接收到Socket中的傳遞資訊後丟擲Message
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