2015-08-31 11 views
13

La questione è in realtà molto semplice:Xcode UI Test [xcode7-beta6] - Affermare i valori etichetta reale quando si utilizza l'accessibilità etichette

Esiste un modo per affermare il valore visualizzato da un'etichetta specifica (ad esempio, UILabel) quando usando un'etichetta di accessibilità su questo oggetto?

quanto ne vedere, tutte le asserzioni (es XCTAssertEquals) realizzate negli esempi, sia esso da un WWDC Talk o Blogposts, si verifica solo se un elemento esiste per una query come XCTAssertEquals(app.staticTexts["myValue"].exists, true) o se il numero di cellule in un tavolo è corretto XCTAssertEquals(app.tables.cells.count, 5). Quindi, quando si evitano le etichette di accessibilità è possibile verificare se un oggetto ha un determinato valore visualizzato, ma non quale oggetto/elemento. E quando si utilizzano le etichette di accessibilità, mi ruba l'opportunità di interrogare i valori visualizzati, perché app.staticTexts["myValue"] non riuscirà a fornire un risultato, ma app.staticTexts["myAccessibilityLabel"] colpirà.

Supponendo di voler testare la funzionalità "Aggiungi nuova cella alla tabella", posso verificare che sia stata aggiunta una nuova cella all'elenco, ma non ho idea se la nuova cella venga aggiunta nella parte superiore o nella in fondo alla lista o da qualche parte nel mezzo.

Per me, un modo semplice per verificare se un elemento specifico ha un determinato valore dovrebbe essere un gioco da ragazzi quando si tratta di test dell'interfaccia utente.

È possibile che a causa della documentazione mancante potrei ignorare l'ovvio. Se è così, dimmelo

risposta

11

Penso che stai chiedendo alcune cose diverse, quindi cercherò di rispondere a ciascuna domanda individualmente.

  1. C'è un modo per affermare il valore visualizzato da un'etichetta specifica (ad esempio UILabel) quando si utilizza un'etichetta di accessibilità su questo oggetto?

In breve, no. I test dell'interfaccia utente si agganciano alle API di accessibilità, quindi sei limitato a eseguire query per gli oggetti basati su tale. Tuttavia, è possibile controllare la proprietà -value di determinati elementi, ad esempio i controlli. Questo è usato per verificare se un interruttore è acceso o spento. Si noti che questi bollano verso il basso utilizzando anche le API di accessibilità, solo un metodo diverso (-accessibilityValue su -accessibilityIdentifier e).

  1. ... ma non ho idea se si aggiunge la nuova cella nella parte superiore o nella parte inferiore della lista o da qualche parte in mezzo.

per interrogare un XCUIElement per la sua cornice è possibile utilizzare il nuovo protocollo XCUIElementAttributes che espone -frame. Per esempio:

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. Per me, un modo semplice per verificare se un elemento specifico ha un certo valore dovrebbe essere un gioco da ragazzi quando si tratta di UI Testing .

Se si pensa di tutto ciò in termini di accessibilità questo diventa un non-problema. I test dell'interfaccia utente possono interagire solo con i tuoi elementi tramite le API di accessibilità, quindi devi implementarli. Hai anche il vantaggio di rendere la tua app più accessibile agli utenti con queste impostazioni attivate.

Provare a impostare sia il -accessibilityLabel o -accessibilityIdentifier per la cella per il testo visualizzato. I test dell'interfaccia utente possono essere complicati su quale dei due usi.

  1. E 'possibile che a causa della documentazione mancante potrei trascurare l'ovvio. Se è così, dimmelo

XCTest e interfaccia utente test non hanno alcuna documentazione ufficiale. Quindi sono andato a estrarre il mio dai file di intestazione esposti nel framework. Nota che anche se sono stati estratti dalla fonte, non sono ufficiali.

XCTest/UI Testing Documentation

+3

Grazie @ Joe sacco. Ma sei d'accordo sul fatto che sia strano che tu possa controllare il valore di una casella di controllo (attiva o meno), ma non il valore (il testo visualizzato) di una UILabel. Destra? Per me questo significa che non posso utilizzare l'UI Testing per i casi di test funzionali, perché la maggior parte di quelli che ho incontrato contengono requisiti come _se inserisci 'abc' nel campo di testo 'a' e premi il pulsante 'b', quindi l'etichetta 'c' dovrebbe mostrare 'xyz'_. – wegenmic

+0

@wegenmic Suggerisco di pensare in modo leggermente diverso. Ricorda che UIElement non è un oggetto UI effettivo, è un percorso di ricerca per un oggetto UI. Devi semplicemente creare un altro "percorso di ricerca". 'app.staticTexts [" New Label Text "]'. Mi ha buttato per un giro all'inizio ... "valore" non è particolarmente utile. –

3

Dai forum di Apple sembra che è possibile ottenere il valore del marchio:

L'unico modo che ho trovato è quello di non impostare un'etichetta Accessibilità, ma l'uso identificatore invece Quindi XCUIElement.label cambierà per corrispondere al testo corrente dell'etichetta.

Tuttavia c'è un trucco: se in precedenza è stata impostata l'etichetta Accessibilità in XC e rimossa, una voce che imposta l'etichetta su "" rimane nello storyboard. In questo caso, non solo la chiamata a .label restituirà "", ma non sarà possibile interrogare l'etichetta in base al suo testo!

L'unica cosa che puoi fare è eliminare e aggiungere nuovamente l'etichetta, oppure modificare manualmente l'xml.

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

14

Assicurarsi di impostare la proprietà .accessibilityValue del UILabel ogni volta che si imposta il suo valore .text. Poi, nel UITest, è possibile verificare il valore di accessibilità in questo modo:

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

Questa dovrebbe essere la risposta accettata.Grazie Robert! –

+0

questo approccio funzionerà anche per objc ma devi usare XCTAssertEqualObjects ((NSString *) labelElement.value, @ "il testo previsto", @ "Queste stringhe devono essere uguali!"); – drshock

+0

È anche possibile impostare accessibilityIdentifier in Storyboard o in modo programmatico e ottenere XCUIElement con quello. –

2

Ciò che funziona per me è quello di impostare l'identificatore di accessibilità del UILabel per diciamo MyLabel.

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

    return myLabelUIElement.label 
} 

testato con Xcode 8 e iOS 10

Problemi correlati