2015-10-01 5 views
9

Einer meiner Bildschirm hat mehrere Textfelder, ich kann auf diesem Bildschirm von verschiedenen anderen Bildschirmen landen. In jedem Fall mache ich das ein oder andere Textfeld als Ersthelfer. Ich bin nicht in der Lage, Test zu schreiben, um zu bestimmen, ob der gewünschte textField Fokus hat oder nicht.Gibt es eine Möglichkeit zu finden, ob das XCUIElement den Fokus hat oder nicht?

Wenn ich das Textfeld in der Konsole drucken -

Ausgang: { TextField- 0x131171d40: Züge: 146031247360, Konzentriert, {{6.0, 108.3}, {402,0, 35,0}}, Wert: }

Aber ich konnte keine Fokus/IsFocus-Eigenschaft auf XCUIElement finden.

Gibt es einen Weg, dies zu erreichen?

+0

XCUIElement scheint einige seiner Eigenschaften von Zugänglichkeitseigenschaften abzuleiten, ist aber nicht unbedingt aussetzen die Merkmale: Sie können die Eigenschaft Variablen beliebigen NSObject sublass mit folgenden Erweiterungs Dump kann. Haben Sie die Eigenschaft 'selected' ausprobiert, um zu sehen, ob Sie das bekommen, was Sie wollen? –

+0

'ausgewählte' Eigenschaft gibt false/nil für meine textFields zurück. – Sandy

+0

Es gibt Eigenschaft 'hasKeyboardFocus', siehe meine Antwort unten. –

Antwort

0

Ich weiß nicht, aber vielleicht selected Immobilien auf XCUIElement ist, was Sie suchen. Versuch es.

+1

Hat nicht funktioniert. Es gibt false/nil für textFields in meinem Fall zurück. – Sandy

0

Es gibt ein Verfahren auf NSObject über eine extension (von UIAccessibility.h), die auf XCUIElement verfügbar ist accessibilityElementIsFocused() genannt, aber es scheint nicht true selbst zurückzukehren, wenn die debugDescription dieses Element eindeutig Focused sagt. Es gibt ein paar andere verwandte Methoden accessibilityElementDidLoseFocus() und accessibilityElementDidBecomeFocused(), die anscheinend Methoden sind, die von einer Unterklasse von NSObject überschrieben werden sollen, um über Änderungen des Focused-Status benachrichtigt zu werden.

Nach diesem Graben bin ich geneigt zu sagen, dass der Begriff Focused, den wir diskutieren, ist nicht das gleiche wie der firstResponder Zustand, der wahrscheinlich ist, was Sie hoffen zu wissen. Ich glaube an diesem Punkt, dass Fokus darauf hinweist, dass das Element der Fokus einiger assistiver Technologien wie VoiceOver ist, basierend auf einigen der Kommentare für diese Methoden.

Wenn Sie in der Lage sein zu sagen, ob ein Element firstResponder direkt ist, denke ich, an dieser Stelle ist es Zeit, einen Fehlerbericht zu archivieren.

Wenn es eine Möglichkeit, direkt mit der Software-Tastatur zu interagieren, eine Hacky Abhilfe könnte sein, eine XCUIElement für Ihre UITextField zu erhalten und die value Ihres UITextField Element zu vergleichen, bevor und nachdem er mit der Tastatur eingeben (Sie geben können möchten ein Zeichen dann eine Rücktaste). Nachdem ich das gesagt hatte, konnte ich nicht herausfinden, wie man die Tastatur in einem flüchtigen Versuch direkt zu bekommen.

+0

Filed Bug 22952605. – Sandy

0

Ich habe einige Fälle beobachtet, in denen

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

nicht wahr, auch nicht zurück, wenn ich meinen Cursor auf dem Textfeld fokussiert hatte, aber ich war in der Lage Text mit .typeText() einzugeben. .enabled gibt jedoch korrekt zurück. Der Wert 'aktiviert' gibt an, dass das Oberflächenelement aktiviert ist und Sie mit ihm interagieren können.

keine saubere Lösung, aber man kann versuchen,

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

oder .elementMatchingType() zu XCUIElement erhalten und Ihren Testblock schreiben, während die Ausnahmebedingung mit guard Anweisung Umgang mit entsprechenden Fehler zu werfen, wenn das Textfeld nicht gefunden wird.

+2

"aktivieren" wird hier nicht helfen. Enable Tells - Gibt an, ob das Element für die Benutzerinteraktion aktiviert ist. Keines meiner TextField ist im deaktivierten Zustand. Hast du meine Frage bekommen? Ich habe gefragt, wie ich überprüfen kann, ob mein TextField der Ersthelfer ist. – Sandy

+0

Kopieren Sie das.Von Ihrer Frage habe ich gelesen, dass Ihr Ziel war zu bestimmen, ob das Textfeld Fokus hat oder nicht, so dass Sie damit interagieren können. Wenn Sie den aktuellen Ersthelfer aus der UIView überprüfen möchten, ist Ihr erwartetes UITextField-Element kann diesen wichtigen Link überprüfen (https://gist.github.com/steipete/8737196). Ein hacky Workaround könnte sein, den UIView-Titel des ersten Responders mit dem erwarteten textField-Titel abzugleichen und den bedingten Test zu schreiben. – Sushant

14

ich wenig spät für die Partei :) Aber soweit ich von Dumping die Variable XCUIElement es eine interessante Eigenschaft hat sehen können:

Eigenschaftsname: HasKeyboardFocus

Objekttyp: TB,

R

So können Sie überprüfen, ob Ihr Element die folgende Art und Weise den Fokus besitzt:

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

NB:

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

Fantastischer Fund, danke für die Antwort mit dieser Antwort! – Patrick

+1

brillante Antwort! Wenn Sie auf Elemente mit Fokus warten möchten, verwenden Sie einfach Prädikat und Erwartung 'let focusPredicate = NSPredate (format:" exists == true && hasKeyboardFocus == true ")' – user3292998

+0

Exzellenter Fund !! In der Dokumentation von Apple heißt es: "Das XCUIElementAttributes-Protokoll, das von XCUIElement übernommen wurde, bietet zusätzliche Eigenschaften für die Abfrage des aktuellen Status der Attribute eines UI-Elements." Dieses Protokoll hat eine "hasFocus" -Variable. Wenn Sie jedoch versuchen, dieses zu verwenden, erhalten Sie die Nachricht "XCUIElement hat kein Mitglied 'hasFocus'" von xcode. Danke noch einmal! –

Verwandte Themen