【问题标题】:How can I avoid NSInternalInconsistencyException when tapping on UI elements with XCTest?使用 XCTest 点击 UI 元素时如何避免 NSInternalInconsistencyException?
【发布时间】:2018-03-01 07:47:36
【问题描述】:

自从升级到 xcode 9 后,我的一些 UI 测试开始抛出 NSInternalInconsistencyException 和消息

活动范围完成后不能使用

当我在XCUIElement 上调用tap() 时会出现问题。我可以看到该元素是一个有效的按钮,它已启用。

任何有关修复或解决此问题的帮助将不胜感激!

异常的堆栈跟踪顶部是:

0   CoreFoundation                      0x00000001035ad1cb __exceptionPreprocess + 171
1   libobjc.A.dylib                     0x0000000102f0ff41 objc_exception_throw + 48
2   CoreFoundation                      0x00000001035b2362 +[NSException raise:format:arguments:] + 98
3   Foundation                          0x00000001029b4089 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
4   XCTest                              0x00000001027d4018 -[XCActivityRecord _synchronized_ensureValid] + 153
5   XCTest                              0x00000001027d3b0b -[XCActivityRecord _synchronized_addAttachment:] + 39
6   XCTest                              0x00000001027d3c98 -[XCActivityRecord addAttachment:] + 37
7   XCTest                              0x00000001027c0935 -[XCActivityRecord(UITesting) attachAutomaticScreenshot] + 265
8   XCTest                              0x00000001027f84b3 __43-[XCUIElement resolveHandleUIInterruption:]_block_invoke + 1465
9   XCTest                              0x0000000102814788 -[XCTContext _runActivityNamed:type:block:] + 185
10  XCTest                              0x00000001027f7eed -[XCUIElement resolveHandleUIInterruption:] + 139
11  XCTest                              0x000000010282b5d1 __63-[XCUIElement(XCUIElementEventSynthesis) _dispatchEvent:block:]_block_invoke + 81
12  XCTest                              0x0000000102814788 -[XCTContext _runActivityNamed:type:block:] + 185
13  XCTest                              0x000000010282b500 -[XCUIElement(XCUIElementEventSynthesis) _dispatchEvent:block:] + 315
14  XCTest                              0x000000010282d242 -[XCUIElement(XCUIElementTouchEvents) tap] + 

【问题讨论】:

  • 请在定义您的活动的地方发布源代码。

标签: ios swift xcode xctest


【解决方案1】:

我的 XCUItestcase 也有同样的问题。虽然我在架构设置中取消选择“主线程检查器”,但我的测试用例仍然失败。奇怪的是,它在 iphone 6 plus 上传递但相同的代码在 5s、6s iphone 上失败了。这是我解决问题的方法:

1. Make sure you 'unselected "Main Thread checker" in test target
scheme settings
2. Take the reference of the UI element where test is crashing.
3. Before performing action. Put some sleep or have some delay.
4. Then perform the action on that element.

架构设置

样本:

   let confirmBtn = app.buttons["go"]
   sleep(2)
   confirmBtn.tap()

【讨论】:

    【解决方案2】:

    在 Xcode 9 中,这可能是由于 XCUITest 和新的 Xcode 9 主线程检查器之间的错误引起的。更多详情在this blog post

    要在 Apple 修复之前暂时解决此问题,请在方案的测试部分禁用主线程检查器:

    【讨论】:

    • 通过取消选择主线程检查器选项,我仍然面临这个问题。任何其他解决方案或解决方法?
    • @Aks 不,应该这样做。你确定你是在测试部分而不是运行部分禁用它吗?
    • 是的,我没有选择“主线程检查器”选项。但它不起作用。现在我用另一种方法解决了这个问题。
    • 你能分享另一种方法吗?
    【解决方案3】:

    我最终通过保留该元素并在后续调用中使用相同的引用来解决此问题。

    XCUIElement *searchBar = self.app.searchFields[@"Search"];
    [searchBar tap];
    [searchBar typeText:@"Test Guy"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2015-05-18
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多