java - [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}'.
请帮我更正代码。太感谢了!
解决方案
您的匹配器没有选择正确的元素。您当前正在尝试选择一个 Idbase_input_view_input
为的元素,并且该元素的 Id 为base_input_view_title
text 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 是具有...的元素的后代
- 一个 ID
relInputView
- 并且有一个带有元素的兄弟姐妹......
- ID 为
base_input_view_title
- 并且有文本
First name
- ID 为
- 一个 ID
由于您有多个 ID 为 的元素,因此base_input_view_input
我们需要更具体的内容。如果让这个唯一的下一件事情是它的父元素 ( R.id.relInputView
) 有一个具有特定文本的兄弟 (在本例中为First name
),那么我们应该检查具有这些文本的元素。
base_input_view_title
您还可以将此匹配器抽象为一个函数,以便在具有不同文本时更轻松地重用它。
推荐阅读
- c# - WPF 中是否有与 imagebox 等效的 picturebox.graphics() winforms?
- javascript - Microsoft Graph 的 createUploadSession、Content-Range Header 错误
- list - 如何使用第二个列表中的列表值外键 id 从列表中检索 Flutter Dart 列表值
- python - ImportError:libgthread-2.0.so.0:无法打开共享对象文件:使用 Docker 容器导入 cv2 时没有此类文件或目录
- arrays - Crystal Report - 当拆分数组的值与给定的字符串值相同时选中复选框
- excel - 根据使用 VBA 修改的日期打开所有最新的 3 个文件时出现问题
- gremlin - 在 gremlin 查询中组合 where & 和 steps 的替代方法
- python - OpenCV 在 Jupyter Notebook 中出现错误,但在 Python CLI 中有效
- debugging - Emacs,如何修复“make-variable-buffer-local 不在顶层调用”?
- javascript - Mongo/Node 通过来自外部 JSON 的 productID 更新数据