如何使用 Espresso 将时间设置为 MaterialDateTimePicker

Lub*_*cek 7 android ui-testing android-testing android-espresso

我正在尝试使用 Espresso 创建简单的 UI 测试来为新创建的项目设置日期。

项目正在使用https://github.com/wdullaer/MaterialDateTimePicker,但它显示了具有复杂 UI 的对话框片段,没有什么可坚持的。

我想创建自定义 ViewAction 来设置类似于来自 Espresso 的 PickerActions 的日期或时间。

任何建议如何做到这一点?

Lub*_*cek 6

最后,我创建了也可以设置时间的 ViewAction,但它很麻烦,因为您必须知道对话框中视图的类名,才能与 Matcher 匹配。

  /**
     * Returns a {@link ViewAction} that sets a date on a {@link DatePicker}.
     */
    public static ViewAction setDate(final int year, final int monthOfYear, final int dayOfMonth) {

        return new ViewAction() {

            @Override
            public void perform(UiController uiController, View view) {
                final DayPickerView dayPickerView = (DayPickerView) view;

                try {
                    Field f = null; //NoSuchFieldException
                    f = DayPickerView.class.getDeclaredField("mController");
                    f.setAccessible(true);
                    DatePickerController controller = (DatePickerController) f.get(dayPickerView); //IllegalAccessException
                    controller.onDayOfMonthSelected(year, monthOfYear, dayOfMonth);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public String getDescription() {
                return "set date";
            }

            @SuppressWarnings("unchecked")
            @Override
            public Matcher<View> getConstraints() {
                return allOf(isAssignableFrom(DayPickerView.class), isDisplayed());
            }
        };

    }

    /**
     * Returns a {@link ViewAction} that sets a time on a {@link TimePicker}.
     */
    public static ViewAction setTime(final int hours, final int minutes) {

        return new ViewAction() {

            @Override
            public void perform(UiController uiController, View view) {
                final RadialPickerLayout timePicker = (RadialPickerLayout) view;

                timePicker.setTime(new Timepoint(hours, minutes, 0));
            }

            @Override
            public String getDescription() {
                return "set time";
            }

            @SuppressWarnings("unchecked")
            @Override
            public Matcher<View> getConstraints() {
                return allOf(isAssignableFrom(RadialPickerLayout.class), isDisplayed());
            }
        };

    }
Run Code Online (Sandbox Code Playgroud)

和用法:

onView(isAssignableFrom(DayPickerView.class)).perform(MaterialPickerActions.setDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)));

onView(isAssignableFrom(RadialPickerLayout.class)).perform(MaterialPickerActions.setTime(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE)));
Run Code Online (Sandbox Code Playgroud)


Mar*_*rci 5

我使用了内置的 TimePickerDialog。

看起来像这样

fun setAlarmTime(){

    val calendar = Calendar.getInstance()

    onView(isAssignableFrom(TimePicker::class.java)).perform(
        PickerActions.setTime(
            calendar.get(Calendar.HOUR_OF_DAY),
            calendar.get(Calendar.MINUTE) + 2
        )
    )
    onView(withText("OK")).perform(click())
}
Run Code Online (Sandbox Code Playgroud)

首先,您应该打开 TimePickerDialog,然后使用此代码。时间将为当前时间 + 2 分钟。设置完成后,单击“确定”按钮。