2015-11-28 26 views
6

Sto risparmiando uno screenshot di strumenti per l'automazione, ma alcuni controlli mancano in questo screenshot. Sembra che i controlli aggiunti a livello di codice siano "ignorati".strumenti per l'automazione screenshot ignora programmazione aggiunto controlli

Come posso risolvere il problema?

Manuale screenshot in Simulator: (notare la scatola gialla)

Screenshot in Simulator with Yellow Button

Schermata di strumenti per l'automazione:

Screenshot in Instruments Automation without Yellow Button

Lo script di automazione:

var target = UIATarget.localTarget(); 
target.delay(0.5) 
target.captureScreenWithName("screenshot1.png"); 

Ho creato una nuova applicazione di visualizzazione singola in Xcode (universale, obiettivo-c). Ho aggiunto un pulsante e un'etichetta con alcuni vincoli per il layout automatico nello storyboard.

ho aggiunto questo codice per aggiungere il pulsante giallo di programmazione:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIButton *b = [[UIButton alloc] init]; 
    b.backgroundColor = [UIColor yellowColor]; 
    [b setTitle:@"Extra" forState:UIControlStateNormal]; 
    [b setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.view addSubview:b]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTopMargin multiplier:1.0 constant:0.0]]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailingMargin multiplier:1.0 constant:0.0]]; 

    [self.view setNeedsUpdateConstraints]; 
    // Correction: - initially I used the line below, but that was wrong 
    // The problem is not solved with using setNeedsUpdateConstraints. 
    // [self.view updateConstraints]; 
} 

sto usando Xcode versione 7.1.1 (7B1005), il mio sistema operativo è El Capitan 10.11.1 (15B42). So che ha funzionato nelle versioni precedenti, perché io uso ui-screen-shooter per gli screenshot della mia app e ora i problemi si verificano e ha funzionato prima. Non è un problema con l'ui-screen-shooter, perché posso riprodurlo solo con l'automazione degli strumenti.

Cosa posso fare?

EDIT:

Una differenza tra i controlli in storyboard e quelli creati manualmente potrebbe essere l'ID oggetto, che si può vedere nella sorgente storyboard. Nel caso in cui questo fosse il problema, posso impostare il id per i controlli creati manualmente? (O è perso, una volta che la scena viene letto dallo storyboard?)

EDIT 2:

Presi tutte le proprietà degli elementi in vista del controller della vista (tramite objc/runtime) e confrontato i valori delle proprietà dei due pulsanti. Ci sono piccole differenze: (non includerà elementi identici)

 
Button from Storyboard   | Manual Button 
----------------------------------------------------------------- 
"_defaultRenderingMode" = 2;  | "_defaultRenderingMode" = 1; 
text = Button;     | text = Extra; 
           | 
     (several position values slightly different) 
           | 
description contains:   | 
"autoresize = RM+BM;"   | 
           | backgroundColorSystemColorName = yellowColor; 

EDIT 3:

Una schermata dell'uscita di target.logElementTree():

target.logElementTree() output

EDIT 4:

ho aggiunto

[UIButton appearance].backgroundColor = [UIColor yellowColor]; 

e tutti i pulsanti ora hanno lo sfondo giallo, tuttavia, il pulsante "Extra" non è nello screenshot.

Io non sono concentrato principalmente sulla aspetto personalizzato.Ho anche provato

UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem]; 

quindi il pulsante è proprio come i tipici pulsanti blu. Ancora il pulsante non appare nello screenshot dell'automazione.

EDIT 5:

