XCode 7 UI测试:解除系统生成的UIAlertController不起作用

Bas*_*ian 2 ui-testing uialertcontroller xcode7 xcode-ui-testing

我有一个UI测试,涉及解雇系统生成UIAlertController.此警报要求用户访问设备日历的权限.测试的目标是点击OK按钮后的行为:

1 let app = XCUIApplication()
...
// this code was basically generated by the recording feature of XCode 7 
2 app.alerts.elementBoundByIndex(0).collectionViews.buttons["OK"].tap()
Run Code Online (Sandbox Code Playgroud)

现在,OK第2行不是点击按钮,而是让模拟器点击第一个按钮,该Cancel按钮恰好是按钮......

此外,我发现测试框架无法准确识别出现的警报.因此,如果我检查当前的警报计数,我总是得到0:

// ...tap...
let count = app.alerts.count // == 0
Run Code Online (Sandbox Code Playgroud)

如果我使用NSPredicate条件并等待几秒钟,也会发生这种情况.

UI测试是否可能无法与系统生成的警报一起可靠地工作?我正在使用XCode 7.0.1.

Joe*_*tti 6

Xcode 7.1最终修复了系统警报的问题.然而,有两个小陷阱.

首先,您需要在显示警报之前设置"UI Interuption Handler".这是告诉框架如何在出现警报时处理警报的方式.

其次,在显示警报后,您必须与界面进行交互.只需点击应用程序就可以正常工作,但这是必需的.

addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in
    alert.buttons["Allow"].tap()
    return true
}

app.buttons["Request Location"].tap()
app.tap() // need to interact with the app for the handler to fire
Run Code Online (Sandbox Code Playgroud)

"位置对话框"只是一个字符串,可帮助开发人员识别访问哪个处理程序,而不是特定于警报类型.我相信true从处理程序返回标记为"完成",这意味着它不会再被调用.

  • 你有没有试过在行中解雇几个不同的警报?我想弄清楚.但是,它比仅注册多个中断监视器(反向顺序)更复杂 (2认同)
  • 我建议`app.coordinateWithNormalizedOffset(CGVector(dx:200,dy:1)).tap()`而不是`app.tap()`,因为它可以点击你不期望的东西,就像我的情况一样,并打破进一步的测试流程. (2认同)