XCUIApplication().launch() 永远不会完成

Posted

技术标签:

【中文标题】XCUIApplication().launch() 永远不会完成【英文标题】:XCUIApplication().launch() never completes 【发布时间】:2016-02-14 01:18:24 【问题描述】:

我第一次尝试为基于沙盒的、基于 NSDocument 的 OSX 应用程序目标运行 UI 测试,我遇到了 Xcode 7.2.1 和 7.3 beta 3 的问题,因此设置阶段的 XCUIApplication().launch() 调用得到了卡住并最终超时并显示以下错误消息,尽管应用程序实际上处于可运行状态并且可以正常记录测试步骤等。

我看到的错误信息如下: UI Testing Failure - App state is still not running, state = XCApplicationStateNotRunning

我没有以任何方式自定义测试的设置阶段。相关的启动电话如下所示:

let app = XCUIApplication() app.launch()

有什么想法吗?有没有办法将新状态强制传递给 XCUIApplication 实例,或者发送通知或它在代理应用程序中侦听的任何内容?

我可以看到(并且我自己也评论过)这个开发者论坛帖子关于什么看起来是相同的问题:https://forums.developer.apple.com/thread/30390

注意:我将此报告为 Radar 上的一个错误,并收到了回复,表明其中一个最新的 Xcode 7.3 测试版将修复它。事实上,这个 Xcode 错误已得到修复,并且在使用 Xcode 7.3 运行我的 UI 测试时,至少对于我的应用程序遇到的场景而言,问题不再发生!

【问题讨论】:

我很好奇为什么这个问题被标记为-1而没有解释? 这是一个真正的问题,我也不明白投反对票。 我遇到了同样的问题,但这是因为我的应用是菜单栏应用,所以我必须启用“应用程序是代理 (UIElement)”。我想这不是你的情况,是吗? 谢谢!不,不幸的是,在我的情况下这并不能解决问题,该应用程序是基于 NSDocument 的常规应用程序,具有停靠栏。 【参考方案1】:

我也遇到过这个问题,尤其是在使用机器人运行 UI 测试时。由于之前的测试未正确关闭,其他所有测试都会因此错误而失败。

为避免这种情况,请在测试设置阶段添加以下行:

XCUIApplication().terminate()

因此,您的设置函数将类似于以下内容:

    override func setUp() 
        XCUIApplication().terminate()

        super.setUp()

        continueAfterFailure = false
        XCUIApplication().launch()
    

这有点多余,因为终止命令也在 override func tearDown 函数中,但应确保正确的测试环境。

【讨论】:

我很高兴地报告说,至少在影响我的情况下,Xcode 7.3 最终版现在解决了这个问题,但没有这种解决方法(我之前确认在问题出现时也能解决问题)!

以上是关于XCUIApplication().launch() 永远不会完成的主要内容,如果未能解决你的问题,请参考以下文章

CarPlay 的 UI 测试

typeText() 正在输入不一致的字符

无法在 XCTestCase 中加载任何故事板

XCUIApplication 替换 UIATarget captureScreenWithName()

XCUIApplication 的通用点击函数

可以在调用 `XCUIApplication().terminate()` 后阻止 XCode 调用调试器