API 33+(Android 13)上Espresso滑动方法(swipeUp等)失效求助
解决Espresso 3.3.0在Android 13(API33)模拟器上swipeUp失效的问题
问题背景
针对目标API33的应用运行仪器化测试时,使用Espresso的swipeUp()(代码如下)不会直接报错,但后续依赖滑动操作的UI验证失败,在API33之前的模拟器中一切正常:
onView(withId(android.R.id.content)).perform(swipeUp())
Espresso内置的swipeUp()实现为:
public static ViewAction swipeUp() { return actionWithAssertions( new GeneralSwipeAction( Swipe.FAST, GeneralLocation.translate(GeneralLocation.BOTTOM_CENTER, 0, -EDGE_FUZZ_FACTOR), GeneralLocation.TOP_CENTER, Press.FINGER)); }
可行解决办法
1. 自定义滑动动作,调整滑动起始/结束位置
API33模拟器对触摸事件的处理更严格,内置滑动位置可能未触发有效滚动。可以自定义滑动动作,调整偏移量:
public static ViewAction customSwipeUp() { return actionWithAssertions(new GeneralSwipeAction( Swipe.SLOW, // 改用慢速滑动提升兼容性 GeneralLocation.translate(GeneralLocation.BOTTOM_CENTER, 0, -100), // 起始点上移100px GeneralLocation.translate(GeneralLocation.TOP_CENTER, 0, 100), // 结束点下移100px Press.FINGER)); }
使用时替换原有swipeUp():
onView(withId(android.R.id.content)).perform(customSwipeUp())
2. 升级Espresso版本
Espresso 3.3.0版本较旧,后续版本(3.4.0及以上)针对Android 13兼容性做了修复。在build.gradle中升级依赖:
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
升级后清理项目并重新运行测试。
3. 针对滚动容器使用专用操作
如果滑动目标是RecyclerView、ScrollView等容器,建议使用Espresso专用滚动方法,比通用滑动更适配:
- 针对RecyclerView:
onView(withId(R.id.your_recycler_view)) .perform(RecyclerViewActions.scrollToPosition(target_position));
- 针对ScrollView:
onView(withId(R.id.your_scroll_view)) .perform(scrollTo(withId(R.id.target_view_id)));
4. 调整模拟器设置
部分API33模拟器的触摸设置会影响滑动效果:
- 关闭开发者选项中的"显示触摸操作"和"指针位置"
- 调整模拟器分辨率或DPI,避免屏幕尺寸适配导致的坐标偏差
内容的提问来源于stack exchange,提问作者Sean Blahovici
相关产品推荐
相关产品推荐

