2015-11-03 10 views
7

Ich schreibe UITests in xCode 7.1 und habe ein Problem beim Testen von Warnungen (Benachrichtigungen in meinem Fall zulassen). Während ein Test xCode Erstellung schreibt diesen Code:UITesting von Alarmen in xCode 7.1

app.alerts["\U201cAppName\U201d Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap() 

Welche sofort Fehler verursacht:

Invalid escape sequence in literal

So ersetzte ich Xcode Code mit:

app.alerts["\u{201c}AppName\u{201d} Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap() 

Aber wenn ich UITest führen Sie es nicht mit Nachricht:

UI Testing Failure - No matches found for Alert

Das gleiche gilt für Code

app.alerts["“AppName” Would Like to Send You Notifications"].collectionViews.buttons["OK"].tap() 

Ich habe auch versucht

app.alerts.collectionViews.buttons["OK"].tap() 

als Menschen here geraten, aber gleiche Geschichte ...

ich mit einem solchen Problem während UITesting viele Menschen konfrontiert glauben an xCode 7.1

Bitte teilen Sie Ihre Erfahrungen oder Vorschläge zur Lösung. Vielen Dank im Voraus!

+0

Die „falsche“ Aufzeichnung des Unicode-Zeichens ist Thema rdar: // 23493343. Fühlen Sie sich frei, dieses Problem zu duplizieren. – Tobias

Antwort

6

siehe Beispiel unten

import XCTest 

let systemAlertHandlerDescription = "systemAlertHandlerDescription" 

class LoginPerformingTestCase: XCTestCase { 

var systemAlertMonitorToken: NSObjectProtocol? = nil 

override func setUp() { 
    continueAfterFailure = false 

    let app = XCUIApplication() 
    app.launchArguments = [TestingEnvironment.resetLaunchArgument, TestingEnvironment.testingEnvironmentArgument] 
    app.launch() 

    systemAlertMonitorToken = addUIInterruptionMonitorWithDescription(systemAlertHandlerDescription) { (alert) -> Bool in 
     if alert.buttons.matchingIdentifier("OK").count > 0 { 
      alert.buttons["OK"].tap() 
      return true 
     } else { 
      return false 
     } 
    } 
} 

override func tearDown() { 
    if let systemAlertMonitorToken = self.systemAlertMonitorToken { 
     removeUIInterruptionMonitor(systemAlertMonitorToken) 
    } 

    super.tearDown() 
} 

func loginWithApp(app: XCUIApplication) { 
    let signInButton = app.buttons["SIGN IN"] 
    signInButton.tap() 
    let emailAdressTextField = app.textFields.matchingIdentifier("EmailAddress").elementBoundByIndex(0) 
    emailAdressTextField.tap() 
    emailAdressTextField.typeText("[email protected]") 

    let passwordSecureTextField = app.secureTextFields["Password"] 
    passwordSecureTextField.tap() 
    passwordSecureTextField.typeText("1111") 
    signInButton.tap() 

    let exists = NSPredicate(format: "exists == 1") 
    let iconAlarmButton = app.buttons["icon alarm"] 

    let expectation = expectationForPredicate(exists, evaluatedWithObject: iconAlarmButton, handler: nil) 
    waitForExpectationsWithTimeout(60) { (error) -> Void in 
     if let _ = error { 
      expectation.fulfill() 
     } 
    } 

    app.tap()//workaround to hide system alert 
    let darkNavigaitonBar = app.otherElements.matchingIdentifier("darkNavigationView").elementBoundByIndex(0) 
    if darkNavigaitonBar.hittable == true { 
     app.tap() 
    } 

} 

} 
+0

Danke für Ihre Antwort. Es hat geholfen, nette Annäherung! Was ist TestingEnvironment in app.launchArguments []? Xcode erkennt es nicht (Fehler: Verwendung der unaufgelösten Kennung 'TestingEnvironment'). –

+0

Entfernen Sie es einfach. –

2

Hier ist ein Beispiel, wie es mit einer App zu tun anfordernden Zugriff auf lokale Benachrichtigung Erlaubnis:

addUIInterruptionMonitorWithDescription("Local Dialog") { (alert) -> Bool in 
    if alert.collectionViews.buttons["OK"].exists { 
      alert.collectionViews.buttons["OK"].tap() 
      return true 
    } 
    return false 
} 
Verwandte Themen