2015-08-31 4 views
13

Die Frage ist eigentlich ganz einfach:Xcode UI Testing [xcode7-beta6] - Ist-Labelwerte Geltendmachung wenn Zugänglichkeit mit Etiketten

Gibt es eine Möglichkeit, den angezeigten Wert von einem bestimmten Label (zB UILabel) geltend zu machen, wenn Verwenden Sie ein Accessibility-Label für dieses Objekt?

Soweit ich es sehe, sind alle Aussagen (zB XCTAssertEquals) in den Beispielen hergestellt, sei es von einem WWDC Talk oder Blogposts, sind die Überprüfung nur dann, wenn ein Element für eine Abfrage wie XCTAssertEquals(app.staticTexts["myValue"].exists, true) oder wenn die Anzahl der Zellen vorhanden ist in einer Tabelle ist richtig XCTAssertEquals(app.tables.cells.count, 5). Wenn Sie also Eingabehilfen-Labels vermeiden, können Sie überprüfen, ob für ein Objekt ein bestimmter Wert angezeigt wird, aber nicht für welches Objekt/Element. Und wenn ich Accessibility-Labels verwende, beraubt es mich die Möglichkeit, die angezeigten Werte abzufragen, weil app.staticTexts["myValue"] jetzt kein Ergebnis liefern kann, aber app.staticTexts["myAccessibilityLabel"] schlägt.

Angenommen, ich möchte meine "Neue Zelle zu Tabelle hinzufügen" -Funktionalität testen, kann ich testen, ob wirklich eine neue Zelle zur Liste hinzugefügt wurde, aber ich habe keine Ahnung, ob die neue Zelle oben oder unten hinzugefügt wird Ende der Liste oder irgendwo dazwischen.

Für mich, eine einfache Möglichkeit zu überprüfen, ob ein bestimmtes Element einen bestimmten Wert hat, sollte ein Kinderspiel sein, wenn es um UI-Tests geht.

Es ist möglich, dass aufgrund der fehlenden Dokumentation ich das Offensichtliche übersehen könnte. Wenn ja, sag es mir einfach.

Antwort

11

Ich denke, Sie fragen ein paar verschiedene Dinge, so werde ich versuchen, jede Frage einzeln zu beantworten.

  1. Gibt es eine Möglichkeit, den angezeigten Wert von einem bestimmten Label (z UILabel) bei Verwendung eines Zugänglichkeit Etiketts auf diesem Objekt zu behaupten?

Kurz gesagt, nein. UI Testing funktioniert, indem es sich in Accessibility-APIs einklinkt, so dass Sie darauf beschränkt sind, nach Objekten zu fragen. Sie können jedoch die Eigenschaft -value bestimmter Elemente, z. B. Steuerelemente, überprüfen. Dies wird verwendet, um zu testen, ob ein Schalter ein- oder ausgeschaltet ist. Beachten Sie, dass diese auch mit Accessibility-APIs aufkochen, nur eine andere Methode (-accessibilityValue über -accessibilityIdentifier und -accessibilityLabel).

  1. ... aber ich habe keine Ahnung, ob die neue Zelle am oberen oder unteren Ende der Liste oder irgendwo dazwischen hinzugefügt wird.

Um einen XCUIElement für seinen Rahmen befragen Sie das neue XCUIElementAttributes-Protokoll verwenden können, die -frame aussetzt. Zum Beispiel:

let app = XCUIApplication() 
app.launch() 

app.buttons["Add New Cell to Table"].tap() 

let lastCell = app.cells["Last Cell"] 
let newCell = app.cells["New Cell"] 

XCTAssert(newCell.exists) 
XCTAssert(newCell.frame.minY > lastCell.frame.maxY) 
  1. Für mich eine einfache Möglichkeit, zu überprüfen, ob ein bestimmtes Element einen bestimmten Wert hat, sollte ein Kinderspiel sein, wenn es um UI Testing kommt .

