Xcode 7 UI测试:如何在代码中解除一系列系统警报

Sea*_*lly 51 objective-c ios xctest xcode7 xcode-ui-testing

我正在使用新的Xcode 7 UI测试功能编写UI测试用例.在我的应用程序的某些时刻,我要求用户允许相机访问和推送通知.因此会出现两个iOS弹出窗口:"MyApp Would Like to Access the Camera"弹出窗口和"MyApp Would Like to Send You Notifications"弹出窗口.我希望我的测试可以解雇两个弹出窗口.

UI录制为我生成了以下代码:

[app.alerts[@"cameraAccessTitle"].collectionViews.buttons[@"OK"] tap];
Run Code Online (Sandbox Code Playgroud)

但是,[app.alerts[@"cameraAccessTitle"] exists]解析为false,上面的代码生成错误:Assertion Failure: UI Testing Failure - Failure getting refresh snapshot Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202".

那么在测试中解除一堆系统警报的最佳方法是什么?系统弹出窗口会中断我的应用程序流并立即使我的正常UI测试用例失败.事实上,任何有关如何绕过系统警报以便我可以恢复测试通常流程的建议都表示赞赏.

这个问题可能与这个SO帖子有关,也没有答案:Xcode7 | Xcode UI测试| 如何处理位置服务警报?

提前致谢.

Joe*_*tti 48

Xcode 7.1

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从处理程序返回标记为"完成",这意味着它不会再被调用.对于你的情况,我会尝试返回,false所以第二个警报将再次触发处理程序.

Xcode 7.0

以下将解除Xcode 7 Beta 6中的单个"系统警报":

let app = XCUIApplication()
app.launch()
// trigger location permission dialog

app.alerts.element.collectionViews.buttons["Allow"].tap()
Run Code Online (Sandbox Code Playgroud)

Beta 6为UI测试引入了一系列修复,我相信这是其中之一.

还要注意我-element直接打电话-alerts.调用-element上的XCUIElementQuery力的框架,选择"唯一"匹配屏幕上的元素.这适用于一次只能显示一个警报的警报.但是,如果您为标签尝试此操作并且有两个标签,则框架将引发异常.

  • 嗨乔,谢谢你的回答.该行对我的应用程序的作用是 - 警报被成功解除,然后测试在同一行上失败并出现以下错误:`UI测试失败 - 未找到警报的匹配项 (2认同)
  • 确实如此.我提交了[错误报告,rdar:// 22498241](https://openradar.appspot.com/22498241).我建议有人经历这个重复它. (2认同)
  • 大家好,如果我在我的应用程序中有本地化怎么办?警报中的应用程序名称和按钮标题在不同语言下都会有所不同,而不仅仅是英语. (2认同)