Espresso AmbiguousViewMatcherException

时间:2016-11-14 15:29:58

标签: android listview android-espresso

在尝试编写与listview项交互的代码时,我收到了AmbiguousViewMatcherException异常。情景如下。

我有一个包含两个视图的列表视图

  1. 的TextView
  2. buttonView
  3. 我的列表中有近250行。所有按钮都有文字"预订"或"取消"。他们正在洗牌。我想直接点击Espresso点击"预订"列表中的按钮。我已经尝试了很多场景,仍然无法解决这个问题。请有人帮助我。

    以下是我的代码

    onView(withId(R.id.List))
                    .check(matches(withAdaptedData(withItemContent("Book it"))));
    

    /////////////////////////////////////////////// /////////

    private static Matcher<View> withAdaptedData(final Matcher<Object> dataMatcher) {
            return new TypeSafeMatcher<View>() {
                @Override
                public void describeTo(Description description) {
                    description.appendText("with class name: ");
                    dataMatcher.describeTo(description);
                }
    
                @Override
                public boolean matchesSafely(View view) {
                    if (!(view instanceof AdapterView)) {
                        return false;
                    }
                    @SuppressWarnings("rawtypes")
                    Adapter adapter = ((AdapterView) view).getAdapter();
                    for (int i = 0; i < adapter.getCount(); i++) {
                        if (dataMatcher.matches(adapter.getItem(i))) {
                            return true;
                        }
                    }
                    return false;
                }
            };
        }
    

    /////////////////////////////////////////////// /////////////

      

    android.support.test.espresso.AmbiguousViewMatcherException:&#39; id:   com.bottegasol.com.migym.EmpireSportFit:ID /列表&#39;匹配多个   层次结构中的视图。问题视图标有   &#39; **** **** MATCHES&#39;下方。

3 个答案:

答案 0 :(得分:0)

这是我发现的一个例子,希望它有所帮助:

public void testClickOnFirstAndFifthItemOfLength8() {
    onData(is(withItemSize(8)))
      .atPosition(0)
      .perform(click());
    onView(withId(R.id.selection_row_value))
      .check(matches(withText("10")));
    onData(is(withItemSize(8)))
      .atPosition(4)
      .perform(click());
    onView(withId(R.id.selection_row_value))
      .check(matches(withText("14")));
  }

源: https://android.googlesource.com/platform/frameworks/testing/+/android-support-test/espresso/sample/src/androidTest/java/android/support/test/testapp/AdapterViewTest.java

答案 1 :(得分:0)

根据错误消息,您有多个ID等于R.id.List的视图。您应首先检查视图层次结构,并将列表ID(id/List)替换为您要匹配的视图的唯一ID。

答案 2 :(得分:0)

在allOff()中放入列表视图,因为您的id列表在项目中多次使用。

onView(allOff(withId(R.id.List)))                 .check(matches(withAdaptedData(withItemContent(“ Book it”)))));