XCUITest可以验证通知标题是否发送到屏幕?XCUITest与通知横幅进行交互。
我可以为通知添加辅助功能标识符,但是当横幅显示到屏幕时,我遇到了使XCUITest与其交互的问题。我知道XCUITest在与应用程序分开的过程中运行,但是如果它仍然可以与通知进行交互,或者超出了XCUITest的范围,它是否会受到影响?
谢谢,
XCUITest可以验证通知标题是否发送到屏幕?XCUITest与通知横幅进行交互。
我可以为通知添加辅助功能标识符,但是当横幅显示到屏幕时,我遇到了使XCUITest与其交互的问题。我知道XCUITest在与应用程序分开的过程中运行,但是如果它仍然可以与通知进行交互,或者超出了XCUITest的范围,它是否会受到影响?
谢谢,
不幸的是,不幸的是。 XCUITest不提供对通知栏的访问。对于几乎所有您可能想到的测试用例场景,Appium都是一个很好的选择,但是Apple仍然没有提供测试推送通知的方法。解决此问题的一种方法是强制您的应用发送通知,在显示通知弹出窗口时进行截图,然后使用图像识别技术来验证通知是否正确(如OpenCV)。这是waaaaay更“解决方法”,然后我想使用,但是迄今为止我知道的唯一可用的方法,希望这有助于。
随着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。