8

Возможно ли, чтобы uiautomator выбрал пароль EditText? У меня нет проблем с поиском других представлений EditText по их свойству android: hint, но uiautomatorviewer показывает все поля пароля как NAF. Я попытался установить описание содержимого поля пароля, и это тоже не сработало.Как заполнить пароль EditText с помощью Android uiautomator?

Если это невозможно, как установить тайм-аут для тестера вручную ввести пароль?

ответ

7

У меня была такая же проблема с API v16. Сегодня я попробовал свой скрипт с v17 (Android 4.2), и он работал как шарм. Кажется, что в первой версии uiautomator есть некоторые основные ошибки.

Вот мой код:

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

0

Я просто найти их ID:

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

Я вижу, что пользовательский интерфейс Automator просмотра теперь также показывает свойство ресурсов 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(); 
} 
Смежные вопросы