在macOS上未调用addUIInterruptionMonitor

时间:2019-06-12 09:51:27

标签: swift macos xctest

我想测试我的macOS应用程序。它使用Macbook的相机,并希望在我的UITest中进行处理。但是我无法使它工作。这是我的无效代码。这段代码触发了通知,并且向我显示了一条警报,允许我访问我的相机,但是没有调用闭包。谢谢您的帮助。

有很多针对iOS的解决方案,但我在macOS上需要它。

let alertHandler = addUIInterruptionMonitor(withDescription: "Camera Permission Alert") { (alert) -> Bool in
        if alert.buttons.matching(identifier: "OK").count > 0 {
           alert.buttons["OK"].click()
            self.app.click()
            return true
        } else {
            return false
        }
    }

    XCTAssertTrue(startButton.waitForExistence(timeout: 1.0))
    startButton.click()

    XCTAssertTrue(recordButton.waitForExistence(timeout: 20.0))
    recordButton.click()
    wait(for: 8)
    recordButton.click()
    removeUIInterruptionMonitor(alertHandler)
}

1 个答案:

答案 0 :(得分:1)

我设法通过在触发系统对话框的交互(无论是摄像头访问还是其他)之后添加一个额外的交互来使中断监视器在macOS上工作。因此,在您的示例中,我将在startButton.click()之后添加一个操作(如果这是触发摄像机访问对话框的原因)。

示例:

func testCamera() {
    let alertHandler = addUIInterruptionMonitor(withDescription: "Camera Permission Alert") { (alert) -> Bool in
        if alert.buttons.matching(identifier: "OK").count > 0 {
           alert.buttons["OK"].click()
            self.app.click()
            return true
        } else {
            return false
        }
    }

    useCameraButton.click()

    // try to interact with the app by clicking on the app's window
    app.windows.first().click()
    // at this point the handler should intercept the system interruption 
    // and blocks further execution until handler does return

    // try to use the camera again
    useCameraButton.click()

    removeUIInterruptionMonitor(alertHandler)
}

有关Apple文档中此行为的提示:

  

当警报或其他模式UI是预期的   测试工作流程,请勿编写UI中断监视器。测试不会   请使用监视器,因为模式界面不会阻止测试。用户界面   测试仅在需要其元素时才尝试其UI中断监视器   进行交互以完成测试被中断打断了   通过不相关的UI。

https://developer.apple.com/documentation/xctest/xctestcase/handling_ui_interruptions