遍历recyclerview的item,使用Appium和Robot Framework选择符合条件的item
Posted
技术标签:
【中文标题】遍历recyclerview的item,使用Appium和Robot Framework选择符合条件的item【英文标题】:Iterative through recyclerview's items and select one that matched the condition using Appium and Robot Framework 【发布时间】:2021-11-28 06:08:22 【问题描述】:我正在使用 Appium 和 Robot Framework 进行自动化测试。我在处理 Recyclerview 中的项目时遇到问题。 recyclerview 的项目是一个自定义视图,它是多个文本视图的组合。我们假设recyclerview的item是这样的
=======================
文本视图A |文本视图B |文本视图C |
=======================
在哪里
-
TextViewA 的 id 是“tvA”
TextViewB 的 id 是“tvB”
TextViewC 的 id 是“tvC”
如果项目符合以下条件,我的目标是编写一个机器人来迭代项目并单击 Textview(三个中的任何一个):
-
TextviewA 中的@text 必须等于 $paramA
TextviewB 中的@text 必须等于 $paramB
TextviewC 中的@text 必须等于 $paramC
我决定做以下事情:
-
将 recyclerview 中的所有项目作为列表获取并循环访问这些项目。如何? - 不可能,因为列表是 RecyclerView
如果 1. 不可能,则创建一个 while 循环(for 循环,其中 $i = 0 - 9999)并检查 item[$i] 是否存在。如果item存在,检查TextViews中的@text是否与参数匹配。如果该项目不存在,请向上滚动并再次检查该项目
【问题讨论】:
【参考方案1】:我不熟悉 appium 或机器人框架,但如果这是一个视觉测试,那么我相信你可以模拟输入,对吧?
我希望测试涵盖的是,给定一个包含项目 A1、A2、A3 的列表,RecyclerView 中有三行,其值绑定到 A1、A2 和 A3 的内容。
您不能像这样迭代 RV 的所有项目,因为回收器视图很好.. 回收视图,因此它不会创建所有视图。它只是使用一个可在您滚动时重复使用的池。
关于您的选项 2
创建一个 while 循环(for 循环,其中 $i = 0 - 9999)并检查 item[$i] 是否存在。如果item存在,检查TextViews中的@text是否与参数匹配。如果该项目不存在,请向上滚动并再次检查该项目
我认为你从错误的角度来处理这个问题。首先,您应该假设回收者视图按设计“按预期工作”。您不需要确保它完成了它应该做的事情,但您确实希望确保如果您给它 5 个项目,这些项目将正确绑定到您期望的内容,并且绑定是正确的。
在 Espresso/android 中,您通常会实例化您的 Activity/Fragment“场景”,并覆盖注入的依赖项(即,例如:您的项目通常来自的数据源),以用更简单/假的替换它们/更快的数据集。
因此,您只需提供一组已知/硬编码的值,而不是在测试期间发出网络请求。
例如:
如果您的 Activity/viewModel 使用存储库来获取此列表,您可以注入一个模拟来返回您在测试中硬编码并且您知道的列表。
所以当活动真正开始时,它会使用这个假存储库。
此时,您就知道屏幕应该是什么样子了。如果你的虚假列表有 10 个项目,那么你的 RecyclerView 应该能够呈现这 10 个项目。
为此,您可以使用以下操作:
onView(withId(R.id.your_recycler_view))
.perform(actionOnItemAtPosition<YourViewHolder>(0, click()))
例如,“单击”位置 0 处的项目。或者您可以使用许多其他 Espresso 操作、断言、匹配器来确定是否存在某些文本等。
【讨论】:
我错过了!谢谢你提醒我。 如果您曾经使用过Espresso
,请记住您有RecyclerViewActions 可以操作 RecyclerView 项目,例如检查特定位置的项目、滚动到项目等。
以上是关于遍历recyclerview的item,使用Appium和Robot Framework选择符合条件的item的主要内容,如果未能解决你的问题,请参考以下文章
安卓recyclerview中的adapter怎么设置item的viewtype
android -------- Data Binding的使用 RecyclerView