Android Epresso:DatePicker 单击确定添加年份而不是验证

Android Epresso: DatePicker Click on OK add a year instead of validate

在 Google Espresso 测试中,我尝试单击 DatePickerDialog 的“确定”按钮。

但是它没有验证我的输入,只是增加了一年并且没有关闭对话框。

似乎是点击了年份栏的“+”按钮。这是 Espresso 错误还是我遗漏了什么?

这是我的 Espresso 代码(在 Kotlin 中):

onView(allOf(iz(instanceOf(javaClass<Button>())), withText("OK"),
            isDisplayed()) as Matcher<View>).perform(click())

它可能并不完美(因为我对文本进行了硬编码 "OK"),但我在测试中使用以下代码段设法做到了:

// Change the date of the DatePicker. Don't use "withId" as at runtime Android shares the DatePicker id between several sub-elements
onView(withClassName(Matchers.equalTo(DatePicker.class.getName()))).perform(PickerActions.setDate(1989, 8, 25));
// Click on the "OK" button to confirm and close the dialog
onView(withText("OK")).perform(click());

在某些版本的 Android 中,DatePickerDialog 上的 "OK" 被替换为 "Set" 或 "Done"。 尝试:

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

这将点击对话框的肯定按钮。不管怎么称呼。

将我的测试设备升级到 4.4.4 后,错误自行消失:这是一个 Android < 4.4 错误 T_T

对于那些点击 OK 按钮有问题的人,我建议使用以下代码:

onView(
    anyOf(
        withText(android.R.string.ok),
        withId(android.R.id.button1)
    )
)
    .inRoot(isDialog())
    .perform(click())
  1. 通过使用 android.R.string.ok,您可以覆盖 "ok" 文本的所有可能版本,而不管当前的 Locale 和 Android 版本。当需要 "ok" 文本时,Android Studio 甚至推荐(lint 警告)。
  2. 感谢 anyOf,您可以添加多个 ViewMatcher 以确保您可以涵盖所有已知的可能性。所以如果你偶然发现了一种访问“确定按钮”的新方法,你可以将它添加到 anyOf.
  3. 最后,我敢打赌添加 .inRoot(isDialog()) 检查是确保您瞄准 Dialog 的好方法。如果 DatePickerDialog 不是 on-screen,这肯定会失败!并且有充分的理由。