如何在Android Jetpack Compose UI测试上迭代元素(节点)列表?



我正在使用Jetpack Compose测试库实现一些仪表化测试。我对Kotlin/Android开发还不太熟悉,但我有多年的硒和其他测试库的经验,所以我错过了一些基本的东西,不知道如何实现它们。

我想做什么:

  1. 遍历元素(节点)列表。我有这个列表,所有的项目都是由相同的测试标签"项目"来标识的。我需要点击每一个项目。

在Selenium上我可以很容易地做到这一点:

elements = driver.find_elements("item")
elements.each do |element|
element.click
end

但是在Kotlin与作曲测试框架我不知道如何做到这一点。下面的方法(负责返回节点列表)不支持forEach:

composeTestRule.onAllNodes(hasTestTag("item")
  1. 我还想检索列表大小

对于Selenium,下面的方法返回找到的项的数量:

driver.find_elements("item").size 

但是,同样,在compositing中没有这样的功能:

composeTestRule.onAllNodes(hasTestTag("item")

我已经阅读了官方的JetPack撰写测试教程,但它没有提供太多细节

迭代:

composeTestRule.onAllNodes(hasTestTag("item")).apply {
fetchSemanticsNodes().forEachIndexed { i, _ ->
get(i).performClick()
}
}

查看大小:

composeTestRule.onAllNodes(hasTestTag("item")).fetchSemanticsNodes().size == 1

我不确定您将如何迭代SemanticsNodeInteractionCollection。我也不确定你为什么要这么做。也就是说,在测试场景中,您可能有一个集合中项目的预期计数。因此,您可以创建一个范围并获取. onallnodes()返回的每个元素的SemanticsNodeInteraction。

我期望有10个ui元素返回的例子:

val nodes = composeTestRule.onAllNodes(hasTestTag("item"))
for (index in 0..10) {
val node = nodes[index]
// node.assert whatever you want here.
}

断言计数等于某值也可以通过以下方式完成:

composeTestRule.onAllNodes(hasTestTag("item")).assertCountEquals(10)

如果您只想获得总数而不断言它。我认为测试本身可能有问题。我希望你的测试是一个可控的环境,你知道在任何给定的时间屏幕上应该显示多少项。

让我知道这是否有帮助,否则请详细说明你的具体情况。

按照Kaan Sariveli的例子,如果您想遍历所有可单击的节点并对它们执行单击,这是对我来说唯一有效的方法:

composeTestRule.onAllNodesWithTag("item")
.filter(hasClickAction())
.apply {
fetchSemanticsNodes().forEachIndexed { i, _ ->
get(i).performSemanticsAction(SemanticsActions.OnClick)
}
}

最新更新