从可访问性获得空根节点 - 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
中的方法,如 getUiAutomation
、getWindowRoots
和来自 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...
消息,请尝试寻找其他原因,因为主线程在重试期间被阻塞,并且生命周期感知组件可能会进入麻烦了。
我得到了
从可访问性中获得空根节点 - 正在重试...
来自 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
中的方法,如 getUiAutomation
、getWindowRoots
和来自 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...
消息,请尝试寻找其他原因,因为主线程在重试期间被阻塞,并且生命周期感知组件可能会进入麻烦了。