首页 > 解决方案 > Espresso 滑动手势测试在 android 模拟器上失败,但在真实设备上通过

问题描述

很长一段时间以来,我一直在使用手机运行带仪表的 android 测试。今天我以为我会切换到模拟器,但我发现一些在我的手机上通过的测试在模拟器上没有通过——因为滑动手势在模拟器上做的事情和在我的手机上做的不一样(Xperia Z5 紧凑型,Android 7.1.1)。我也在模拟器中运行相同版本的 Android。

在模拟器上运行时,ViewActions.swipeLeft() 方法似乎开始向右滑动太远,并导致当您从 ViewPager 的末端从屏幕的最边缘拖动时会发生小波浪动画。手动完成时,滑动在手机和模拟器上完全正常。因此,我认为这一定与 Espresso 有关。我可以想象问题可能是可滑动 ViewPager 内的 RecyclerView 中的滑动侦听器。但它在模拟器和手机上运行良好,并且测试通过了我的手机。

这是我的滑动处理代码,它被添加到 ViewPager 选项卡内的 RecyclerView 中(在最后一个选项卡上)。

fun attachSingleSwipeActionToRecyclerView(
    direction: Int = ItemTouchHelper.LEFT,
    recyclerView: RecyclerView,
    swipeAction: RecyclerView.ViewHolder.() -> Unit
): ItemTouchHelper {
    val simpleCallback = object : ItemTouchHelper.SimpleCallback(0, direction) {
        override fun onMove(
            recyclerView: RecyclerView,
            viewHolder: RecyclerView.ViewHolder,
            target: RecyclerView.ViewHolder
        ): Boolean {
            return false
        }

        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            swipeAction(viewHolder)
        }
    }

    val itemTouchHelper = ItemTouchHelper(simpleCallback)
    itemTouchHelper.attachToRecyclerView(recyclerView)
    return itemTouchHelper
}

在我的测试中,我只是在屏幕上的第一个 RecyclerView 项目上调用 ViewActions.swipeLeft() 。

我尝试为 Espresso 滑动创建自己的起点,即使我从最中心开始,而不是最右侧,也没有任何改变,包括 ViewPager 波浪动画的结束

GeneralSwipeAction(
    Swipe.FAST,
    GeneralLocation.CENTER,
    GeneralLocation.CENTER_LEFT,
    Press.FINGER
)

模拟器有什么不同会导致 espresso 刷卡的行为与真实设备上的不同?

标签: android-recyclerviewandroid-viewpagerandroid-espressoandroid-testing

解决方案


有时,GeneralSwipeAction可能会变得不可靠,因为它的计算因不同的屏幕尺寸或密度而异,因此它可能不适合ViewPager您的情况。相反,您可以尝试使用ViewPagerActions滚动:

// Moves ViewPager to the right be one page.
onView(your_view_pager).perform(ViewPagerActions.scrollRight());

// Moves ViewPager to a specific page.
onView(your_view_pager).perform(ViewPagerActions.scrollToPage(page_number));

推荐阅读