在我们的应用程序中,我们在调试版本中有一个隐藏的测试屏幕,它允许我们操纵应用程序的状态。对于几个 UI 测试(包括一个快照脚本),我们需要访问这个测试屏幕。这是通过用两根手指在屏幕上的任意位置点按三次来完成的。
extension XXXTestCase {
/// Performs a hidden gesture which presents the testing screen.
func navigateToTestingScreen(file: StaticString = #file, line: UInt = #line) {
app.navigationBars
.element
.tap(withNumberOfTaps: 3, numberOfTouches: 2)
testingScreen.assertExists(file: file, line: line)
}
}
这在 Xcode 9.2(和 11.2 模拟器)中运行良好,但 Xcode 9.3(11.3 模拟器)在该.tap
方法上给出了以下运行时错误:
No element found at point {5, 42} while computing gesture coordinates, internal error possibly due to orientation or remote view hosting.
我通过将 tap 更改为 just 来检查它与 XCUIElement 本身无关.tap()
,这不会产生任何运行时错误。Xcode 9.3 上的 XCTest 似乎在多点触控方面存在问题。我将如何解决这个问题?
当然,猴子的方法是改变手势以访问测试屏幕,但我并没有那么容易放弃:)
额外的实验
+-------+-----------+--------+
| Xcode | Simulator | Result |
+-------+-----------+--------+
| 9.2 | 11.2 | v | <-- not an option when migrated to Swift 4.1
| 9.3 | 11.3 | X |
| 9.3 | 11.2 | X | *
| 9.3 | 11.1 | X | *
| 9.3 | 11.0.1 | X | *
| 9.3 | 10.3.1 | v | <-- not an option, iOS 10 status bar is styled noticeably different
+-------+-----------+--------+
* 此组合在其他地方崩溃,即:
app.tabBars["main-tab-bar"].buttons["some-identifier"].tap()
用最有用的短语EXC_BAD_ACCESS
。该元素存在(并且可以通过在模拟器中单击来手动操作),但发送tap()
给它会引发异常。