【问题标题】:Testing ViewPager with Espresso. How perfom action to a button of an Item?用 Espresso 测试 ViewPager。如何对 Item 的按钮执行操作?
【发布时间】:2015-07-02 09:41:13
【问题描述】:

我有一个ViewPager,其中的项目只包含一张图片和一个按钮。

我无法成功与项目(页面)的 UI 交互,因为除了显示的图片之外,没有任何东西可以区分(从 UI 角度)ViewPager 的所有项目。

我试图只选择一个有位置的项目:

onData(is(instanceOf(ItemClass.class)))
            .atPosition(0)
            .onChildView(withId(R.id.button))
            .perform(click());

原因:

NoMatchingViewException:层次结构中没有找到匹配的视图:可从类分配:类 android.widget.AdapterView

如何使用 Espresso 访问和测试 ViewPager 的项目?

【问题讨论】:

    标签: android android-viewpager android-espresso ui-testing


    【解决方案1】:

    FirstVal,ViewPager 不是AdapterView,它直接从ViewGroup 扩展而来。所以onData()方法不能用于ViewPager

    解决方案 1

    因为它是ViewGroup,所以每个项目都是其ViewPager 的直接子项。 因此,该过程是使用自定义匹配器(如firstChildOf())引用第一个视图子视图,并使用hasDescendant()isDescendantOfA() 访问目标视图并对其执行操作。

     onView(allOf(withId(R.id.button), isDescendantOfA(firstChildOf(withId(R.id.viewpager)))))
                .perform(click());
    

    解决方案 2(最好)

    由于ViewPager 的特殊性是逐页显示组成它的每个项目(#1 解决方案的子视图)。因此,即使您的项目使用具有相同 ID 的相同布局,也只会显示一个。因此我们可以通过其 Id 引用目标视图并添加约束isDisplayed()。它将仅匹配一个视图,即当前显示的视图。

    onView(allOf(withId(R.id.button), isDisplayed())).perform(click());
    

    就这么简单。

    如果您想要另一个项目,您可以在 ViewPager 上执行 swipe() 以更改显示的项目:

    onView(withId(R.id.viewpager)).perform(swipeLeft());
    

    来自Android dev doc的笔记:

    isDisplayed 将选择部分显示的视图(例如: 视图的整个高度/宽度大于视图的高度/宽度 可见的矩形)。如果您希望确保整个矩形 此视图绘制显示给用户使用isCompletelyDisplayed()

    谢谢@TWiStErRob

    【讨论】:

    • 您可能想使用isCompletelyDisplayed()。根据我的经验,isDisplayed() 也匹配屏幕外页面中的视图。
    • @TWiStErRob 提供了一个很棒的提示,请查看此答案stackoverflow.com/a/33516360/6373011
    • 你能在其中添加位置吗,因为所有列表都具有相同的 ids...onView(allOf(withId(R.id.button), isDisplayed())).perform(click() );
    • 我在 ViewPager 上遇到了类似的问题,它使用相同的视图但具有不同的项目。正如@TWiStErRob 提到的isDisplayed() 匹配的屏幕外视图。所以我尝试了isCompletelyDisplayed(),但当我在检查前刷卡时,即使关闭了动画,Espresso 似乎也无法做到这一点。所以我最终做的是使用:onView(allOf(withId(R.id.recyclerView), isDisplayingAtLeast(60))) 并且回收站视图现在一直被正确识别。
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多