使用Espresso测试Snackbar显示

53

有没有一种方式可以使用Espresso测试Snackbar是否以正确的文本显示出来?

我有一个简单的调用来创建Snackbar。

Snackbar.make(mView, "My text", Snackbar.LENGTH_LONG).show();

我尝试过但没有成功

onView(withText("My text")).inRoot(withDecorView(not(is(mActivityRule.getActivity().getWindow().getDecorView())))).check(matches(isDisplayed()));
3个回答

108

这对我有用, 请尝试一下。

onView(allOf(withId(android.support.design.R.id.snackbar_text), withText("My text")))
            .check(matches(isDisplayed()));

如果你使用的是 AndroidX,请使用以下代码:

onView(withId(com.google.android.material.R.id.snackbar_text))
        .check(matches(withText(R.string.whatever_is_your_text)))

1
当espresso在snackbar的Y位置为0.0时进行检查时,您该怎么做? isDisplayed会抛出异常。 - Christopher Francisco
确保在y位置为0.0时不要添加此断言,这意味着您的snackbar已经显示完成或尚未显示。您可能需要调整测试以确保等待其显示或稍早检查,具体取决于您的情况。 - ksarmalkar
@ksarmalkar 那我们应该怎么等待呢? - AdamMc331
11
我遇到了这个问题:NoMatchingViewException: No views in hierarchy found matching: with id: com.my.package.debug:id/snackbar_text。有什么想法吗? - Chisko
你的 Snackbar 可能在这个断言之前被隐藏了,也许尝试延迟隐藏 Snackbar 的时间,看看是否有效。 - ksarmalkar
显示剩余2条评论

16

一种替代方案

private void checkSnackBarDisplayedByMessage(@StringRes int message) {
    onView(withText(message))
            .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)));
}

完美,我认为可以用于每个通用文本。 - Frank
请使用 withEffectiveVisibility 而不是 isDisplayed,这样无论当前屏幕上是否实际显示,都可以使用。 - RamPrasadBismil

2
我看到了之前的答案,但我认为这个更好。
@Test
public void onFabClick_shouldDisplaySnackbar() throws Exception {
  onView(withId(R.id.fab)).perform(click());

  // Compare with the text message of snackbar
  onView(withText(R.string.snackbar_message))
      .check(matches(isDisplayed()));
}

我们从哪里导入 'withText'? - Phlip
1
@Phlip 像这样导入:import android.support.test.espresso.matcher.ViewMatchers.withText - KraffMann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接