[test][espresso]无法在具有多个条件的recycleview中获取元素

uyhoqukh  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(367)

我试图用espresso和java在android应用程序上进行自动化测试,我想在recycleview中将文本输入base\u input\u view\u input,其中base\u input\u view\u title的文本等于“first name”,布局检查器如下:

我试过用这个方法,但没用。

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}'.

请帮我更正代码。非常感谢!

y53ybaqx

y53ybaqx1#

您的匹配程序没有选择正确的元素。您当前正在尝试选择id为的元素 base_input_view_input 是一个id为的元素 base_input_view_title 带着文字 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 是一个元素的后代,这个元素。。。
身份证 relInputView 有一个兄弟和一个元素。。。
身份证是 base_input_view_title 并且有 First name 因为有多个元素的id为 base_input_view_input ,我们需要更具体的东西。如果下一个使这个唯一的东西是它的父元素( R.id.relInputView )有一个具有特定文本的同胞(在本例中, First name ),那么我们应该检查一个元素是否具有这些属性。
您还可以将这个匹配器抽象为一个函数,以便在 base_input_view_title 有不同的文本。

相关问题