检查Espresso是否显示对话框

时间:2014-01-10 13:25:13

标签: android android-espresso

我正在尝试用新的android-test-kit (Espresso)编写一些测试。但是我找不到关于如何检查是否显示对话框的任何信息并对其执行某些操作(例如单击正面和负面按钮,e.t.c。)。请注意,对话框也可能由WebView显示,而不是由自己的应用程序显示。

任何帮助将不胜感激。我只需要一个链接,或基本的一些示例代码:

  1. 检查是否出现对话框
  2. 点击对话框按钮
  3. 与对话框的内部视图交互(如果是自定义视图)
  4. 在对话框外部执行预览,并检查它是否显示(例如,如果在对话框构建器上调用setCancelable(false)并且我们要检查它)
  5. 谢谢你的建议!

6 个答案:

答案 0 :(得分:103)

  1. 要验证是否显示对话框,您只需检查是否显示带有对话框内文字的视图:

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    或者,基于id为

    的文字
    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. 点击对话框按钮执行此操作(按钮1 - 确定,按钮2 - 取消):

    onView(withId(android.R.id.button1)).perform(click());
    

    更新

  3. 我认为可以,因为Espresso有multi window support
  4. 不确定是否在自定义对话框视图外单击,但要检查它是否显示,您必须创建自定义匹配器并在其中进行检查。

答案 1 :(得分:53)

我目前正在使用它,它似乎工作正常。

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));

答案 2 :(得分:20)

如果您有类似的AlertDialog:

enter image description here

您可以检查组件是否显示:

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();
}
相关问题