2015-10-01 7 views
9

मेरी स्क्रीन में से एक में कई टेक्स्ट फ़ील्ड हैं, मैं इस स्क्रीन पर विभिन्न अन्य स्क्रीन से उतर सकता हूं। प्रत्येक मामले में मैं पहले उत्तरदाता के रूप में एक या एक और पाठ फ़ील्ड बना रहा हूं। मैं यह निर्धारित करने के लिए परीक्षण लिखने में सक्षम नहीं हूं कि वांछित टेक्स्टफिल्ड पर ध्यान केंद्रित किया गया है या नहीं।क्या यह पता लगाने का कोई तरीका है कि XCUIElement पर ध्यान केंद्रित किया गया है या नहीं?

जब मैं कंसोल में पाठ फ़ील्ड प्रिंट -

आउटपुट: { TextField 0x131171d40: लक्षण: 146,031,247,360, केंद्रित, {{6.0, 108.3} {402.0, 35.0}}, मूल्य: }

लेकिन मुझे XCUIElement पर कोई फोकस/isFocus प्रॉपर्टी नहीं मिली।

क्या यह हासिल करने का कोई तरीका है?

+0

XCUIElement पहुंच लक्षण से उसके गुण से कुछ प्राप्त करने के लिए लगता है, लेकिन जरूरी नहीं कि लक्षण का खुलासा नहीं करता। क्या आपने यह देखने के लिए 'चयनित' संपत्ति का प्रयास किया है कि क्या आपको वह चाहिए जो आप चाहते हैं? –

+0

'चयनित' संपत्ति मेरे टेक्स्ट फ़ील्ड के लिए झूठी/शून्य लौट रही है। – Sandy

+0

संपत्ति 'हैकीबोर्ड फोकस' है, कृपया मेरा उत्तर देखें। –

उत्तर

0

मुझे नहीं पता लेकिन selectedXCUIElement पर संपत्ति जो आप खोज रहे हैं। कोशिश करो।

+1

काम नहीं किया। यह मेरे मामले में टेक्स्ट फ़ील्ड के लिए झूठी/शून्य लौट रहा है। – Sandy

0

एक extension (UIAccessibility.h से) है, जो XCUIElementaccessibilityElementIsFocused() नामित पर उपलब्ध है के माध्यम से NSObject पर एक विधि नहीं है, लेकिन ऐसा नहीं लौटने के लिए true भी जब उस तत्व की debugDescription स्पष्ट रूप से कहते हैं Focused लगता है। accessibilityElementDidLoseFocus() और accessibilityElementDidBecomeFocused() कुछ अन्य संबंधित विधियां हैं, जो स्थिति में परिवर्तनों की अधिसूचना प्राप्त करने के लिए NSObject के उप-वर्गों द्वारा ओवरराइड किए जाने वाले विधियों के रूप में दिखाई देती हैं।

इस खुदाई के बाद मैं यह कहने के इच्छुक हूं कि Focused की धारणा है कि हम चर्चा कर रहे हैं firstResponder राज्य जैसा नहीं है, जो शायद आप जो जानना चाहते हैं। मुझे इस बिंदु पर विश्वास है कि फोकस इंगित करता है कि तत्व इन विधियों के लिए कुछ टिप्पणियों के आधार पर VoiceOver जैसी कुछ सहायक तकनीक का केंद्र है।

यदि आप यह बताने में सक्षम होना चाहते हैं कि कोई आइटम firstResponder है, तो मुझे लगता है कि इस समय एक बग रिपोर्ट दर्ज करने का समय है।

अगर वहाँ सॉफ्टवेयर कीबोर्ड के साथ सीधे बातचीत करने के लिए एक तरीका है, एक hacky वैकल्पिक हल से पहले और कीबोर्ड के साथ लिखने के बाद अपने UITextField के लिए एक XCUIElement हो और अपने UITextField तत्व की value तुलना करने के लिए हो सकता है (यदि आप लिखना चाहते हैं एक चरित्र तो एक बैकस्पेस)। ऐसा कहकर, मैं यह नहीं समझ पाया कि कीबोर्ड को सीधे एक सरसरी प्रयास में कैसे प्राप्त किया जाए।

