如何使用Android uiautomator填写密码编辑文本?

如何使用Android uiautomator填写密码编辑文本?,android,ui-automation,android-testing,android-uiautomator,Android,Ui Automation,Android Testing,Android Uiautomator,uiautomator是否可以选择密码编辑文本?通过android:hint属性查找其他EditText视图没有问题,但是uiautomatorviewer将所有密码字段显示为NAF。我尝试设置密码字段内容描述,但也没有成功 如果不可能,如何设置测试人员手动输入密码的超时时间?我在API v16中也遇到了同样的问题。 今天我用v17(安卓4.2)试了试我的脚本,效果非常好。 似乎第一个版本的uiautomator有一些主要的bug 这是我的密码: // click the admin butto

uiautomator是否可以选择密码编辑文本?通过android:hint属性查找其他EditText视图没有问题,但是uiautomatorviewer将所有密码字段显示为NAF。我尝试设置密码字段内容描述,但也没有成功


如果不可能,如何设置测试人员手动输入密码的超时时间?

我在API v16中也遇到了同样的问题。 今天我用v17(安卓4.2)试了试我的脚本,效果非常好。 似乎第一个版本的
uiautomator
有一些主要的bug

这是我的密码:

// 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现在也显示了resource id属性,如果您没有访问代码的权限,该属性将非常有用。

有时,您的
视图将没有
ResourceId
,例如,您需要以编程方式在
WebView
中呈现的网页中键入文本字段。i、 e

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

谢谢尝试几种方法,但在v16中一无所获。所以答案是改为v17。就我所知,这对网络视图不起作用。问题不是关于网络视图,这是一个更复杂的问题