使用 UiAutomator 输入文本 Android
Typing text with UiAutomator Android
我正在尝试测试我的应用程序 google signup / login feature
,particularly
用户尝试添加未在对话框中列出的新帐户的情况。
使用的设置对应于默认的 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 检查 EditText
:Updating 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);
我正在尝试测试我的应用程序 google signup / login feature
,particularly
用户尝试添加未在对话框中列出的新帐户的情况。
使用的设置对应于默认的 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 检查 EditText
:Updating 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);