【问题标题】:Xcode 14.4 Sims XCUITest Get Simulator Alert Data Error - internal ObjC exception breakpointXcode 14.4 Sims XCUITest 获取模拟器警报数据错误 - 内部 ObjC 异常断点
【发布时间】:2021-07-14 00:22:26
【问题描述】:

使用 Xcode 12.4 模拟器 14.4

对于下面显示的警报,我在 XCUITests 中有以下函数,用于提取系统警报上显示的静态文本:

 _ = addUIInterruptionMonitor(withDescription: "", handler: { (alert) -> Bool in
        var data = alert.staticTexts.allElementsBoundByIndex.map {$0.label}

        ...
    })

这在使用 Xcode 11.3 Sims 13.3 时有效;但是,我刚刚升级了 Xcode,现在它在运行地图功能时崩溃并给出以下错误:

error: Execution was interrupted, reason: internal ObjC exception breakpoint(-8)..The process has been returned to the state before expression evaluation.

如果我放一个断点,我可以看到以下内容:

po alert.staticTexts.allElementsBoundByIndex.count -> returns 3
po alert.staticTexts.allElementsBoundByIndex[0].label -> returns "Allow “X” to use your location?"
po alert.staticTexts.allElementsBoundByIndex[1].label -> returns "Your location is used to find and display nearby X facilities."
po alert.staticTexts.allElementsBoundByIndex[2] -> returns StaticText, {{32.0, 12.0}, {72.5, 16.0}}, label: 'Precise: On'

但是,当我运行以下命令(或在测试期间运行)时,它会失败,但正如您从上面看到的那样,它在该位置确实有一个静态文本元素:

po alert.staticTexts.allElementsBoundByIndex[2].label -> No matches found for Element at index 2 from input {(
StaticText)} error: Execution was interrupted, reason: internal ObjC exception breakpoint(-8)

如果我留在控制台中并再次重新运行相同的调用,它就会起作用:

po alert.staticTexts.allElementsBoundByIndex[2].label -> "Precise: On"

有谁知道导致此错误的原因或在我的测试中如何处理它的解决方案?

【问题讨论】:

    标签: ios xcode12 xcuitest xctestcase


    【解决方案1】:

    由于此警报在您的应用程序“外部”并且在您调试/暂停执行时一切正常,我不得不认为这与同步有关。

    您有什么需要等待警报完全显示的吗?我通常不相信 UIInterruptionHandler 会自动关闭未测试的警报。

    我正在使用页面对象模型,通常使用 _ = XCUIApplication().alerts.firstMatch.waitForExistence(timeout: 2.0) 之类的东西在初始化程序中等待新页面

    这并不能解释为什么您在控制台中调用它两次的示例有效,但时间是我要寻找的地方。我觉得这是我唯一一次看到这样的错误。

    这也可能与地图不是静态的或加载缓慢有关,因此在 XCUITest 认为它已完成加载并继续之后更改可访问性。抛出一个漂亮的长 Thread.sleep 将是调试它的最简单方法。

    【讨论】:

    • 我确实等待了警报,并且我还添加了 15 秒的等待时间来验证这一点,并且发生了相同的结果。出于某种原因,尝试为地图的“Precise On”元素提取标签文本时存在问题。它只发生在这个元素上,并且只在第一次调用 .label 时发生。如果我调用 po alert.staticTexts.allElementsBoundByIndex[2] 但 .label 失败,它会返回元素。第一次尝试后,我可以继续在终端中成功调用它并返回“Precise On”。
    • 很奇怪。那么百万美元的问题 - 您的自动化套件是否应该发出系统警报?如果它坏了,你的团队将无法修复它。当然,您可能需要控制警报,但断言其文本?可能超出了您应该做的范围。
    • 我实际上并没有断言它。我只是使用文本来确定正在显示哪个系统警报,并根据我们的需要正确地解除它。我可以用另一种方式“破解”它,只提取第一个元素的文本或其他内容,但只是想弄清楚为什么现在会出现这种情况。感谢您尝试提供帮助!
    • 啊,我明白了。我的警报很少,我可以单独对它们进行编码,而不会造成太多混乱。
    • 不一定有帮助,但我也注意到,当检查警报是否存在或警报按钮是否存在时,它会在控制台中显示此错误“忽略无法获取远程元素的层次结构”进程 35760(获取主窗口 kAXErrorServerNotFound 时出错)”,但它不会导致崩溃,并且仍然会继续通过存在检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多