Выполнение щелчка по кнопке ребенка в режиме рециркуляции с помощью эспрессо - PullRequest
1 голос
/ 03 апреля 2020

В рамках действия у меня есть пользовательское представление рециркулятора, которое содержит 2 текстовых просмотра и 2 кнопки, как показано ниже.

enter image description here

Идентификатор для переработки Кнопка со значком корзины - кнопка «Удалить». Я хотел бы получить доступ к этой кнопке во время эспрессо-тестирования, чтобы можно было смоделировать щелчок.

Ниже приведены два метода, которые я попытался и потерпел неудачу:

        onView(withId(R.id.basket))
                .perform(actionOnItemAtPosition(4, click() ));

        onView(withText("Cherry"))
                .perform(
                        RecyclerViewActions.actionOnItem(
                                hasDescendant(withId(R.id.deleteButton)),
                                ViewActions.click()
                        )
                );

Спасибо за любую помощь заранее.

1 Ответ

1 голос
/ 04 апреля 2020

Один из способов щелкнуть представление в представлении элемента RecyclerView - создать настраиваемое действие вида:

public static ViewAction actionOnItemView(Matcher<View> matcher, ViewAction action) {

    return new ViewAction() {

        @Override public String getDescription() {
            return String.format("performing ViewAction: %s on item matching: %s", action.getDescription(), StringDescription.asString(matcher));
        }

        @Override public Matcher<View> getConstraints() {
            return allOf(withParent(isAssignableFrom(RecyclerView.class)), isDisplayed());
        }

        @Override public void perform(UiController uiController, View view) {
            List<View> results = new ArrayList<>();
            for (View v : TreeIterables.breadthFirstViewTraversal(view)) {
                if (matcher.matches(v)) results.add(v);
            }
            if (results.isEmpty()) {
                throw new RuntimeException(String.format("No view found %s", StringDescription.asString(matcher)));
            } else if (results.size() > 1) {
                throw new RuntimeException(String.format("Ambiguous views found %s", StringDescription.asString(matcher)));
            }
            action.perform(uiController, results.get(0));
        }
    };
}

Затем использовать одну из RecyclerViewActions на * 1007. *, затем actionOnItemView как последующее действие в представлении элемента в случае успеха:

ViewAction itemViewAction = actionOnItemView(withId(R.id.deleteButton), click());
onView(withId(your_recycler_view)).perform(actionOnItemAtPosition(4, itemViewAction));
...