Espresso滑动手势测试在Android模拟器上失败,但在真实设备上通过

时间:2018-12-04 05:16:20

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

很长时间以来,我一直在使用手机运行经过检测的android测试。今天我以为我会切换到仿真器,但是我发现通过手机的某些测试无法通过仿真器-因为滑动手势在仿真器上的功能与在手机上的功能不同(Xperia Z5 Compact,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 Wave动画的结束

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

导致意式浓缩咖啡滑动与实际设备上的行为有所不同的模拟器有何不同?

1 个答案:

答案 0 :(得分:1)

有时,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));