Wenn Sie an alles denken in Bezug auf Zugänglichkeit wird dies kein Thema. UI-Tests können nur über Accessibility-APIs mit Ihren Elementen interagieren. Sie müssen sie also implementieren. Sie erhalten außerdem den zusätzlichen Vorteil, dass Ihre App mit diesen Einstellungen für Benutzer zugänglicher wird.

Versuchen Sie, die -accessibilityLabel oder -accessibilityIdentifier für die Zelle auf den angezeigten Text einzustellen. UI-Testing kann schwierig sein, welche verwendet es.

  1. Es ist möglich, dass aufgrund der fehlenden Dokumentation ich das Offensichtliche übersehen könnte. Wenn ja, sag es mir einfach.

XCTest und UI-Tests haben keine offizielle Dokumentation. Also bin ich gegangen und habe meine eigenen aus den Header-Dateien extrahiert, die im Framework angezeigt werden. Beachten Sie, dass obwohl sie aus der Quelle gezogen wurden, sie inoffiziell sind.

XCTest/UI Testing Documentation

+3

Vielen Dank @ Joe. Aber Sie stimmen zu, dass es seltsam ist, dass Sie den Wert eines Kontrollkästchens (aktiv oder nicht), aber nicht den Wert (den angezeigten Text) eines UILabel überprüfen können. Recht? Für mich bedeutet das, dass ich UI-Tests nicht für funktionale Testfälle verwenden kann, da die meisten davon Anforderungen wie _ enthalten, wenn Sie 'abc' in das Textfeld 'a' eingeben und die Taste 'b' drücken, dann sollte die Bezeichnung 'c' angezeigt werden 'xyz'_. – wegenmic

+0

@wegenmic Vorschlagen etwas anders denken. Denken Sie daran, dass ein UIElement kein tatsächliches UI-Objekt ist, sondern ein Suchpfad zu einem UI-Objekt. Sie müssen lediglich einen anderen "Suchpfad" erstellen. 'app.staticTexts [" Neuer Etikettentext "]'. Warf mich für eine Schleife am Anfang ... "Wert" ist nicht besonders nützlich. –

3

aus den Apple-Foren es sieht aus wie es möglich ist, den Wert des Labels zu erhalten:

Der einzige Weg, die ich gefunden habe ist kein Zugänglichkeitslogo gesetzt, aber die Verwendung Kennung stattdessen. Dann wird XCUIElement.label geändert, um dem aktuellen Text des Etiketts zu entsprechen.

Es gibt jedoch ein Problem: Wenn Sie zuvor die Eingabehilfe in XC festgelegt und entfernt haben, bleibt ein Eintrag, der die Beschriftung auf "" setzt, im Storyboard. In diesem Fall wird ".label" nicht nur "" zurückgeben, sondern Sie können das Label auch nicht nach seinem Text abfragen!

Das einzige, was Sie tun können, ist Löschen und erneut Hinzufügen der Bezeichnung, oder manuell bearbeiten Sie die XML.

lastobelus - https://forums.developer.apple.com/thread/10428

14

Seien Sie sicher, dass die .accessibilityValue Eigenschaft des UILabel setzen, wenn Sie seine .text Wert gesetzt. Dann in UITest, können Sie die Erreichbarkeit Wert wie folgt testen:

let labelElement = app.staticTexts["myLabel"] 
    ... 
    XCTAssertEqual(labelElement.value as! String, "the expected text") 
+0

Dies sollte die akzeptierte Antwort sein.Danke Robert! –

+0

dieser Ansatz auch für objc arbeiten, aber Sie haben XCTAssertEqualObjects zu verwenden ((NSString *) labelElement.value, @ "der erwarteten Text", @ "Diese Strings gleich sein sollen!"); – drshock

+0

Sie können auch die accessibilityIdentifier gesetzt entweder in der Storyboard oder programmatisch und den XCUIElement damit erhalten. –

2

Was für mich funktioniert, ist die Zugänglichkeit Kennung des UILabel zu setzen, um die MyLabel sagen zu lassen.

func myLabelText() -> String { 
    let myLabelUIElement: XCUIElement = self.application.staticTexts["MyLabel"] 

    return myLabelUIElement.label 
} 

mit Xcode Getestet 8 und iOS 10