Android UIAutomator:如何等待多个条件中的任何一个?

问题描述 投票:0回答:1

作为为我的应用程序创建基线配置文件的一个步骤,我需要等待我的提要呈现。问题是我不知道要等待的确切标签,因为提要是动态的并且标签可能根本不会呈现。

所以基本上我想等待任何可能的标签出现。一旦第一个出现,代码就应该返回 true。我不知道该怎么做。这就是我现在正在做的事情:

fun MacrobenchmarkScope.waitForDashboardContent() {
    device.wait(Until.hasObject(By.res("dashboard_feed")), 10_000)
    val lazyColumn = device.findObject(By.res("dashboard_feed"))
    lazyColumn.wait(Until.hasObject(By.res("dashboard_section_title")), 2_000)
}

ChatGPT 建议了一些很棒的东西,只是这个方法不存在:

lazyColumn.wait(Until.hasObject(By.any(By.res("dashboard_section_title"),By.res("another_section_title"))),2_000)

当我面对它

By.any
不存在时,它给了我这个建议:

val lazyColumn = device.findObject(By.res("dashboard_feed"))
val startTime = System.currentTimeMillis()
val timeout = 2000

while (System.currentTimeMillis() - startTime < timeout) {
    if (lazyColumn.hasObject(By.res("dashboard_section_title")) ||
        lazyColumn.hasObject(By.res("another_section_title"))) {
        // One of the elements was found within the timeout
        break
    }
    // Small delay to prevent tight looping
    Thread.sleep(100)
}

有更好的解决办法吗?

android automated-tests android-uiautomator macrobenchmark
1个回答
0
投票

我找到了解决办法。我最终使用正则表达式来匹配不同的可能元素,因为

By.res()
函数可以采用
Pattern
作为参数。这是完整的功能:

fun MacrobenchmarkScope.waitForDashboardContent() {
    device.wait(Until.hasObject(By.res("dashboard")), 10_000)
    val lazyColumn = device.findObject(By.res("dashboard"))
    val listOfElements = listOf("banner", "title", "survey", "claim")
    val regex = listOfElements.joinToString(separator = "|")
    val patternToMatch = Pattern.compile(regex)
    lazyColumn.wait(Until.hasObject(By.res(patternToMatch)), 4_000)
}

这样,如果在屏幕上找到任何这些元素,测试就会成功完成。

© www.soinside.com 2019 - 2024. All rights reserved.