2015-07-07 13 views
18

Ich verwende die UI-Test-APIs, die in Xcode 7 XCTest eingeführt wurden. Auf meinem Bildschirm habe ich einen Text, der aus dem Netzwerk geladen wird.Wie kann man in UI-Tests in Xcode prüfen, ob statischer Text aus dem Netzwerk angezeigt wird?

Der Test schlägt fehl, wenn ich es einfach mit exists Eigenschaft überprüfen.

XCTAssert(app.staticTexts["Text from the network"].exists) // fails 

Es funktioniert aber, wenn ich zum ersten Mal den Wasserhahn oder eine andere Veranstaltung auf den Text wie folgt an:

app.staticTexts["Text from the network"].tap() 
XCTAssert(app.staticTexts["Text from the network"].exists) // works 

Es sieht aus wie wenn ich exists nur nennen sie es sofort auswertet und schlägt fehl, da die Text wurde noch nicht aus dem Netzwerk heruntergeladen. Aber ich denke, wenn ich die tap() Methode anrufe, wartet es auf den Text, um zu erscheinen.

Gibt es eine bessere Möglichkeit, nach dem Vorhandensein eines Textes zu suchen, der vom Netzwerk geliefert wird?

So etwas wie (dieser Code wird nicht funktionieren):

XCTAssert(app.staticTexts["Text from the network"].eventuallyExists) 
+1

Ich habe meine Antwort für Xcode 7 Beta 4 aktualisiert. Da es die angenommene Antwort drastisch ändert, wollte ich Sie wissen lassen. –

Antwort

28

Xcode 7 Beta 4 hinzugefügt native Unterstützung für asynchrone Ereignisse. Hier ist ein kurzes Beispiel, wie Sie auf eine UILabel warten können.

XCUIElement *label = self.app.staticTexts[@"Hello, world!"]; 
NSPredicate *exists = [NSPredicate predicateWithFormat:@"exists == 1"]; 

[self expectationForPredicate:exists evaluatedWithObject:label handler:nil]; 
[self waitForExpectationsWithTimeout:5 handler:nil]; 

Erstellen Sie zuerst eine Abfrage, um auf ein Etikett mit dem Text "Hallo, Welt!" erscheinen. Das Prädikat stimmt überein, wenn das Element existiert (element.exists == YES). Übergeben Sie dann das Prädikat und bewerten Sie es anhand des Labels.

Wenn fünf Sekunden verstreichen, bevor die Erwartung erfüllt ist, schlägt der Test fehl. Sie können auch einen Handler-Block anhängen, der aufgerufen wird, wenn die Erwartung fehlschlägt oder das Zeitlimit überschritten wird.

Wenn Sie weitere Informationen zu UI-Tests im Allgemeinen suchen, finden Sie unter UI Testing in Xcode 7.

0

Wenn ich Sie richtig verstanden habe, dass der Zieltext bereits angezeigt wurde, während Sie ihn überprüfen, können Sie versuchen, die Eigenschaft hittable zu verwenden.

0

Swift 3:

let predicate = NSPredicate(format: "exists == 1") 
let query = app!.staticTexts["identifier"] 
expectation(for: predicate, evaluatedWith: query, handler: nil) 
waitForExpectations(timeout: 5, handler: nil) 

Es wird kontinuierlich für 5 Sekunden prüfen, ob der Text angezeigt wird oder nicht.

Sobald der Text in weniger als 5 Sekunden angezeigt wird, wird weiterer Code ausgeführt.

0

XCode9 eine Methode hat waitForExistence(timeout: TimeInterval) von XCUIElement

extension XCUIElement { 
    // A method for tap element 
    @discardableResult 
    func waitAndTap() -> Bool { 
     let _ = self.waitForExistence(timeout: 10) 
     let b = self.exists && self.isHittable 
     if (b) { 
      self.tap() 
     } 
     return b 
    } 
} 

// Ex: 
if (btnConfig.waitAndTap() == true) { 
    // Continue UI automation 
} else { 
    // `btnConfig` is not exist or not hittable. 
} 

Aber ich begegnet ein anderes Problem ist die element existieren, aber nicht akzeptierbar. Also erweitere ich eine Methode um zu warten, dass ein Element hitbar ist.