如何点击Espresso中RecyclerView内的项目

Jac*_*cki 37 android android-espresso android-recyclerview

我有一个RecyclerView(R.id.recyclerView),其中每一行都有一个图像(R.id.row_image)和一个TextView.我想点击第一行中的图片.
我试过使用onData(..)但似乎没有用.

Gab*_*bor 78

使用RecyclerViewActions

onView(withId(R.id.recyclerView))
    .perform(actionOnItemAtPosition(0, click()));
Run Code Online (Sandbox Code Playgroud)

将其包含在您的gradle脚本中:

dependencies {
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
    androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0'
}
Run Code Online (Sandbox Code Playgroud)

  • 所以,你如何检查(isDisplayed())`? (3认同)

Sir*_*r0n 21

只是为了增加Gabor的答案(这是自Espresso 2.0以来的正确和完整答案).

使用espresso-contribRecyclerViews 时你可能会遇到问题(参见android-test-kit ticket).

解决方法是在espresso-contrib上面提到的依赖关系Gabor中添加此排除项:

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'
}
Run Code Online (Sandbox Code Playgroud)

(这是一个答案,而不是对Gabor答案的评论,因为我还没有权利发表评论)


ari*_*d3r 16

编辑:

Espresso 2.0已发布,更新日志包括以下内容:

新功能

  • 意式咖啡的contrib
    • RecyclerViewActions:处理与RecyclerViews的交互

老答案

我自己还没有对此进行测试,但是Thomas Keller 在G +上发布了一个简短的解释和一个带有必要视图匹配器的Gist的链接.

由于新RecyclerViewAPI继承自ViewGroup而不是继承AdapterView,因此您无法使用Espresso onData()来测试使用此组件的布局.

链接到Gist.

我会附上代码,只是为了完整起见(注意:不是我的!所有功劳归于Thomas Keller)

ViewMatcher:

public class ViewMatchers {
    @SuppressWarnings("unchecked")
    public static Matcher<View> withRecyclerView(@IdRes int viewId) {
        return allOf(isAssignableFrom(RecyclerView.class), withId(viewId));
    }

    @SuppressWarnings("unchecked")
    public static ViewInteraction onRecyclerItemView(@IdRes int identifyingView, Matcher<View> identifyingMatcher, Matcher<View> childMatcher) {
        Matcher<View> itemView = allOf(withParent(withRecyclerView(R.id.start_grid)),
                withChild(allOf(withId(identifyingView), identifyingMatcher)));
        return Espresso.onView(allOf(isDescendantOfA(itemView), childMatcher));
    }
}
Run Code Online (Sandbox Code Playgroud)

样本用法:

onRecyclerItemView(R.id.item_title, withText("Test"),  withId(R.id.item_content))
    .matches(check(withText("Test Content")));
Run Code Online (Sandbox Code Playgroud)


fed*_*608 6

您应该使用自定义ViewAction:

public void clickOnImageViewAtRow(int position) {
    onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.actionOnItemAtPosition(position, new ClickOnImageView()));
}

public class ClickOnImageView implements ViewAction{
    ViewAction click = click();

    @Override
    public Matcher<View> getConstraints() {
        return click.getConstraints();
    }

    @Override
    public String getDescription() {
        return " click on custom image view";
    }

    @Override
    public void perform(UiController uiController, View view) {
        click.perform(uiController, view.findViewById(R.id.imageView));
    }
}
Run Code Online (Sandbox Code Playgroud)