Espresso如何正确校验Dialog是否处于未显示状态
Espresso 校验 Dialog 未显示的正确实现方式
报错原因
你当前写法触发报错的核心逻辑是:点击关闭Dialog后,当前界面已无Dialog类型的根布局,inRoot(isDialog())会优先匹配根布局,匹配不到直接抛出异常,不会执行后续的not(isDisplayed())校验逻辑。
可行实现方案
方案1:校验Dialog专属元素不存在(最稳妥,无依赖)
逻辑:Dialog上必然存在独有的文本/控件,只要校验该控件不存在,即可证明Dialog已关闭,不会出现有Dialog时误判通过的问题。
@Test fun dismissedWhenClicked() { // 关闭Dialog(原有逻辑保留,此时Dialog还存在,inRoot匹配不会报错) onView(withText(R.string.simple)).inRoot(isDialog()).perform(click()) // 直接校验Dialog上的专属内容不存在即可 onView(withText(R.string.simple)).check(doesNotExist()) }
优点:无需额外依赖,不会误判,写法简单。如果担心普通页面也存在相同文本,可额外加匹配规则缩小控件范围,比如加上withId(xxx)共同匹配Dialog专属控件。
方案2:全局校验无任何Dialog弹出(适合通用校验场景)
如果需要严格校验当前界面没有任何Dialog弹出,可通过异常捕获逻辑实现通用校验:
fun assertNoDialogDisplayed() { val dialogRootExists = try { // 尝试匹配Dialog根,能匹配到说明存在Dialog onView(isRoot()).inRoot(isDialog()) true } catch (e: NoMatchingRootException) { // 匹配不到Dialog根,说明无Dialog false } assertThat("当前界面不应存在Dialog", dialogRootExists, `is`(false)) } // 测试用例中调用 @Test fun dismissedWhenClicked() { onView(withText(R.string.simple)).inRoot(isDialog()).perform(click()) assertNoDialogDisplayed() }
优点:可以通用校验所有Dialog的显示状态,无需绑定特定Dialog的控件。
内容的提问来源于stack exchange,提问作者glend
相关产品推荐
相关产品推荐

