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

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

我已经使用我的手机运行仪器化 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 滑动的行为与真实设备上不同?

最佳答案

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

关于android-recyclerview - Espresso 滑动手势测试在 Android 模拟器上失败,但在真实设备上通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606094/

相关文章:

java - 取消选中所有复选框后禁用按钮

Android TabLayout 自定义指示器宽度

java - Espresso RecyclerView 错误 - 位置上没有 View 支架

java - getAdapterPosition 在 ViewHolder 类中返回 -1

android - 如何在android中使用带有recyclerview的单选按钮?

android - 将 Android 的 SlidingPaneLayout 与 ViewPager 结合使用

android - 带有 fragment 的 ViewPager 和 FragmentPagerAdapter(不支持库)

android - ActivityTestRule.getActivity 在 Before 方法中返回 null

android - 无法运行安卓 Espresso 测试

android - 回收器 View : No adapter attached; skipping layout (can't find issue)