在Espresso中,指定您要使用当前可见的AdapterView

时间:2015-02-27 09:44:07

标签: android android-espresso

在一项活动中,我有ViewPager个标签:“ALL”和“Filtered” 两个页面使用相同的Fragment来显示数据,不同之处在于“已过滤”页面按某些条件过滤数据。

我想点击“ALL”页面中的某个项目(可能在“已过滤”页面中也存在),如果我这样做:

onData(transactionWithId(960L)).perform(click());

作为回应我得到:

  

AmbiguousViewMatcherException:'可从class:class中分配   android.widget.AdapterView'匹配层次结构中的多个视图

然后我尝试通过指定一个额外的约束来优化我的描述,我正在寻找一个可见的项目:

onData(allOf(transactionWithId(960L), isDisplayed())).perform(click());

我得到了同样的错误。

然后我想以某种方式指定,我在“ALL”标签中查找我的项目(不确定这是否正确):

onData(allOf(
      transactionWithId(960L), 
      withParent(withText("ALL")))
   ).perform(click());

但同样的错误。

然后我试图指明我正在寻找目前在我面前的AdapterView

onData(allOf(
       is(instanceOf(Transaction.class)), 
       transactionWithId(960L))
   ).inAdapterView(allOf(
            isAssignableFrom(AdapterView.class),
            isDisplayed())
          ).perform(click());

我得到了:

  

PerformException:在视图上执行'加载适配器数据'时出错'(是   可从类中分配:类android.widget.AdapterView并且是   在屏幕上显示给用户)'。

请注意,我可以使用单个Activity点击ListView中显示的项目,我面临的挑战是当我有ViewPager个多个标签使用时一个Fragment来显示数据 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

您的方法应该有用,我创建了一个最小的工作示例here

问题的要点是区分两个适配器视图。另一种方法是使用tags明确标记它们。然后,我们可以使用DataInteration限制inAdapterView()在特定标记上使用自定义Matcher。完整的代码仍然是here,我引用了关键点:

在适配器视图中:

boolean isFiltered = ...
AdapterView av = ...
av.setTag(isFiltered);

在测试中:

@Test
public void testClickOnSecondItemInAllTab() {
    onData(instanceOf(String.class)).inAdapterView(withTag(false)) //
                                    .atPosition(1)                 //
                                    .perform(click());
}

标签上的自定义视图匹配器:

static Matcher<View> withTag(final Object tag) {
    return new TypeSafeMatcher<View>() {

        @Override
        public void describeTo(final Description description) {
            description.appendText("has tag equals to: " + tag);
        }

        @Override
        protected boolean matchesSafely(final View view) {
            Object viewTag = view.getTag();
            if (viewTag == null) {
                return tag == null;
            }

            return viewTag.equals(tag);
        }
    };
}