使用 XCTest 点击 UI 元素时如何避免 NSInternalInconsistencyException?
How can I avoid NSInternalInconsistencyException when tapping on UI elements with XCTest?
自升级到 xcode 9 后,我的一些 UI 测试开始抛出 NSInternalInconsistencyException
消息
Activity cannot be used after its scope has completed
当我在 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] +
我最终通过保留元素并在后续调用中使用相同的引用来解决这个问题。
XCUIElement *searchBar = self.app.searchFields[@"Search"];
[searchBar tap];
[searchBar typeText:@"Test Guy"];
在 Xcode 9 中,这可能是由于 XCUITest
和新的 Xcode 9 主线程检查程序之间的错误造成的。 this blog post.
中有更多详细信息
要在 Apple 修复之前暂时解决此问题,请在方案的测试部分禁用主线程检查器:
我的 XCUI 测试用例也有同样的问题。虽然我在模式设置中取消选择 "Main Thread checker" 但我的测试用例仍然失败。奇怪的是,它传递了 iphone 6 加,但同样的代码失败了 5 秒,6 秒 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()
自升级到 xcode 9 后,我的一些 UI 测试开始抛出 NSInternalInconsistencyException
消息
Activity cannot be used after its scope has completed
当我在 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] +
我最终通过保留元素并在后续调用中使用相同的引用来解决这个问题。
XCUIElement *searchBar = self.app.searchFields[@"Search"];
[searchBar tap];
[searchBar typeText:@"Test Guy"];
在 Xcode 9 中,这可能是由于 XCUITest
和新的 Xcode 9 主线程检查程序之间的错误造成的。 this blog post.
要在 Apple 修复之前暂时解决此问题,请在方案的测试部分禁用主线程检查器:
我的 XCUI 测试用例也有同样的问题。虽然我在模式设置中取消选择 "Main Thread checker" 但我的测试用例仍然失败。奇怪的是,它传递了 iphone 6 加,但同样的代码失败了 5 秒,6 秒 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()