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

不久之后:

我们正在我们的应用程序上执行E2E测试,每个测试均以启动 Activity 开始。第一个测试成功运行。当第二个测试开始时,一切正常,直到我们开始寻找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)

但没有区别,因为测试运行程序会在测试运行后自动检查是否有运行中的 Activity ,然后将其清除。

当运行第二个测试时,它仍然从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}"
        )
    }
}

最佳答案

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

消息Got null root node from accessibility - Retrying...是您一直在日志中找到的信息。但是,几次重试后,UIAutomator仍可以继续。

在我们的案例中,我们正在测试的应用程序具有与错误的“生命周期”实现的SignalR集成。结合上述状态,当重试正在进行时,SignalR因NPE失败,导致应用程序崩溃,结果,测试仪器过程也崩溃了。

花了很长时间才能弄清楚这种情况对应用程序和测试产生的原因和影响,但是好消息是,我们解决了SignalR中的一个讨厌的错误。

因此,如果碰巧测试工具运行程序崩溃并记录了许多Got null...消息,请尝试寻找其他原因,因为在重试期间主线程被阻塞,并且具有生命周期意识的组件可能会引起麻烦。

关于android - 从辅助功能获取了空根节点-UiAutomator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51999425/

10-10 08:40