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

lui*_*uis 7 automated-tests gui-testing kotlin instrumented-test android-jetpack-compose-testing

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

我想做的事:

  1. 迭代元素(节点)列表。我有这个列表,所有项目都由相同的测试标签“项目”标识。我需要点击其中的每一项。

在 Selenium 上我可以轻松做到这一点:

elements = driver.find_elements("item")
elements.each do |element|
  element.click
end
Run Code Online (Sandbox Code Playgroud)

但在具有组合测试框架的 Kotlin 上,我不知道如何做到这一点。下面的方法(负责返回节点列表)不支持forEach

composeTestRule.onAllNodes(hasTestTag("item")
Run Code Online (Sandbox Code Playgroud)
  1. 我还想检索列表大小。

在 Selenium 上,以下方法返回找到的项目数量:

driver.find_elements("item").size 
Run Code Online (Sandbox Code Playgroud)

但是,再一次,没有什么可以与写作相提并论:

composeTestRule.onAllNodes(hasTestTag("item")
Run Code Online (Sandbox Code Playgroud)

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

小智 6

迭代:

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

检查尺寸:

composeTestRule.onAllNodes(hasTestTag("item")).fetchSemanticsNodes().size == 1
Run Code Online (Sandbox Code Playgroud)


Tic*_*ers 0

我不确定您将如何迭代 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.
        }
Run Code Online (Sandbox Code Playgroud)

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

composeTestRule.onAllNodes(hasTestTag("item")).assertCountEquals(10)
Run Code Online (Sandbox Code Playgroud)

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

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