+0

दायर की गई बग 22952605. – Sandy

0

मैं कुछ उदाहरणों जहां

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

सच वापस नहीं करता है यहां तक ​​कि जब मैं अपने कर्सर पाठ क्षेत्र पर ध्यान केंद्रित किया था, लेकिन मैं .typeText() साथ पाठ दर्ज करने में सक्षम था देखा है। हालांकि, .enabled सही ढंग से सत्य लौटाता है, ऐसा लगता है कि 'सक्षम' मान दर्शाता है कि UI तत्व में पहुंच क्षमता सक्षम है और आप इसके साथ बातचीत कर सकते हैं।

नहीं एक साफ समाधान लेकिन आप कोशिश कर सकते हैं,

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

या .elementMatchingType() XCUIElement हो और जबकि guard बयान के साथ अपवाद हालत से निपटने उपयुक्त त्रुटि फेंक अगर पाठ फ़ील्ड नहीं मिला है अपने परीक्षण ब्लॉक लिखने के लिए।

+2

'सक्षम' यहां सहायता नहीं करेगा। सक्षम करें - उपयोगकर्ता इंटरैक्शन के लिए तत्व सक्षम है या नहीं। मेरी कोई भी टेक्स्ट फ़ील्ड विकलांग राज्य में नहीं है। क्या आपको मेरा प्रश्न मिला? मैं पूछ रहा था कि अगर मेरा टेक्स्टफिल्ड पहला उत्तरदाता है तो मैं कैसे मान्य कर सकता हूं। – Sandy

+0

इसकी प्रतिलिपि बनाएँ। आपके प्रश्न से, मैंने आपका उद्देश्य यह निर्धारित करना था कि टेक्स्टफील्ड पर ध्यान केंद्रित किया गया है या नहीं, ताकि आप इसके साथ बातचीत कर सकें। यदि आप UIView से वर्तमान पहले उत्तरदाता को सत्यापित करना चाहते हैं तो आपका अपेक्षित यूआईटीएक्स्टफ़िल्ल्ड तत्व है, आप इस जिस्ट लिंक (https://gist.github.com/steipete/8737196) देख सकते हैं। आपके उत्तरदायी टेक्स्ट फ़ील्ड शीर्षक से मेल खाने और अपना सशर्त परीक्षण लिखने के लिए पहला उत्तरदाता UIView शीर्षक प्राप्त करने के लिए एक हैकी वर्कअराउंड हो सकता है। – Sushant

14

मैं थोड़ा पार्टी के लिए देर से :) हालांकि जहाँ तक मैं चर XCUIElement यह एक दिलचस्प संपत्ति है डंपिंग से देख सकते हैं:

संपत्ति नाम: hasKeyboardFocus

संपत्ति के प्रकार: टीबी, आर

तो तुम देख सकते हैं कि आपके तत्व निम्नलिखित तरीके से ध्यान केंद्रित किया है:

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

एनबी: आप निम्नलिखित एक्सटेंशन के साथ कोई NSObject sublass की संपत्ति चर डंप कर सकते हैं:

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

शानदार खोज, इस उत्तर का जवाब देने के लिए धन्यवाद! – Patrick

+1

शानदार जवाब! यदि आप फोकस के साथ तत्व के लिए इंतजार करना चाहते हैं तो बस भविष्यवाणी और उम्मीद का उपयोग करें 'फोकस करें भविष्यवाणी = एनएसपीडिकेट (प्रारूप: "मौजूद == सत्य और&KeyboardFocus == सत्य") ' – user3292998

+0

उत्कृष्ट खोज !! ऐप्पल के प्रलेखन में कहा गया है "XCUIElementAttributes प्रोटोकॉल, जैसा कि XCUIElement द्वारा अपनाया गया है, यूआई तत्व के गुणों की वर्तमान स्थिति को पूछताछ के लिए अतिरिक्त गुण प्रदान करता है।" उस प्रोटोकॉल में 'हैसफोकस' चर है, हालांकि वास्तव में इसका उपयोग करने का प्रयास करते समय, आपको "XCUIElement का कोई सदस्य नहीं है" xcode से संदेश है। एक बार फिर धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे