我正在尝试用新的android-test-kit (Espresso)编写一些测试。但是我找不到关于如何检查是否显示对话框的任何信息并对其执行某些操作(例如单击正面和负面按钮,e.t.c。)。请注意,对话框也可能由WebView
显示,而不是由自己的应用程序显示。
任何帮助将不胜感激。我只需要一个链接,或基本的一些示例代码:
setCancelable(false)
并且我们要检查它)谢谢你的建议!
答案 0 :(得分:103)
要验证是否显示对话框,您只需检查是否显示带有对话框内文字的视图:
onView(withText("dialogText")).check(matches(isDisplayed()));
或者,基于id为
的文字onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
点击对话框按钮执行此操作(按钮1 - 确定,按钮2 - 取消):
onView(withId(android.R.id.button1)).perform(click());
更新
答案 1 :(得分:53)
我目前正在使用它,它似乎工作正常。
onView(withText(R.string.my_title))
.inRoot(isDialog()) // <---
.check(matches(isDisplayed()));
答案 2 :(得分:20)
如果您有类似的AlertDialog:
您可以检查组件是否显示:
int titleId = mActivityTestRule.getActivity().getResources()
.getIdentifier( "alertTitle", "id", "android" );
onView(withId(titleId))
.inRoot(isDialog())
.check(matches(withText(R.string.my_title)))
.check(matches(isDisplayed()));
onView(withId(android.R.id.text1))
.inRoot(isDialog())
.check(matches(withText(R.string.my_message)))
.check(matches(isDisplayed()));
onView(withId(android.R.id.button2))
.inRoot(isDialog())
.check(matches(withText(android.R.string.no)))
.check(matches(isDisplayed()));
onView(withId(android.R.id.button3))
.inRoot(isDialog())
.check(matches(withText(android.R.string.yes)))
.check(matches(isDisplayed()));
并执行操作:
onView(withId(android.R.id.button3)).perform(click());
答案 3 :(得分:3)
万一有人像我一样偶然发现这个问题。所有答案仅适用于带对话框按钮的对话框。在没有用户交互的情况下,不要尝试将此用于进度对话框。 Espresso一直在等待应用程序进入空闲状态。只要进度对话框可见,应用程序就不会空闲。
答案 4 :(得分:2)
为了回答问题4,接受的答案没有,我修改了下面的代码,我在Stack Overflow(link)上找到了这个代码,用于测试是否显示Toast。
@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}
传入的id
是当前显示在对话框中的View
的ID。您也可以这样编写方法:
@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}
现在它正在寻找包含特定文本字符串的View
。
像这样使用它:
getRootView(getActivity(), R.id.text_id).perform(click());
答案 5 :(得分:2)
按钮Ids R.id.button1和R.id.button2在各设备之间不会相同。 Ids可能随操作系统版本而变化。
实现这一目标的正确方法是使用UIAutomator。 在build.gradle中包含UIAutomator依赖项
// Set this dependency to build and run UI Automator tests
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
并使用
// Initialize UiDevice instance
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
// Search for correct button in the dialog.
UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText"));
if (button.exists() && button.isEnabled()) {
button.click();
}