You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 11:45:07