【问题标题】:In Espresso, specify that you want to work with the current visible AdapterView在 Espresso 中,指定要使用当前可见的 AdapterView
【发布时间】:2015-02-27 09:44:07
【问题描述】:

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

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

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

作为回应,我得到:

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

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

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

我也遇到了同样的错误。

然后我想以某种方式指定,我正在“所有”选项卡中寻找我的项目(虽然不确定这是否正确):

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 并且是 在屏幕上显示给用户)'。

请注意,我可以单击带有单个 ListViewActivity 中显示的项目,我面临的挑战是当我有一个带有多个选项卡的 ViewPager 时,使用一个 Fragment 来显示数据。
将不胜感激。

【问题讨论】:

    标签: android android-espresso


    【解决方案1】:

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

    问题的要点是区分两个适配器视图。另一种方法是用tags 明确标记它们。然后我们可以在特定标签上使用自定义Matcher 来限制DataInterationinAdapterView()。完整代码还是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);
            }
        };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2011-03-19
      相关资源
      最近更新 更多