从可访问性获得空根节点 - UiAutomator

Got null root node from accessibility - UiAutomator

我得到了 从可访问性中获得空根节点 - 正在重试... 来自 UiAutomator 的消息,我不知道为什么。

不久:

我们正在我们的应用程序上执行 E2E 测试,每个测试都从发布开始 activity。第一次测试 运行s 成功。当第二个测试开始时,一切都很好,直到我们开始找到一个 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)

但是没有区别,因为测试运行ner会自动检查是否有运行宁activity测试运行后,并清除它。

当第二个测试是 运行 时,它仍然从 StartActivity 开始,但现在跳过了入职流程,用户(测试 运行ner)被导航到屏幕其中包含 Continue 按钮。 因此,我们正在寻找带有文本 Continue 的 UiObject 并等待它出现在屏幕上。一旦它出现,我们将单击它。然而,一旦我们启动 "finding the Continue button" 标题中的消息就开始出现,几秒钟后一切都崩溃了: 测试 运行ning 失败:检测 运行 由于 'Process crashed.'

而失败

片段:

val continueButton = viewByText { appContext stringOf R.string.all_continue }
continueButton.waitToBecomeVisible(1.minute)
continueButton.click()

我想最后一个问题是,是什么导致 UiAutomator 丢失所有根节点? 调试 UiDevice 中的方法,如 getUiAutomationgetWindowRoots 和来自 QueryContoller 的实际 getRootNode(),记录上面的消息,没有帮助。

语法糖:

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}"
        )
    }
}

我觉得有必要回答这个问题,因为这根本不是 UIAutomator 的问题。

消息 Got null root node from accessibility - Retrying... 是您会一直在日志中找到的内容。但是,UIAutomator 能够在几次重试后继续。

在我们的例子中,我们正在测试的应用程序有一个 SignalR 集成与错误 "lifecycle" 实现。结合上述状态,当重试正在进行时,SignalR 因 NPE 而失败,导致应用程序崩溃,结果,测试仪器进程也崩溃了。

我们花了很长时间才弄清楚这种情况对应用程序和测试造成的影响,但好在我们解决了 SignalR 中的严重错误。

因此,如果测试仪器运行器发生崩溃并记录了一堆 Got null... 消息,请尝试寻找其他原因,因为主线程在重试期间被阻塞,并且生命周期感知组件可能会进入麻烦了。