Espresso - 如何在回收商视图中查找特定商品(订单是随机的)

时间:2016-06-09 21:37:43

标签: android android-espresso

我想知道如何在回收者视图中找到特定项目,每次运行时项目的顺序是随机的。

假设我在Recycler视图中有4个项目,每个项目都由相同类型的视图持有者表示,其中包含文本视图。每个视图持有者/项目都应用唯一标题。对于这个例子,我们说为了简单起见,标题是" A"," B"," C"和& #34; d"

我如何找到位置(然后点击)项目" A"如果订单是随机的?我知道如果订单没有改变我可以使用scrollToPosition RecyclerViewInteraction操作,但在这种情况下,订单可以并且将会改变。

有什么想法吗?

谢谢, 扎克

4 个答案:

答案 0 :(得分:11)

我能够做到以下工作:

Matcher<RecyclerView.ViewHolder> matcher = CustomMatcher.withTitle("A");
onView((withId(R.id.recycler_view))).perform(scrollToHolder(matcher), actionOnHolderItem(matcher, click()));

CustomMatcher.withTitle的位置:

    public static Matcher<RecyclerView.ViewHolder> withTitle(final String title)
{
    return new BoundedMatcher<RecyclerView.ViewHolder, CustomListAdapter.ItemViewHolder>(CustomListAdapter.ItemViewHolder.class)
    {
        @Override
        protected boolean matchesSafely(CustomListAdapter.ItemViewHolder item)
        {
            return item.mTitleView.getText().toString().equalsIgnoreCase(title);
        }

        @Override
        public void describeTo(Description description)
        {
            description.appendText("view holder with title: " + title);
        }
    };
}

答案 1 :(得分:0)

我知道这是一个古老的问题,虽然@Zach的答案是一个好的开始,并且对我有帮助,但我们有一个回收者视图,其中包含不同类型的ViewHolders的负载,这些ID具有不同的ID,因此文本不完全适合该答案我们的用例。

我最终要做的是使用稍微不同的匹配器,该匹配器未引用任何特定的ID或变量:

fun withText(title: String) = object : BoundedMatcher<View, View>(View::class.java) {
    override fun describeTo(description: Description?) {
        description?.appendText("Searching for title with: $title")
    }

    override fun matchesSafely(item: View?): Boolean {
        val views = ArrayList<View>()
        item?.findViewsWithText(views, title, View.FIND_VIEWS_WITH_TEXT)

        return when {
            views.size == 1 -> true
            else -> false
        }
    }
}

和用法:

RecyclerViewActions.scrollTo<ViewHolder>(withText("Some unique text I'm looking for")

答案 2 :(得分:0)

您不需要为此使用自定义匹配器,只需使用此

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

并添加意式浓缩咖啡依赖性

    androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:<espressso-version>'

答案 3 :(得分:-2)

使用自定义视图匹配器Espresso.onDataGoogle example

我已经根据你的情况使用了一些可以适应的东西:

onData(new BaseMatcher<String>() {
        @Override
        public void describeTo(Description description) {
            // what?
            description.appendText("Matches A");
        }

        @Override
        public boolean matches(Object item) {
            return item instanceof String && ((String) item).equals("A");
        }
    }).perform(click());

如果模型类型更复杂,您可以将String替换为任何模型类型,如果它很简单,也可以使用内置匹配器(这种情况可以通过onData(is("A")).perform(click())简化)