使用 UiAutomator 输入文本 Android

Typing text with UiAutomator Android

我正在尝试测试我的应用程序 google signup / login featureparticularly 用户尝试添加未在对话框中列出的新帐户的情况。

使用的设置对应于默认的 google "add account" 设置。

我遇到的问题是,我似乎无法在应用程序要求时输入电子邮件,然后按 'next' 按钮

这是我的代码

        // Find add account button using uiautomator
        UiObject addButton = mDevice.findObject(new UiSelector().resourceId("android:id/button2"));
        assertEquals(true, addButton.exists());
        // Click the button

        // Fill email text box
        UiObject emailBox = mDevice.findObject(new UiSelector().resourceId("identifierId"));
        emailBox.waitForExists(TIMEOUT);
        assertEquals(true, emailBox.exists());
        emailBox.legacySetText(googleEmail);

        // Find 'NEXT' Button
        UiObject nextButton = mDevice.findObject(new UiSelector().resourceId("identifierNext"));
        assertEquals(true, nextButton.exists());
        nextButton.click();

        // Fill password
        UiObject passwordBox = mDevice.findObject(new UiSelector().resourceId("password"));
        passwordBox.waitForExists(TIMEOUT);
        assertEquals(true, passwordBox.exists());
        emailBox.clearTextField();
        emailBox.setText(googlePassword);

        // Find 'NEXT' Button
        nextButton = mDevice.findObject(new UiSelector().resourceId("next"));
        assertEquals(true, nextButton.exists());
        nextButton.click();

        // Find 'ACCEPT' Button
        nextButton = mDevice.findObject(new UiSelector().resourceId("next"));
        nextButton.waitForExists(TIMEOUT);
        assertEquals(true, nextButton.exists());
        nextButton.click();

该应用程序到达了应该输入电子邮件的屏幕,并且它在 "assertEquals(true, emailBox.exists());" 上没有失败,所以我相信该应用程序正在正确检测到它。

我也试过使用 "setText" 而不是 "legacySetText" 并注入了字符串,但 "next" 按钮未启用。

此外,有时会弹出键盘并输入文本,但这似乎是随机的,我不能随意复制它。

我做错了什么?

编辑:

我评论了其余代码并更改了按钮断言,正如预期的那样,"next" 按钮未启用,因为未键入任何文本。

// Find add account button using uiautomator
        UiObject addButton = mDevice.findObject(new UiSelector().resourceId("android:id/button2"));
        assertEquals(true, addButton.exists());
        // Click the button
        addButton.click();

        // Fill email text box
        UiObject emailBox = mDevice.findObject(new UiSelector().resourceId("identifierId").descriptionContains("Enter your email "));
        emailBox.waitForExists(TIMEOUT);
        assertEquals(true, emailBox.exists());
        emailBox.legacySetText(googleEmail);

        // Find 'NEXT' Button
        UiObject nextButton = mDevice.findObject(new UiSelector().resourceId("identifierNext"));
        assertEquals(true, nextButton.isEnabled());
        nextButton.click();

错误表明在 "assertEquals(true, nextButton.isEnabled());" 行

处它预期为 true 但结果为 false

编辑 2: 我发现问题出在 google 的登录页面解释文本的方式。

使用 uiautomatorviewer,我抓取了视图的屏幕截图并检查了我在其中手动编写了一些文本的 EditText 字段。我发现我写的文本没有填充 text 属性,而是进入了 content-description 属性。

我现在的问题是,我只找到了一种使用框架中的 setText 方法编辑文本的方法。我试过单击视图然后设置文本但没有成功。有什么方法可以用 uiautomator 更改内容描述吗?

而不是:

emailBox.legacySetText(googleEmail);

试着写这样的代码:

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

我认为您可能还会发现在 Espresso 中编写测试非常有用。我认为它更适合这个目的。 uiatomator 获得许可或通知或屏幕锁定会更好,它与 Espresso 一起工作就像魅力一样。两者均由 Google:

开发

查看此站点以了解更多信息:https://google.github.io/android-testing-support-library/

使用 Espresso 检查 EditTextUpdating an EditText with Espresso

希望对您有所帮助

我可以使用 gmail 登录,请删除设备中配置的所有 gmail 帐户。 100% 工作和日常 运行 成功穿西装。

 final UiDevice mDevice=             
 UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
 final int timeOut = 1000 * 60; 
 mDevice.wait(Until.findObject(By.clazz(WebView.class)), timeOut);

    // Set Login
    UiObject emailInput = mDevice.findObject(new UiSelector()
            .instance(0)
            .className(EditText.class));

    emailInput.waitForExists(timeOut);
    emailInput.setText("your - Email");// please set your email-id here
   // Confirm Button Click
    UiObject Next = mDevice.findObject(new UiSelector()
            .resourceId("identifierNext"));
    Next.waitForExists(timeOut);
    Next.click();

    // Set Password
    UiObject passwordInput = mDevice.findObject(new UiSelector()
            .resourceId("password"));

    passwordInput.waitForExists(timeOut);
    passwordInput.setText("password");// type your password here

    // Confirm Button Click
    Next = mDevice.findObject(new UiSelector()
            .resourceId("passwordNext"));
    Next.waitForExists(timeOut);
    Next.click();

    UiObject nextButton = mDevice.findObject(new UiSelector()
            .resourceId("next"));
    nextButton.waitForExists(timeOut);
    nextButton.click();
    UiObject layout = mDevice.findObject(new UiSelector()
    .resourceId("suw_layout_content"));
    layout.waitForExists(timeOut);
    ElapsedTimeIdlingResource.WaitForScreenContentLoad(5);
    UiObject buttonNext = mDevice.findObject(new UiSelector()
            .className(Button.class));
    buttonNext.waitForExists(timeOut);
    assertEquals(false, nextButton.exists());
    buttonNext.click();
    ElapsedTimeIdlingResource.WaitForScreenContentLoad(50);