2014-04-18 11 views
6

Automatyzuję testowanie przepływu w mojej aplikacji, w której instaluję administratora urządzenia. Aby aktywować administratora urządzenia na większości urządzeń (załóżmy, że nie mam jakiegoś korporacyjnego interfejsu API, który pozwala mi to zrobić tak, jak to oferuje Samsung), system wyświetla popup dla użytkownika, który następnie musi kliknąć przycisk "Aktywuj".Jak wstrzyknąć wydarzenie click z Androidem UiAutomation.injectInputEvent

Używam Robotium i Androida JUnit do prowadzenia testów. W normalnym przypadku testowania można jedynie wchodzić w interakcje z aplikacją i procesem będącym w fazie testowania, a nie z żadnymi działaniami systemowymi, które się pojawiają.

The UiAutomation twierdzi, że pozwala na interakcję z innymi aplikacjami, korzystając z Accessibility Framework, a następnie dopuszczając jeden do .

więc - oto, co usiłuję zrobić:

public class AbcTests extends ActivityInstrumentationTestCase2<AbcActivity> { 

    private Solo mSolo 

    @Override 
    public void setUp() { 
     mSolo = new Solo(getInstrumentation(), getActivity()); 

    } 

    ... 

    public void testAbc(){ 

     final UiAutomation automation = getInstrumentation().getUiAutomation();   

     MotionEvent motionDown = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_DOWN, 
       100, 100, 0); 

     // This line was added in to give a complete solution 
     motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); 

     automation.injectInputEvent(motionDown, true) 
     MotionEvent motionUp = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), KeyEvent.ACTION_UP, 
       100, 100, 0); 

     // This line was added in to give a complete solution 
     motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); 

     automation.injectInputEvent(motionUp, true) 
     motionUp.recycle(); 
     motionDown.recycle(); 
    } 

} 

Kiedy ten test jest prowadzony popup systemowi „Activate” administrator urządzenie jest aktywne, i chcę po prostu kliknij na ekranie. Na potrzeby tego pytania zakodowałem na 100.100 jako pozycję kliknięć, ale realistycznie kliknę w prawym dolnym rogu ekranu, aby móc nacisnąć przycisk.

Nie dostaję żadnych zdarzeń kliknięcia występujących na ekranie. Czy ktoś ma z tym doświadczenie? Czy są jakieś alternatywy, aby robić to, co chcę robić? Z mojego zrozumienia jest bardzo mało narzędzi, które to robią.

Dzięki.

Aktualizacja Dodany setSource za właściwą odpowiedź

+0

myślę, że należy wyjąć setSource() wywołuje że edytowane w. Pierwotny pytanie powinno wykazać problem, jeżeli odpowiedź pokazuje rozwiązanie. Jak to jest, porównanie dwóch przyczyn zamieszania, ponieważ oba działają. – Project

Odpowiedz

6

końcu zorientowali to. Porównałem moje zdarzenia MotionEvent z dwoma zdarzeniami, które zostały wywołane po kliknięciu przycisku, a jedyną różnicą było źródło. Tak więc ustawiłem źródło na dwóch motionEvents i zadziałało.

.... 
motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); 
.... 
motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); 

A oto pełna wersja metody

//========================================================================= 
//==      Utility Methods        === 
//========================================================================= 
/** 
* Helper method injects a click event at a point on the active screen via the UiAutomation object. 
* @param x the x position on the screen to inject the click event 
* @param y the y position on the screen to inject the click event 
* @param automation a UiAutomation object rtreived through the current Instrumentation 
*/ 
static void injectClickEvent(float x, float y, UiAutomation automation){ 
    //A MotionEvent is a type of InputEvent. 
    //The event time must be the current uptime. 
    final long eventTime = SystemClock.uptimeMillis(); 

    //A typical click event triggered by a user click on the touchscreen creates two MotionEvents, 
    //first one with the action KeyEvent.ACTION_DOWN and the 2nd with the action KeyEvent.ACTION_UP 
    MotionEvent motionDown = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_DOWN, 
      x, y, 0); 
    //We must set the source of the MotionEvent or the click doesn't work. 
    motionDown.setSource(InputDevice.SOURCE_TOUCHSCREEN); 
    automation.injectInputEvent(motionDown, true); 
    MotionEvent motionUp = MotionEvent.obtain(eventTime, eventTime, KeyEvent.ACTION_UP, 
      x, y, 0); 
    motionUp.setSource(InputDevice.SOURCE_TOUCHSCREEN); 
    automation.injectInputEvent(motionUp, true); 
    //Recycle our events back to the system pool. 
    motionUp.recycle(); 
    motionDown.recycle(); 
} 
+0

Uwielbiam twoje javadoc i komentarze – David

+0

@David Thanks man! – jargetz

Powiązane problemy