2015-10-01 15 views
9

Uno dei miei schermi ha più campi di testo, posso arrivare a questa schermata da diversi altri schermi. In ogni caso sto facendo uno o un altro campo di testo come primo risponditore. Non sono in grado di scrivere test per determinare se il campo di testo desiderato è attivo o meno.C'è un modo per scoprire se XCUIElement è attivo o no?

Quando stampo il campo di testo in consolle -

uscita: { TextField 0x131171d40: tratti: 146031247360, focalizzata, {{6,0, 108,3}, {402,0, 35,0}}, il valore: }

Ma non sono riuscito a trovare alcuna proprietà focus/isFocus su XCUIElement.

C'è un modo per raggiungere questo obiettivo?

+0

XCUIElement sembra derivare alcune delle sue proprietà dalle caratteristiche di accessibilità, ma non espone necessariamente i tratti. Hai provato la proprietà 'selected' per vedere se questo ti dà quello che vuoi? –

+0

La proprietà 'selected' sta restituendo false/nil per i miei campi di testo. – Sandy

+0

C'è una proprietà 'hasKeyboardFocus', per favore vedi la mia risposta qui sotto. –

risposta

0

Non so ma forse selected proprietà su XCUIElement è quello che stai cercando. Provalo.

+1

Non ha funzionato. Restituisce false/nil per i campi di testo nel mio caso. – Sandy

0

C'è un metodo su NSObject tramite un extension (da UIAccessibility.h), che è disponibile su XCUIElement chiamato accessibilityElementIsFocused(), ma sembra di non tornare true anche quando la debugDescription di quell'elemento dice chiaramente Focused. Esistono altri metodi correlati accessibilityElementDidLoseFocus() e accessibilityElementDidBecomeFocused(), che sembrano essere sovrascritti da una sottoclasse di NSObject per ricevere notifiche delle modifiche allo stato Focused.

Dopo questo scavo, sono propenso a dire che la nozione di Focused di cui stiamo discutendo non è la stessa dello stato firstResponder, che probabilmente è quello che speri di sapere. Credo che a questo punto la messa a fuoco indichi che l'elemento è al centro di alcune tecnologie assistive come VoiceOver, basate su alcuni dei commenti per questi metodi.

Se si vuole sapere se un articolo è firstResponder direttamente, penso che a questo punto sia il momento di presentare una segnalazione di errore.

Se c'è un modo di interagire direttamente con la tastiera software, una soluzione hacky potrebbe essere quella di ottenere un XCUIElement per la vostra UITextField e confrontare il value del vostro elemento UITextField prima e dopo aver digitato con la tastiera (si consiglia di digitare un personaggio poi un backspace). Detto questo, non sono riuscito a capire come ottenere direttamente la tastiera in un tentativo superficiale.

+0

Bug archiviato 22952605. – Sandy

0

ho osservato alcuni casi in cui

XCUIApplication().textFields[{index/identifier}].selected 

non restituisce vero anche quando ho avuto il mio cursore incentrato sul campo di testo, ma ero in grado di inserire il testo con .typeText(). Tuttavia, .enabled restituisce correttamente true, appare il valore 'enabled' indica che l'elemento dell'interfaccia utente ha accessibilità abilitata ed è possibile interagire con esso.

Non una soluzione pulita, ma si può provare,

XCUIApplication().textFields.elementMatchingPredicate("predicate") 

o .elementMatchingType() per ottenere XCUIElement e scrivere il blocco di prova durante la manipolazione della condizione di eccezione con guard dichiarazione di gettare errore appropriato se il textField non viene trovato.

+2

'enable' non aiuterà qui. Abilita dice - Se l'elemento è abilitato o meno per l'interazione dell'utente. Nessuno del mio campo testo è in stato disabilitato. Hai ricevuto la mia domanda? Stavo chiedendo come posso convalidare se il mio campo di testo è il primo risponditore. – Sandy

+0

copia quello. Dalla tua domanda, ho letto il tuo obiettivo è stato quello di determinare se il campo di testo è attivo o meno in modo da poter interagire con esso. Nel caso in cui si voglia verificare il primo risponditore corrente da UIView è l'elemento UITextField previsto, si puoi controllare questo link Gist (https://gist.github.com/steipete/8737196). Una soluzione alternativa potrebbe essere quella di ottenere il titolo UIView del primo risponditore in modo che corrisponda al titolo del campo di testo previsto e scrivere il test condizionale. – Sushant

14

io po 'in ritardo per la festa :) Comunque, per quanto posso vedere da un dumping del XCUIElement variabile che ha una proprietà interessante:

nome della proprietà: hasKeyboardFocus

tipo di proprietà: TB, R

modo da poter controllare se il vostro elemento è attivo nel seguente modo:

let hasFocus = (yourTextField.value(forKey: "hasKeyboardFocus") as? Bool) ?? false 

NB: è possibile scaricare le variabili di proprietà di qualsiasi sublass NSObject con seguenti estensioni:

extension NSObject { 
    func dumpProperties() { 
     var outCount: UInt32 = 0 

     let properties = class_copyPropertyList(self.dynamicType, &outCount) 
     for index in 0...outCount { 
      let property = properties[Int(index)] 
      if nil == property { 
       continue 
      } 
      if let propertyName = String.fromCString(property_getName(property)) { 
       print("property name: \(propertyName)") 
      } 
      if let propertyType = String.fromCString(property_getAttributes(property)) { 
       print("property type: \(propertyType)") 
      } 
     } 
    } 
} 
+1

Scoperta fantastica, grazie per aver risposto con questa risposta! – Patrick

+1

geniale risposta! se ti piace aspettare elemento con focus usa solo predicato e aspettativa 'lascia focusPredicate = NSPredicate (formato:" esiste == true && hasKeyboardFocus == true ")' – user3292998

+0

Trova eccellente !! La documentazione di Apple afferma "Il protocollo XCUIElementAttributes, come adottato da XCUIElement, fornisce proprietà aggiuntive per interrogare lo stato corrente degli attributi di un elemento dell'interfaccia utente." Quel protocollo ha una variabile 'hasFocus', tuttavia quando si tenta di usarlo effettivamente, si ottiene "XCUIElement non ha un membro 'hasFocus'" messaggio da xcode. Grazie ancora! –