8

uiautomator是否可以選擇密碼EditText?我沒有任何問題通過他們的android:hint屬性找到其他EditText視圖,但uiautomatorviewer將所有密碼字段顯示爲NAF。我嘗試設置密碼字段的內容描述,也沒有工作。如何使用Android uiautomator填寫密碼EditText?

如果這是不可能的,你怎麼設置超時的測試人員手動輸入密碼?

回答

7

我曾與API V16同樣的問題。 今天我試了我的腳本與V17(Android 4.2),它的工作就像一個魅力。 看來的uiautomator第一個版本有一些重大的錯誤。

這裏是我的代碼:

onView(withId(R.id.input_password)).perform(typeText("password")); 

我看到UI Automator的瀏覽器中也顯示資源id屬性,這將是有益的:

// click the admin button 
new UiObject(new UiSelector().text("admin")).click(); 
// set pwd text 
new UiObject(new UiSelector().description("pwdEditText")).setText("admin"); 
// click login button 
new UiObject(new UiSelector().description("loginButton")).click(); 
+1

感謝。 嘗試一些方法,但在v16中什麼都沒有。 所以答案是改爲v17。 – Michael 2013-11-08 02:31:05

0

我只是通過ID找到他們如果你沒有訪問代碼。

0

有時,您的View s將不會有ResourceId,例如您需要以編程方式鍵入到呈現在WebView內的網頁中的文本字段的情況。即

// Fetch the EditText within the iOrder Webpage. 
final UiObject lUiObject = UiDevice.getInstance(getInstrumentation()).findObject(new UiSelector().className(EditText.class).textContains("Enter Loyalty Code")); 

在這種情況下,我們需要使用UiSelector類動態搜索EditText;但是,您會發現返回的Matcher<View>onView(with(...))方法不兼容。

當使用UiSelector,你可以採取的UiDevice參考的優勢,假以編程使用下面的方法按鍵:

/* Declare the KeyCodeMap. */ 
private static final KeyCharacterMap MAP_KEYCODE = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 

/** Simulates typing within a UiObject. The typed text is appended to the Object. */ 
private final void type(final UiObject pUiObject, final String pString, final boolean pIsSimulateTyping, final boolean pIsClearField) throws Exception { 
    // Fetch the Instrumentation. 
    final Instrumentation lInstrumentation = getInstrumentation(); 
    // Fetch the UiDevice. 
    final UiDevice  lUiDevice  = UiDevice.getInstance(lInstrumentation); 
    // Are we clearing the Field beforehand? 
    if(pIsClearField) { 
     // Reset the Field Text. 
     pUiObject.setText(""); 
    } 
    // Are we going to simulate mechanical typing? 
    if(pIsSimulateTyping) { 
     // Click the Field. (Implicitly open Android's Soft Keyboard.) 
     pUiObject.click(); 
     // Fetch the KeyEvents. 
     final KeyEvent[] lKeyEvents = SignUpTest.MAP_KEYCODE.getEvents(pString.toCharArray()); 
     // Delay. 
     lInstrumentation.waitForIdleSync(); 
     // Iterate the KeyEvents. 
     for(final KeyEvent lKeyEvent : lKeyEvents) { 
      // Is the KeyEvent a Release. (The KeyEvents contain both down and up events, whereas `pressKeyCode` encapsulates both down and up. This conditional statement essentially decimates the array.) 
      if(lKeyEvent.getAction() == KeyEvent.ACTION_UP) { 
       // Press the KeyEvent's corresponding KeyCode (Take account for special characters). 
       lUiDevice.pressKeyCode(lKeyEvent.getKeyCode(), lKeyEvent.isShiftPressed() ? KeyEvent.META_SHIFT_ON : 0); 
       // Delay. 
       lInstrumentation.waitForIdleSync(); 
      } 
     } 
     // Close the keyboard. 
     lUiDevice.pressBack(); 
    } 
    else { 
     // Write the String. 
     pUiObject.setText(pUiObject.getText() + pString); 
    } 
    // Delay. 
    lInstrumentation.waitForIdleSync(); 
}