在一项活动中,我有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
来显示数据
非常感谢任何帮助。
答案 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);
}
};
}