XCUITest与通知横幅互动。

是否可以在XCUITest中validation通知横幅是否已发送到屏幕?

我可以在通知中添加辅助function标识符,但是当横幅显示在屏幕上时,我遇到了让XCUITest与其进行交互的问题。 我知道XCUITest在与应用程序不同的进程中运行,但是如果它仍然可以与通知进行交互或者是否超出XCUITest的范围,那么它是不可思议的?

谢谢,

使用Xcode 9 ,现在可以实现。 您可以访问其他应用。 这包括包含通知横幅的跳板。

XCUIApplication现在有一个新的初始化程序,它将bundle标识符作为参数。 它为您提供了使用该包标识符的应用程序的引用。 然后,您可以使用常规查询来访问UI元素。 就像你之前使用自己的应用程序一样。

这是一项测试,用于检查应用关闭时是否显示本地通知

 import XCTest class UserNotificationUITests: XCTestCase { override func setUp() { super.setUp() continueAfterFailure = false } func testIfLocalNotificationIsDisplayed() { let app = XCUIApplication() let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") app.launch() // close app to trigger local notification XCUIDevice.shared.press(XCUIDevice.Button.home) // wait for the notification let localNotification = springboard.otherElements["USERNOTIFICATION, now, Buy milk!, Remember to buy milk from store!"] XCTAssertEqual(waiterResultWithExpectation(localNotification), XCTWaiter.Result.completed) } } extension UserNotificationUITests { func waiterResultWithExpectation(_ element: XCUIElement) -> XCTWaiter.Result { let myPredicate = NSPredicate(format: "exists == true") let myExpectation = XCTNSPredicateExpectation(predicate: myPredicate, object: element) let result = XCTWaiter().wait(for: [myExpectation], timeout: 6) return result } } 

您可以在这里查看演示应用程序,包括此测试

您还可以使用UITests测试远程通知 。 这需要更多的工作,因为您无法直接从代码中安排远程通知。 您可以使用名为NWPusher的服务。 我写了一篇关于如何使用Xcode UITests测试远程通知的博客文章 ,还有一个关于github的演示项目 。

不幸的是,还没有。 XCUITest不提供对通知栏的访问权限。 对于您可能提出的几乎所有测试用例场景,Appium都是一个不错的选择,但Apple仍然没有提供测试推送通知的方法。 解决此问题的一种方法是强制您的应用发送通知,在显示通知弹出窗口时截取屏幕截图,然后使用图像识别技术validation通知是否正确(例如OpenCV)。 这是waaaaay更多的“解决方法”然后我想使用,但是目前为止我知道的唯一可用方法,希望这有帮助。