Android - Espresso - scrolling to a non-list View item

According to the scrollTo JavaDoc, to use the code you specified ( onView( withId( R.id.button)).perform( scrollTo(), click()); ), the preconditions are: "must be a descendant of ScrollView" and "must have visibility set to View.VISIBLE". If that is the case, then that will work just fine.

If it is in an AdapterView, then you should use onData instead. In some cases, you may have to implement the AdapterViewProtocol, if your AdapterView is not well behaved.

If it is neither in an AdapterView nor a child of a ScrollView, then you would have to implement a custom ViewAction.


If you have a view inside android.support.v4.widget.NestedScrollView instead of scrollView scrollTo() does not work.

In order to work you need to create a class that implements ViewAction just like ScrollToAction but allows NestedScrollViews:

public Matcher<View> getConstraints() {
    return allOf(
        withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE), 
        isDescendantOfA(anyOf(
            isAssignableFrom(ScrollView.class), 
            isAssignableFrom(HorizontalScrollView.class), 
            isAssignableFrom(NestedScrollView.class))
        )
    );
}

extra tip and access the action like:

public static ViewAction betterScrollTo() {
    return actionWithAssertions(new AllScrollViewsScrollToAction());
}

But with this scroll it does not trigger events from the layout managers.