【问题标题】:Conditional Alert Dialogs in UI Tests Android StudioUI 测试中的条件警报对话框 Android Studio
【发布时间】:2025-11-24 22:40:01
【问题描述】:

当用户登录我的应用程序时,如果这是他们第一次登录,则会出现一个警告对话框。 否则不会出现。

这让我在尝试编写 UI 测试时变得很棘手。 由于警报对话框有条件地出现,我无法使用以下方法关闭它: onView(withId(android.R.id.button1)).perform(click()) 正如我在其他帖子中看到的那样。

但是,如果它确实出现并且我没有在我的测试中关闭它,则测试将被阻止继续进行(因为它无法识别任何其他视图 ID)并失败。

有人对我如何处理这个问题有任何建议吗?

谢谢!

【问题讨论】:

    标签: android user-interface dialog alert android-espresso


    【解决方案1】:

    但是,如果它确实出现并且我没有在我的测试中关闭它, 测试被阻止继续进行(因为它不识别任何其他 查看 id) 并失败。

    有人对我如何处理这个问题有任何建议吗?

    无论何时编写测试,您都必须确保所需条件到位,以可靠且一致地运行相关测试。这是Arrange, Act, Assert 成语的“排列”部分。

    因此,如果您正在测试涉及对话框的流程,则必须安排测试以设置该对话框显示的条件。

    如果您要测试的流程不涉及对话框,则必须安排测试以设置对话框不显示的条件。

    您还没有发布代码,所以我不知道显示对话框的“条件”是什么,但基本上您需要在测试中做一些事情,以确保如果您不想要对话框或为真,条件为假如果你这样做。也许这是在设置共享偏好?

    例如,您的测试通常看起来像这样:

    @Test
    fun myAwesomeTest() {
        // Arrange - do something to ensure dialog does not show
        SomeHelperClass.setConditionToShowDialog(false)
    
        // Act - do actions knowing the dialog will not show
        onView(withId(R.id.awesomeId)).perform(click())
    
        // Assert
        onView(withId(R.id.duperId)).check(matches(isVisible()))
    }
    

    同样,如果没有您的代码细节,很难提供更多细节,但希望这足以让您继续前进。

    希望有帮助!

    【讨论】:

    • 谢谢!你的回答真的很有帮助,而且解释得很好。条件基于设置 SharedPreferences,我可以从测试中做到这一点。将来我会尝试更清楚地回答我的问题!
    【解决方案2】:

    听起来(但我不得不猜测,因为您没有提供更多详细信息)您正在根据您在本地存储的值控制“第一次”对话框的显示,可能使用 PersistentState .

    如果是这种情况,您可以直接从 Espresso 测试中控制该值,从而使您的测试状态符合预期。

    另外,只是一个旁注——我强烈建议不要进行依赖 Espresso 测试,这听起来像你有,基于“如果它确实出现并且我没有在我的测试中关闭它,测试被阻止继续前进”。

    您的测试必须能够以随机顺序执行并通过。

    【讨论】: