如何等待位置警报(这是系统警报)显示?
How to wait for Location Alert ( which is system alert) to show?
我想出了如何关闭系统警报,但我无法等待它显示,因为应用程序看不到系统警报。我尝试使用 app.debugDescription 和 app.alerts.count 进行调试,但没有成功。
使用addUIInterruptionMonitor:withDescription:handler:
注册一个中断监视器。为了'wait'出现系统alert,处理完后使用handler设置一个变量,等alert时和app进行良性交互
您必须在等待期间继续与应用程序交互,因为交互是触发中断监控的内容。
class MyTests: XCTestCase {
let app = XCUIApplication()
func testLocationAlertAppears() {
var hasDismissedLocationAlert = false
let monitor = addUIInterruptionMonitor(withDescription: "LocationPermissions") { (alert) in
// Check this alert is the location alert
let location = NSPredicate(format: "label CONTAINS 'Location'")
if alert.staticTexts.element(matching: location).exists {
// Dismiss the alert
alert.buttons["Allow"].tap()
hasDismissedLocationAlert = true
return true
}
return false
}
// Wait for location alert to be dismissed
var i = 0
while !hasDismissedLocationAlert && i < 20 {
// Do some benign interaction
app.tap()
i += 1
}
// Clean up
removeUIInterruptionMonitor(monitor)
// Check location alert was dismissed
XCTAssertTrue(hasDismissedLocationAlert)
}
}
你应该像@Oletha 写的那样使用addUIInterruptionMonitor
。
这里棘手的部分是系统警报按钮不使用辅助功能标识符,因此您必须搜索文本才能点击它们。此文本已翻译成您 运行 使用 simulator/device 的语言,如果您想 运行 测试英语以外的多种语言,这可能会很困难。
您可以使用 AutoMate framework 来简化它。这里有一个如何使用 AutoMate 处理系统警报的示例:
func locationWhenInUse() {
let token = addUIInterruptionMonitor(withDescription: "Location") { (alert) -> Bool in
guard let locationAlert = LocationWhenInUseAlert(element: alert) else {
XCTFail("Cannot create LocationWhenInUseAlert object")
return false
}
locationAlert.allowElement.tap()
return true
}
// Interruption won't happen without some kind of action.
app.tap()
// Wait for given element to appear
wait(forVisibilityOf: locationPage.requestLabel)
removeUIInterruptionMonitor(token)
}
在上面的示例中,locationAlert.allowElement.tap()
是可能的,因为 AutoMate 可以处理 iOS 模拟器支持的任何语言。
有关如何使用 AutoMate 处理系统警报的更多示例,请查看:PermissionsTests.swift
我想出了如何关闭系统警报,但我无法等待它显示,因为应用程序看不到系统警报。我尝试使用 app.debugDescription 和 app.alerts.count 进行调试,但没有成功。
使用addUIInterruptionMonitor:withDescription:handler:
注册一个中断监视器。为了'wait'出现系统alert,处理完后使用handler设置一个变量,等alert时和app进行良性交互
您必须在等待期间继续与应用程序交互,因为交互是触发中断监控的内容。
class MyTests: XCTestCase {
let app = XCUIApplication()
func testLocationAlertAppears() {
var hasDismissedLocationAlert = false
let monitor = addUIInterruptionMonitor(withDescription: "LocationPermissions") { (alert) in
// Check this alert is the location alert
let location = NSPredicate(format: "label CONTAINS 'Location'")
if alert.staticTexts.element(matching: location).exists {
// Dismiss the alert
alert.buttons["Allow"].tap()
hasDismissedLocationAlert = true
return true
}
return false
}
// Wait for location alert to be dismissed
var i = 0
while !hasDismissedLocationAlert && i < 20 {
// Do some benign interaction
app.tap()
i += 1
}
// Clean up
removeUIInterruptionMonitor(monitor)
// Check location alert was dismissed
XCTAssertTrue(hasDismissedLocationAlert)
}
}
你应该像@Oletha 写的那样使用addUIInterruptionMonitor
。
这里棘手的部分是系统警报按钮不使用辅助功能标识符,因此您必须搜索文本才能点击它们。此文本已翻译成您 运行 使用 simulator/device 的语言,如果您想 运行 测试英语以外的多种语言,这可能会很困难。
您可以使用 AutoMate framework 来简化它。这里有一个如何使用 AutoMate 处理系统警报的示例:
func locationWhenInUse() {
let token = addUIInterruptionMonitor(withDescription: "Location") { (alert) -> Bool in
guard let locationAlert = LocationWhenInUseAlert(element: alert) else {
XCTFail("Cannot create LocationWhenInUseAlert object")
return false
}
locationAlert.allowElement.tap()
return true
}
// Interruption won't happen without some kind of action.
app.tap()
// Wait for given element to appear
wait(forVisibilityOf: locationPage.requestLabel)
removeUIInterruptionMonitor(token)
}
在上面的示例中,locationAlert.allowElement.tap()
是可能的,因为 AutoMate 可以处理 iOS 模拟器支持的任何语言。
有关如何使用 AutoMate 处理系统警报的更多示例,请查看:PermissionsTests.swift