使用XCTest点击UI元素时,如何避免NSInternalInconsistencyException?

时间:2017-09-20 09:53:40

标签: ios swift xcode xctest

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

  

在范围完成后无法使用活动

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

任何有关修复或解决此问题的帮助都将非常感谢!

异常的堆栈跟踪顶部是:

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] + 

3 个答案:

答案 0 :(得分:12)

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

要暂时解决此问题,直到Apple修复它,请在您的方案的“测试”部分中禁用主线程检查器:

enter image description here

答案 1 :(得分:0)

我最后通过保留元素并对后续调用使用相同的引用来解决这个问题。

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

答案 2 :(得分:0)

我的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.

架构设置 tes schema settings

示例:

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