2012-01-13 3 views
5

Ho una visione con la seguente struttura:Come UIAutomation determinare se un UIAElement.isVisible()

GrandView 
-Parent View1 
-Parent View2 
--Child View1 
--Child View2 

vista Il bambino occupano quasi tutti i limiti della Parent View2, ma c'è ancora un po 'di spazio intorno i bordi. Posso selezionare Parent View2 nel simulatore con l'ispettore di accessibilità se clicco sui bordi. Posso anche toccare Parent View2 in UIAutomation se uso:

tapWithOptions({tapOffset:{x:0.15, y:0.95}}); 

Tuttavia, le mie chiamate a isVisible() restituiscono sempre 0. Mi aspetto che se riesco a toccare l'elemento, o selezionarlo con l'ispettore di accessibilità, dovrebbe restituire 1.

In che modo UIAutomation determina se è visibile un UIAElement?

risposta

0

Se si tratta di un UIView, è necessario utilizzare la proprietà hidden. Se non è una vista, ed è un contenitore, dovrebbe essere guidato da accessibilityElementsHidden.

In generale, tuttavia, non si desidera utilizzarlo per UIAutomation. Invece, qualunque cosa avresti intenzione di fare sulla vista - in questo caso, toccare() - andare avanti e farlo, e lasciare che il sistema genera un errore se scade. In generale, questo è il modello che si desidera seguire negli script piuttosto che verificare se prima è disponibile qualcosa. Sine UIAutomation è DOM che esegue lo scripting delle informazioni di accessibilità UIA, quando cose come le transizioni della vista animata accadono, le cose vanno fuori sincrono. A volte lo script viene eseguito più velocemente rispetto all'animazione dell'interfaccia utente, e talvolta il contrario! waitForInvalid potrebbe essere una scorciatoia per una soluzione per te.

La libreria tuneup.js di Alex Vollmer per UIAutomation semplifica notevolmente i test di scrittura ed è facile da estendere. https://github.com/alexvollmer/tuneup_js

+0

Lo vedo guidato da cose diverse da 'hidden' e' accessibilityElementsHidden', come implicito nella mia domanda. Voglio affermare sulla proprietà 'isVisible()' per garantire che un contenitore sia presente senza dover controllare il contenuto del contenitore, che potrebbe cambiare. –

0

Ogni operazione eseguita su un elemento ha un timeout. Questo non è evidente dalla documentazione di Apple, ma se si guarda: setTimeout, ci dice:

Il valore di timeout stabilisce un periodo di grazia per la risoluzione oggetto. Se un oggetto che rappresenta un elemento dell'interfaccia utente diventa disponibile entro il periodo di prova, viene effettuato un tentativo di creare un'istanza dell'oggetto dalle informazioni conservate dallo strumento.

setTimeout cambia solo il valore predefinito (come premere e pop). Quello che vuoi veramente è eseguire la tua azione sulla tua vista, e fallire il timeout se non è mai disponibile (il timeout predefinito è 5 secondi).
La sessione WWDC 2010 "Automatizzare il test dell'interfaccia utente con gli strumenti" fa un po 'di spazio, è disponibile nella pagina ADC WWDC 2010, con video e diapositive. Nel tuo caso, vorrai eseguire il tocco() sulla tua vista. Se, per qualche motivo, quella vista non è disponibile per UIAutomation entro 5 secondi, dovresti vedere un'eccezione.
Esperimento con cambiando il timeout facendo:

var oldTimeout = target.timeout(); target.pushTimeout(10);

prima del tuo codice e

target.popTimeout(oldTimeout);

dopo.

+0

Ma ancora, non riesco a eseguire un 'tap()' sulla mia vista. Posso solo eseguire un 'tapWithOptions()', come ho menzionato nella mia domanda. Tuttavia, non voglio 'tap()' my view perché avvierà azioni a cui non mi importa. Voglio solo sapere che è presente e toccabile. –

+0

Quindi, anziché toccare(), accedere a un metodo come nome(). Di nuovo, stai aspettando che l'azione scada. Quello che stai davvero cercando è "questa vista è disponibile entro questo periodo di timeout". Se la chiamata a name() è scaduta, non è disponibile. Se la visualizzazione richiederà più di 5 secondi per diventare disponibili, usa pushTimeout e popTimeout per estendere il timeout. Quel funzionamento di tapWithOptions non è una sorpresa, la vista è presente ma non ancora disponibile per l'automazione come parte della sua gerarchia (ad esempio la risoluzione dell'oggetto non è ancora stata eseguita) – quellish

+0

Cosa intendi con "la risoluzione dell'oggetto non è ancora stata eseguita"? –