获取辅助功能时出现空根节点 - UiAutomator

6
我收到了来自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中的方法,如getUiAutomationgetWindowRoots和实际的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}"
        )
    }
}
1个回答

4

我感到有义务回答这个问题,因为这不是UIAutomator的问题。

Got null root node from accessibility - Retrying... 的信息在日志中经常出现,但是UIAutomator可以在几次重试后继续进行。

在我们的情况下,我们正在测试的应用程序与有缺陷的“生命周期”实现集成了SignalR。 当重试正在进行时,结合上述状态,SignalR会失败并导致NPE,从而导致应用程序崩溃,测试仪器过程也会崩溃。

花费了很长时间才找出此情况对应用程序和测试产生的原因和影响,但是好消息是我们从SignalR中解决了这个讨厌的错误。

因此,如果发生测试仪器运行程序由于记录了大量的Got null... 消息而崩溃,请尝试寻找其他原因,因为在重试期间主线程被阻塞,生命周期感知组件可能会遇到麻烦。


在我的情况下,问题是通过增加超时时间来解决的。但无论如何,感谢您的答案,它帮助我弄清楚了发生了什么。 - Oleksii K.
在我的情况下,这是由于应用程序通过下载管理器启动下载引起的。 - Mohamed Wasiq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接