2014-04-18 12 views
6

Tôi đang tự động thử nghiệm luồng trong ứng dụng của mình, nơi tôi cài đặt quản trị viên thiết bị. Để kích hoạt quản trị viên thiết bị trên hầu hết các thiết bị (giả sử ở đây tôi không có một số API doanh nghiệp cho phép tôi làm điều này giống như những gì Samsung cung cấp), hệ thống sẽ hiển thị cửa sổ bật lên cho người dùng sau đó phải nhấp vào nút "Kích hoạt".Cách chèn sự kiện nhấp bằng Android UiAutomation.injectInputEvent

Tôi đang sử dụng Robotium và Android JUnit để lái thử nghiệm của mình. Trong một trường hợp thử nghiệm bình thường, người ta chỉ có thể tương tác với ứng dụng và quy trình được thử nghiệm chứ không phải bất kỳ hoạt động hệ thống nào xuất hiện.

Yêu cầu UiAutomation cho phép bạn tương tác với các ứng dụng khác bằng cách tận dụng Accessibility Framework và sau đó cho phép một đến inject arbitrary input events.

Vì vậy, - đây là những gì tôi đang cố gắng để làm:

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(); 
    } 

} 

Khi thử nghiệm này được điều hành hệ thống popup để "Kích hoạt" người quản trị thiết bị đang hoạt động, và tôi muốn chỉ cần bấm trên màn hình. Tôi đã hardcoded trong 100,100 là vị trí cho các nhấp chuột cho các mục đích của câu hỏi này, nhưng thực tế tôi sẽ bấm vào góc dưới bên phải của màn hình để tôi có thể nhấn nút.

Tôi không nhận được bất kỳ sự kiện nhấp nào xảy ra trên màn hình. Có ai có kinh nghiệm với điều này? Có cách nào khác để làm những gì tôi muốn làm không? Từ sự hiểu biết của tôi, có rất ít công cụ làm điều này.

Cảm ơn.

Cập nhật Added setSource cho câu trả lời đúng

+0

Tôi nghĩ bạn nên đưa ra các setSource() gọi mà bạn chỉnh sửa trong. Các câu hỏi ban đầu phải chứng minh được vấn đề, mà câu trả lời cho thấy dung dịch. Vì nó là, so sánh hai nguyên nhân gây nhầm lẫn vì cả hai đều làm việc. – Project

Trả lời

6

Cuối cùng figured this out. Tôi đã so sánh MotionEvents với hai sự kiện được gửi đi khi tôi nhấp vào nút và sự khác biệt duy nhất là nguồn. Vì vậy, tôi đặt nguồn trên hai motionEvents và nó hoạt động.

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

Và đây là một phiên bản đầy đủ của phương pháp

//========================================================================= 
//==      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

Tôi yêu javadoc và ý kiến ​​của bạn – David

+0

@David Cảm ơn người đàn ông! – jargetz

Các vấn đề liên quan