作为为我的应用程序创建基线配置文件的一个步骤,我需要等待我的提要呈现。问题是我不知道要等待的确切标签,因为提要是动态的并且标签可能根本不会呈现。
所以基本上我想等待任何可能的标签出现。一旦第一个出现,代码就应该返回 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)
}
有更好的解决办法吗?
我找到了解决办法。我最终使用正则表达式来匹配不同的可能元素,因为
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)
}
这样,如果在屏幕上找到任何这些元素,测试就会成功完成。