首页 > 解决方案 > [TEST][Espresso] 无法在具有多个条件的 RecycleView 中获取元素

问题描述

我尝试使用 Espresso 和 Java 对 android 应用程序进行自动化测试,我想将文本输入到RecycleView中的 base_input_view_input 中,其中 base_input_view_title 的文本等于“名字”,布局检查器如下所示:

像这样

我尝试了这个解决方案,但它不起作用。

onView(withId(R.id.rvBasicInfo))
.perform(RecyclerViewActions.actionOnItem(allOf(withId(R.id.base_input_view_input),allOf(withId(R.id.base_input_view_title),withText("First name"))),typeText("aaaa")));

这是日志

Caused by: androidx.test.espresso.PerformException: Error performing 'scroll RecyclerView to: holder with view: (view.getId() is
<2131296360/com.test.a.vvv.app.ccc.ccc:id/base_input_view_input> and (view.getId() is
  <2131296362> and an instance of android.widget.TextView and view.getText() with or without transformation to match: is "First name"))' on view 'RecyclerView{id=2131296919, res-name=rvBasicInfo, visibility=VISIBLE, width=1080, height=1595, has-focus=false, has-focusable=true,
    has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@eb7851f, tag=null, root-is-layout-requested=false,
    has-input-connection=false, x=0.0, y=0.0, child-count=7}'.

请帮我更正代码。太感谢了!

标签: javaandroidtestingautomated-testsandroid-espresso

解决方案


您的匹配器没有选择正确的元素。您当前正在尝试选择一个 Idbase_input_view_input为的元素,并且该元素的 Id 为base_input_view_titletext First name。显然,这是行不通的,因为您想要的元素没有两个不同的 ID!相反,我们应该关注元素之间的父/子/兄弟关系。

对我来说,选择最具体的部分(通常是一个 ID)是有帮助的,然后向后工作以确定是什么让这个元素真正独一无二

allOf(
  withId(R.id.base_input_view_input), 
  isDescendantOfA(
    allOf(
      withId(R.id.relInputView), 
      hasSibling(
        allOf(
          withId(R.id.base_input_view_title), 
          withText("First name")
        )
      )
  )
)

(括号可能是关闭的......)

我已经设置了换行符以显示它们的匹配级别,因为事情有点令人困惑。我们想找到:

  • ID 为的元素base_input_view_input
  • AND 是具有...的元素的后代
    • 一个 IDrelInputView
    • 并且有一个带有元素的兄弟姐妹......
      • ID 为base_input_view_title
      • 并且有文本First name

由于您有多个 ID 为 的元素,因此base_input_view_input我们需要更具体的内容。如果让这个唯一的下一件事情是它的父元素 ( R.id.relInputView) 有一个具有特定文本的兄弟 (在本例中为First name),那么我们应该检查具有这些文本的元素。

base_input_view_title您还可以将此匹配器抽象为一个函数,以便在具有不同文本时更轻松地重用它。


推荐阅读