与照片相关的警报不会调用 addUIInterruptionMonitor 的处理程序

问题描述 投票:0回答:4
private func acceptPermissionAlert() {
    
    _ = addUIInterruptionMonitor(withDescription: "") { alert -> Bool in
        
        if alert.buttons["Don’t Allow"].exists { //doesnt get here second time
            
            alert.buttons.element(boundBy: 1).tapWhenExists()
            
            return true
        }
        
        return false
    }
}

这不适用于:

在应用程序的开始阶段,它在接受通知权限时工作得很好,但在这里,它不起作用。这是为什么?

ios swift xcode-ui-testing
4个回答
26
投票

我发现

addUIInterruptionMonitor
有时无法及时处理警报,或者直到测试完成为止。如果它不起作用,请尝试使用 Springboard,它管理 iOS 主屏幕。您可以从那里访问警报、按钮等,这对于您确切知道警报何时显示的测试特别有用。

所以,像这样:

let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") 

let alertAllowButton = springboard.buttons.element(boundBy: 1)
if alertAllowButton.waitForExistence(timeout: 5) {
   alertAllowButton.tap()
}

buttons.element(boundBy:1)
将确保您点击右侧的按钮,将1更改为0以点击左侧,(因为有时
"Don't Allow"
中的'会导致问题)。


22
投票

添加:

app.tap()

在方法的最后。

这是因为您需要与应用程序交互才能触发处理程序。


13
投票

添加中断监视器后,您应该继续与应用程序交互,就像它没有出现一样。

另请注意,按钮标识符中有一个“智能引号”,而不是常规的撇号。

let photosAlertHandler = addUIInterruptionMonitor(withDescription: "Photo Permissions") { alert -> Bool in
    if alert.buttons["Don't Allow"].exists {
        alert.buttons.element(boundBy: 1).tapWhenExists()
        return true
    }
    return false
}

// Do whatever you want to do after dismissing the alert
let someButton = app.buttons["someButton"]
someButton.tap() // The interruption monitor's handler will be invoked if the alert is present

当警报出现后发生下一次交互时,将调用中断监视器的处理程序并处理警报。

当您认为已经完成时,还应该删除中断监视器,否则出现的任何其他警报都会调用它。

removeUIInterruptionMonitor(photosAlertHandler)

0
投票

如果建议的解决方案在 iOS 17+ 上不起作用,我找到了一个解决方法。在此代码片段中,我有 4 个不同的权限,其中之一是位置,它具有不同的按钮名称。

let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
for i in 0..<4 {
    let allowLocationButton = springboard.buttons["Allow While Using App"]
    let allowButton = springboard.buttons["Allow"]
            
    if allowLocationButton.isHittable {
        allowLocationButton.tap()
    } else if allowButton.isHittable {
        allowButton.tap()
    } else {
        break
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.