尝试单击图标时,Espresso AmbiguousViewMatcherException(TextView)

时间:2016-11-28 22:51:44

标签: android android-espresso android-espresso-recorder

LinearLayout(productList)在运行时使用子视图动态填充,如下所示:

@ViewById(R.id.ll_products)
LinearLayout productList;

public void createProductList() {
    productList.addView(getView(mobilePhone))
    productList.addView(getView(internet))
    productList.addView(getView(television))
}

public View getView(Product product) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    TextView layout = (LinearLayout) inflater.inflate(R.layout.row_product, null);
    TextView productIcon = (TextView) layout.findViewById(R.id.tv_product_row_icon);
    productIcon.setText(product.getProductIcon());
    productName.setText(product.getName());
}

productList故意是LinearLayout,而不是ListView。

产品列表有三个产品 - 每个产品都有图标(可以复制)。

我想记录一个场景,我点击第二个产品的图标。 这样的场景如何避免AmbiguousViewMatcherException?

不幸的是,以下代码无效 - 将找到三个R.id.tv_product_row_icon ...

    ViewInteraction appCompatTextView = onView(withId(R.id.tv_product_row_icon));
    appCompatTextView.perform(scrollTo(), click());

如何指定单击第二个图标?

1 个答案:

答案 0 :(得分:3)

很遗憾,您必须为此类案例创建自定义Matcher

以下内容与View匹配指定的索引:

public static Matcher<View> withIndex(final Matcher<View> matcher, final int index) {
    return new TypeSafeMatcher<View>() {
        int currentIndex = 0;

        @Override
        public void describeTo(Description description) {
            description.appendText("with index: ");
            description.appendValue(index);
            matcher.describeTo(description);
        }

        @Override
        public boolean matchesSafely(View view) {
            return matcher.matches(view) && currentIndex++ == index;
        }
    };
}

适合您案例的用法:

Matcher<View> secondIconMatcher = allOf(withId(R.id.tv_product_row_icon));
onView(withIndex(secondIconMatcher , 1)).perform(click());