微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xcode7 | Xcode UI测试|如何处理位置服务警报?

我正在使用Xcode7 / iOS 9中引入的XCUIApplication,XCUIElement和XCUIElementQuery为我的一个应用程序编写UI测试用例。

我打了一个路障。测试用例中的一个屏幕需要iOS的定位服务。如预期的那样,用户被提示是否允许使用带有警报的位置服务:标题为“允许”应用名称“在您使用应用程序时访问您的位置?允许&不允许按钮

问题是,由于警报由操作系统本身呈现,因此它不存在于应用程序的元素子树中。

我已经记录以下内容:

print("XYZ:\(app.alerts.count)")//0
var existence = app.staticTexts["Allow “App Name” to access your location while you use the app?"].exists
print("XYZ:\(existence)")//false
existence  = app.buttons["Allow"].exists
print("XYZ:\(existence)") //false

甚至UI录制产生类似的代码:

XCUIApplication().alerts["Allow “App Name” to access your location while you use the app?"].collectionViews.buttons["Allow"].tap()

我没有找到可以让我过去这个问题的API。例如:

>点击屏幕上的某个位置
>在应用程式之外取得快讯

那么我怎么能过去呢?有没有办法配置测试目标,以便不需要位置服务授权。

解决方法

Xcode 7.1

Xcode 7.1终于解决了系统警报的问题。但是,有两个小问题。

首先,您需要在呈现警报之前设置“UI Interuption处理程序”。这是告诉框架如何处理警报时出现的方式。

第二,在提示警报后,您必须与界面交互。只需点击应用程序的工作很好,但是是必需的。

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

“位置对话框”只是一个字符串,以帮助开发人员识别哪个处理程序被访问,它不是特定于警报类型。

Xcode 7.0

以下将在Xcode 7 Beta 6中解除单个“系统警报”:

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

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

Beta 6引入了一系列用于UI测试的修复程序,我相信这是其中之一。

还要注意,我直接在alalerts上调用-lelement。在XCUIElementQuery上调用元素强制框架在屏幕上选择“唯一”匹配元素。这对于一次只能有一个可见的警报非常有用。但是,如果您尝试使用这个标签,并且有两个标签,框架将引发异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