Frage Verwenden Sie Espresso, um in den RecyclerView-Artikel zu klicken


Wie kann ich Espresso verwenden, um auf eine bestimmte Ansicht in einem Fenster zu klicken? RecyclerView Artikel? Ich weiß, ich kann das Element an Position 0 klicken mit:

onView(withId(R.id.recyclerView)) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));

Aber ich muss auf eine bestimmte Ansicht in diesem Element klicken und nicht auf das Element selbst.

Danke im Voraus.

- bearbeiten -

Um genau zu sein: Ich habe eine RecyclerView (R.id.recycler_view) welche Gegenstände sind Kartenansicht (R.id.card_view). In jedem Kartenansicht Ich habe vier Knöpfe (unter anderem) und möchte auf einen bestimmten Knopf klicken (R.id.bt_deliver).

Ich würde gerne die neuen Funktionen von Espresso 2.0 nutzen, bin mir aber nicht sicher, ob das möglich ist.

Wenn nicht möglich, möchte ich so etwas verwenden (mit Thomas Keller Code):

onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click());

aber ich weiß nicht, was ich auf die Fragezeichen setzen soll.


63
2018-02-12 11:38


Ursprung


Antworten:


Sie können dies mit der Aktion zum Anpassen der Ansicht tun.

public class MyViewAction {

    public static ViewAction clickChildViewWithId(final int id) {
        return new ViewAction() {
            @Override
            public Matcher<View> getConstraints() {
                return null;
            }

            @Override
            public String getDescription() {
                return "Click on a child view with specified id.";
            }

            @Override
            public void perform(UiController uiController, View view) {
                View v = view.findViewById(id);
                v.performClick();
            }
        };
    }

}

Dann können Sie es mit anklicken

onView(withId(R.id.rv_conference_list)).perform(
            RecyclerViewActions.actionOnItemAtPosition(0, MyViewAction.clickChildViewWithId(R.id. bt_deliver)));

90
2018-05-20 01:14



Jetzt mit android.support.test.espresso.contrib ist es einfacher geworden:

1) Fügen Sie die Testabhängigkeit hinzu

androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {
    exclude group: 'com.android.support', module: 'appcompat'
    exclude group: 'com.android.support', module: 'support-v4'
    exclude module: 'recyclerview-v7'
}

* 3 Module ausschließen, weil Sie es wahrscheinlich schon haben

2) Dann mach sowas

onView(withId(R.id.recycler_grid))
            .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));

Oder

onView(withId(R.id.recyclerView))
  .perform(RecyclerViewActions.actionOnItem(
            hasDescendant(withText("whatever")), click()));

Oder

onView(withId(R.id.recycler_linear))
            .check(matches(hasDescendant(withText("whatever"))));

44
2017-09-25 19:01



Versuchen Sie den nächsten Ansatz:

    onView(withRecyclerView(R.id.recyclerView)
                    .atPositionOnView(position, R.id.bt_deliver))
                    .perform(click());

    public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) {
            return new RecyclerViewMatcher(recyclerViewId);
    }

public class RecyclerViewMatcher {
    final int mRecyclerViewId;

    public RecyclerViewMatcher(int recyclerViewId) {
        this.mRecyclerViewId = recyclerViewId;
    }

    public Matcher<View> atPosition(final int position) {
        return atPositionOnView(position, -1);
    }

    public Matcher<View> atPositionOnView(final int position, final int targetViewId) {

        return new TypeSafeMatcher<View>() {
            Resources resources = null;
            View childView;

            public void describeTo(Description description) {
                int id = targetViewId == -1 ? mRecyclerViewId : targetViewId;
                String idDescription = Integer.toString(id);
                if (this.resources != null) {
                    try {
                        idDescription = this.resources.getResourceName(id);
                    } catch (Resources.NotFoundException var4) {
                        idDescription = String.format("%s (resource name not found)", id);
                    }
                }

                description.appendText("with id: " + idDescription);
            }

            public boolean matchesSafely(View view) {

                this.resources = view.getResources();

                if (childView == null) {
                    RecyclerView recyclerView =
                            (RecyclerView) view.getRootView().findViewById(mRecyclerViewId);
                    if (recyclerView != null) {

                        childView = recyclerView.findViewHolderForAdapterPosition(position).itemView;
                    }
                    else {
                        return false;
                    }
                }

                if (targetViewId == -1) {
                    return view == childView;
                } else {
                    View targetView = childView.findViewById(targetViewId);
                    return view == targetView;
                }

            }
        };
    }
}

2
2018-03-03 13:45



Zuerst geben Sie Ihren Schaltflächen eindeutige contentDescriptions, d. H. "Delivery Button Zeile 5".

<button android:contentDescription=".." />

Scrolle dann zur Zeile:

onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition(5));

Wählen Sie dann die Ansicht basierend auf contentDescription aus.

onView(withContentDescription("delivery button row 5")).perform(click());

Inhaltsbeschreibung ist eine großartige Möglichkeit, Espressos onView zu verwenden und Ihre App besser zugänglich zu machen.


-4
2018-03-24 16:04