我正在使用新的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];

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

那么,在测试中消除一堆系统alert 的最佳方法是什么?系统弹出窗口中断了我的应用程序流程,并立即使我的正常UI测试用例失败.事实上,任何关于如何绕过系统alert 以便恢复正常流量测试的建议都是值得赞赏的.

这个问题可能与这篇同样没有答案的SO帖子有关:Xcode7 | Xcode UI Tests | How to handle location service alert?

提前谢谢.

推荐答案

Xcode 7.1

Xcode 7.1终于解决了系统alert 的问题.然而,有两个小问题.

首先,在显示alert 之前,需要设置"UI中断处理程序".这是我们告诉框架在alert 出现时如何处理alert 的方式.

其次,在显示alert 后,必须与界面交互.只需点击应用程序就可以了,但这是必需的.

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

"位置对话框"只是一个字符串,用于帮助开发人员识别访问了哪个处理程序,而不是特定于alert 类型.

我相信处理程序返回true会将其标记为"完成",这意味着它不会再次被调用.对于你的情况,我会try 返回false,这样第二个alert 将再次触发处理程序.

Xcode 7.0

以下内容将消除Xcode 7 Beta 6中的单个"系统alert ":

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

app.alerts.element.collectionViews.buttons["Allow"].tap()

Beta 6为用户界面测试引入了一系列补丁,我相信这就是其中之一.

另外请注意,我是直接拨打-alerts拨打-element.在XCUIElementQuery上调用-element会迫使框架在屏幕上 Select "唯一"匹配元素.这对于一次只能看到一个alert 的alert 非常有用.但是,如果您try 对一个标签执行此操作,并且有两个标签,框架将引发异常.

Objective-c相关问答推荐

在 MacOS 上截屏

使用 AVAudioplayer 在后台播放音乐

iphone 的 UIPopoverController 不工作?

如何为代码自动格式化设置 Xcode 插件

将 CFDictionaryRef 转换为 NSDictionary?

更改 UINavigationBar 字体属性?

Objective-C 的 Eclipse 插件?

如何切换回已经加载的 UIViewController?

以编程方式创建 UITableView

UILabel 的角半径属性在 iOS 7.1 中不起作用

使用 Objective-C 查找 IMEI 号码

奇怪的错误 NSAssert

如何编写 OS X Finder 插件

当表格重新出现时,UITableView 不会自动取消 Select 选定的行

iOS6:supportedInterfaceOrientations 不起作用(被调用但界面仍然旋转)

Objective C - 如何连接整个字符串数组?

判断 NSString 是否仅包含字母数字 + 下划线字符

为整个 iPhone / iPad 应用程序设置背景图像

如何判断 WkWebView 是否在 Objective-C 中完成加载?

UITableViewCell中的文本居中对齐问题