如何使用Espresso测试Android ListView多行的文本内容?
问题根因
该现象通常由以下两类原因导致:
- 第一条校验执行后,ListView的滚动状态未完成同步,第二条校验执行时仍在上一个位置的滚动动画过程中,定位逻辑失效
- 直接使用
withText匹配item根布局,若你的列表item是复合布局(根布局为ViewGroup而非TextView),会出现匹配不到的情况,且未主动触发滚动到目标位置就执行校验,当目标item初始不在可视区域时会校验失败
解决方案
方案1:使用更稳妥的匹配写法(优先推荐)
每个校验语句主动触发滚动到对应position,并用hasDescendant匹配子View文本:
// 校验第0行内容 onData(anything()) .inAdapterView(withId(R.id.my_listview)) .atPosition(0) .perform(scrollTo()) .check(matches(hasDescendant(withText("first row")))) // 校验第1行内容 onData(anything()) .inAdapterView(withId(R.id.my_listview)) .atPosition(1) .perform(scrollTo()) .check(matches(hasDescendant(withText("second row"))))
方案2:优化匹配器精度
如果你的ListView Adapter绑定的数据源类型明确,替换anything()为对应类型的匹配器,避免匹配混乱。
比如数据源为String类型时写法:
onData(isA(String::class.java)) .inAdapterView(withId(R.id.my_listview)) .atPosition(0) .perform(scrollTo()) .check(matches(hasDescendant(withText("first row"))))
前置校验
执行测试前务必关闭设备的系统动画:进入开发者选项,将「窗口动画缩放」「过渡动画缩放」「Animator时长缩放」三个选项全部设置为关闭,避免异步动画干扰Espresso的校验逻辑。
内容的提问来源于stack exchange,提问作者rawbee
相关产品推荐
相关产品推荐