Nel caso in cui sia rilevante: Posso accedere ai controlli dallo script di automazione e fare rubinetti - per esempio (da un'altra applicazione, non questo codice di prova):

target.frontMostApp().mainWindow().buttons()[25].tap() 

I tocchi vengono elaborati, quindi lo script di automazione può accedere ai controlli.

EDIT 6: Ho creato un bug report nel sistema di segnalazione di bug di Apple. Se riesci a riprodurlo, potrebbe essere bello fare lo stesso (almeno questo è il modo in cui ho compreso l'uso previsto del bug reporting su Apple).

EDIT 7: (grazie a quellish per la risposta - elaborazione della mia prima ondata di pensieri qui :) Ho corretto un errore nel codice - Ho chiamato [self.view updateConstraints];, ma dovrebbe essere [self.view setNeedsUpdateConstraints];. Tuttavia, ciò non ha avuto alcuna influenza sui risultati dello screenshot dell'automazione.

Mi chiedevo se i vincoli sono stati aggiornati e le chiamate registrate a updateViewConstraints e alcune altre. Ecco come viene registrato mentre l'applicazione sta caricando:

viewDidLoad 
viewWillAppear 
updateViewConstraints 
viewWillLayoutSubviews 
viewWillLayoutSubviews 
viewDidAppear 

Così, quando ho aggiungere il pulsante ed i vincoli in viewDidLoad, e updateViewConstraints si chiama, presumo che tutti i vincoli sono risolte quando viewDidAppear si chiama.

ho fatto un test rapido utilizzando questo viewDidAppear: (Non ancora sicuro, se questo è il modo di andare - Ho poca esperienza con l'accessibilità.)

_extraButton.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(_extraButton.frame, self.view); 

L'automazione schermata rimane bianca.

È interessante tuttavia che nell'albero degli elementi la porzione di schermata del pulsante aggiuntivo mostra la posizione corretta. Quindi suppongo che l'automazione abbia preso la posizione corretta.

+0

Si prega di aggiornare la domanda con l'output da 'logElementTree()'. – quellish

+0

@quellish Lo ha fatto - quando seleziono la linea con il pulsante "Extra", la piccola schermata di quel pulsante è mostrata sulla destra. La regione corrisponde, ma il pulsante non è lì.Nello screenshot del simulatore il pulsante ha il colore del testo bianco. Tuttavia, nelle app che alla fine voglio "screenshoot" gli elementi hanno il colore del testo nero ma il testo non è visibile nello screenshot degli strumenti. –

+0

È quasi certamente un problema di temporizzazione. Riesci a vedere un comportamento diverso se utilizzi UIAsembra per modellare il pulsante? – quellish

risposta

0

Il problema riscontrato è dovuto a diversi fattori. Come affermato nella sua interrogazione, il problema è che:

  • screenshot UIAutomation non includeranno il pulsante in stile determinato il progetto di test è stata inclusa e lo script di automazione.

In condizioni diverse si vede comportamento diverso:

  • Quando il pulsante viene creata un'istanza tramite pennino o storyboard il problema non si verifica, solo quando il tasto viene dichiarato e ha aggiunto alla gerarchia vista nel codice (in particolare, viewDidLoad del controller di visualizzazione).

  • Il pulsante appare negli screenshot di UIAutomation quando viene eseguito nelle versioni precedenti di iOS (ad esempio iOS 8).

Detto questo, se si rimuovono le vincoli aggiunto viewDidLoad vedrete il pulsante in stile iniziano a comparire in screenshots. Questo dovrebbe essere un suggerimento: i vincoli fanno parte del problema.

Quando i vincoli di risoluzione del motore di layout tenta di eseguire il lavoro il più possibile nei batch, vincoli coalescenti per le prestazioni. Quando il pulsante e i vincoli sono descritti in un pennino o in uno storyboard, il motore dei vincoli li otterrà tutti in una volta e molto prima nel ciclo di vita della gerarchia della vista. Per questo motivo i passaggi del processo di layout possono essere ottimizzati in modo significativo.

Quando un vincolo viene aggiunto in seguito nel ciclo di vita della gerarchia della vista, tuttavia, i vincoli devono essere rivalutati. Pensa ai vincoli aggiunti che vengono aggiunti a una coda e il motore di layout li rivaluterà la prossima volta che la coda è "piena". UIAutomation si aggancia alle API di UIAccessibility per fare ciò che è - e l'accessibilità potrebbe non sapere o preoccuparsi di ciò che sta accadendo al layout della rappresentazione visiva. La rappresentazione visiva può cambiare, ma non in un modo che influisce sull'accessibilità, e quindi sulla visione di UIAutomation del mondo.

iOS 9 ha cambiato diverse cose su come funziona il processo di layout sotto il cofano, motivo per cui ora stai vedendo questo problema.

Ci sono una serie di corsi di azione che si può prendere:

  • Costruisci il tuo vista della gerarchia in un pennino o storyboard. Questo ti porterà l'esperienza più consistente e ha prestazioni e altri vantaggi.

  • Utilizzare l'API di accessibilità per suggerire che la posizione (riquadro di accessibilità) del pulsante è cambiata dopo il passaggio di layout. Sfortunatamente è comunque probabile che UIAutomation venga catturato mentre è in corso il layout, a meno che l'accessibilità, la visibilità o l'interazione dell'utente non vengano disabilitate fino al completamento del layout.

  • Invece di un ritardo arbitrario nello script di automazione, utilizzare i timeout di UIAutomation in modo efficace per attendere che l'elemento diventi disponibile. Questo è covered in the documentation ed è una buona pratica. Rendilo non disponibile o non valido fino al completamento del layout.

Utilizzando questi metodi sono riuscito a ottenere facilmente il progetto di esempio per non riprodurre il problema che si sta verificando. Alcune o tutte queste soluzioni potrebbero essere appropriate per il tuo progetto o meno.

+0

Grazie per la risposta - Devo pensare ai dettagli - alcuni non hanno ancora senso per me. Azioni 1) Costruire l'interfaccia utente solo nello storyboard/pennino (set variabile di controlli, ecc.) Azioni 2) Devi pensarci. Azioni 3) Sicuramente li guarderò. –

+0

Ho assegnato la taglia adesso perché altrimenti scadrà. –

0

Probabilmente il problema con Strumenti di automazione non verrà risolto.

Soluzione parte 1: "Xcode 7 UI Tests" è la nuova "Instruments Automation".

Soluzione 2: fastlane/snapshot è il nuovo ui-screen-shooter. (lo sparatutto su schermo è stato deprecato dal suo autore e raccomanda di passare a fastlane/istantanea.)

Quindi passerò a fastlane/istantanea e il mio problema si spera possa essere risolto.