2017-03-01 114 views
1

XCUITest可以验证通知标题是否发送到屏幕?XCUITest与通知横幅进行交互。

我可以为通知添加辅助功能标识符,但是当横幅显示到屏幕时,我遇到了使XCUITest与其交互的问题。我知道XCUITest在与应用程序分开的过程中运行,但是如果它仍然可以与通知进行交互,或者超出了XCUITest的范围,它是否会受到影响?

谢谢,

回答

0

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

2

随着Xcode 9这现在是可能的。您可以访问其他应用程序。这包括包含通知横幅的跳板。

XCUIApplication现在有一个新的初始化程序,它将一个包标识符作为参数。它为您提供了使用该捆绑标识符的应用程序的参考。然后,您可以使用普通查询来访问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 
    } 
} 

您可以检出的演示应用程序,包括本次测试here

您还可以测试远程通知与UITests。这需要更多的工作,因为您无法直接从您的代码安排远程通知。您可以使用名为NWPusher的服务。我写了一篇关于how to test Remote Notifications with Xcode UITests的博文,在github上也有一个demo project