android 如何在Espresso测试中对MaterialDatePicker执行操作?

k7fdbhmy  于 2022-11-03  发布在  Android
关注(0)|答案(1)|浏览(149)

我有一个MaterialDatePicker对话框,我想写一个选择日期的Espresso测试。不幸的是,我不能使用PickerActions。我正在寻找类似于下面的内容:

onView(withClassName(Matchers.equalTo(DatePicker.class.getName()))).perform(PickerActions.setDate(year, monthOfYear, dayOfMonth));

有没有人对如何去做这件事有什么想法?
提前感谢!

nfg76nw0

nfg76nw01#

我在上面链接的问题中发现了this answer,当InputMode为INPUT_MODE_TEXT时,您可能会发现它对设置日期很有用。

public static void setDate(LocalDate date){
    onView(withTagValue((Matchers.is((Object) ("TOGGLE_BUTTON_TAG"))))).perform(click());
    onView(withId(com.google.android.material.R.id.mtrl_picker_text_input_date)).perform(replaceText(date.format(DateTimeFormatter.ofPattern("M/d/yy"))));
}

public static void setTime(LocalTime time){
    onView(withId(com.google.android.material.R.id.material_timepicker_mode_button)).perform(click());
    onView(withId(com.google.android.material.R.id.material_hour_text_input)).perform(click());
    onView(allOf(isDisplayed(), withClassName(is(AppCompatEditText.class.getName())))).perform(replaceText(time.format(DateTimeFormatter.ofPattern("hh"))));
    onView(withId(com.google.android.material.R.id.material_minute_text_input)).perform(click());
    onView(allOf(isDisplayed(), withClassName(is(AppCompatEditText.class.getName())))).perform(replaceText(time.format(DateTimeFormatter.ofPattern("mm"))));
}

这绝对是janky在非常密切地依赖于id不改变,但它是有效的。
如果你想在InputMode为INPUT_MODE_CALENDAR时选择一个日期,那么这对我很有效:

onView(
   // the date you are selecting must be visible for this to work 
   withContentDescription("Mon, Jan 1, 1990")
).inRoot(RootMatchers.isDialog())
  .perform(click())

onView(withId(com.google.android.material.R.id.confirm_button))
  .perform(click())

您可以进一步展开此答案,通过单击Material Date Picker布局中的相应按钮来选择不同的月/日/年。您可以在source code中对id进行洞穴探险。

相关问题