Как заполнить пароль EditText с Android uiautomator?

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

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

Solutions Collecting From Web of "Как заполнить пароль EditText с Android uiautomator?"

У меня была такая же проблема с 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(); 

Я просто нахожу их по id:

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

Я вижу, что UI Automator Viewer теперь также показывает свойство ресурса-id, которое было бы полезно, если у вас нет доступа к коду.

Иногда ваш View s не будет иметь ResourceId , например, когда вам нужно программно ввести текстовое поле внутри веб-страницы, WebView внутри 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(); }