我正在
从可访问性中获取了空的根节点-正在重试...
UiAutomator
发出的消息,我不知道为什么。
简短地:
我们正在我们的应用上执行端到端测试,每个测试都从启动活动开始。第一个测试成功运行。当第二个测试开始时,一切正常,直到我们开始找到一个UiObject。在那个电话上,我们遇到了错误。
详细信息:
第一个测试从StartActivity
开始,并在入职导航到MainScreen
。
开始屏幕开始:
val intent = Intent(appContext, StartActivity::class.java)
appContext.startActivity(intent)
我也尝试过这样:
val intent = appContext.packageManager.getLaunchIntentForPackage(appContext.originalPackageName).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
appContext.startActivity(intent)
但没有什么区别,因为测试运行器会在测试运行后自动检查是否有运行中的活动,并清除它。
运行第二项测试时,它仍然从StartActivity
开始,但是现在跳过了入职过程,并且用户(测试跑步者)导航到包含Continue
按钮的屏幕。
因此,我们正在找到带有文本Continue
的UiObject,并等待其出现在屏幕上。出现后,我们将点击它。但是,一旦我们启动“查找继续按钮”,标题中的消息就会开始出现,几秒钟后,所有内容都会崩溃:
测试运行失败:由于“进程崩溃”,仪器运行失败。
代码段:
val continueButton = viewByText { appContext stringOf R.string.all_continue }
continueButton.waitToBecomeVisible(1.minute)
continueButton.click()
我猜最后一个问题是,是什么导致UiAutomator丢失所有根节点?
从UiDevice
调试getUiAutomation
,getWindowRoots
和实际getRootNode()
之类的QueryContoller
中的方法(上面记录了消息)没有帮助。
语法糖:
appContext
val appContext: Context get() = InstrumentationRegistry.getTargetContext()
viewByText
:
fun viewByText(text: () -> String): UiObject = device.objectByText { text() }
infix fun UiDevice.objectByText(text: () -> String): UiObject =
findObject(UiSelector().text(text()))
waitToBecomeVisible
:
infix fun UiObject.waitToBecomeVisible(timeOutMillis: Long) {
if(!waitForExists(timeOutMillis)){
throw UiObjectNotFoundException(
"Timeout: ${timeOutMillis.toDouble()/1000}s. ${this.selector}"
)
}
}
答案 0 :(得分:1)
我有义务回答这个问题,因为UIAutomator
根本不是问题。
消息Got null root node from accessibility - Retrying...
一直在您的日志中显示。但是,重试几次后,UIAutomator可以继续。
在我们的案例中,我们正在测试的应用程序具有与错误的“生命周期”实现的SignalR集成。结合上述状态,当重试正在进行时,SignalR因NPE失败,导致应用程序崩溃,结果,测试仪器过程也崩溃了。
花了很长时间才能弄清楚这种情况对应用程序和测试产生的原因和影响,但是好消息是,我们解决了SignalR中的一个讨厌的错误。
因此,如果碰巧测试仪器运行程序崩溃并记录了Got null...
消息,请尝试寻找其他原因,因为在重试期间主线程被阻塞,并且具有生命周期意识的组件可能会造成麻烦。