2016-04-22 6 views
22
के लिए जिम्मेदार बताते हैं

Xcode (7.2 और 7.3) में यूआई परीक्षण, मेरे परीक्षण कभी कभी एक नहीं बल्कि सामान्य त्रुटि के साथ विफल जब:अभिकथन विफलता: यूआई परीक्षण विफलता - विफलता प्राप्त कर रहा है तत्व

Assertion Failure: UI Testing Failure - Failure fetching attributes for element

मैं के लिए करते हैं किसी तत्व पर .hittable या .tap() पर कॉल करते समय यह त्रुटि प्राप्त करें लेकिन मैं क्यों नहीं बता सकता। मैंने जांच की है कि जिन तत्वों से मैं सभी के साथ काम कर रहा हूं उनमें उनकी पहुंच-योग्यता सेटिंग सही तरीके से सेटअप की गई हैं और किसी भी कंटेनर दृश्य में वे एक्सेसिबिलिटी सक्षम नहीं हैं। हां, यह समस्या को हल करने के लिए प्रतीत नहीं होता है।

कंसोल लॉग का पता चलता है:

UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x7e68ae50> pid: 89032, context: 4D9272C7-3024-4062-B0FA-E16EF426F17A, payload: { 
    pid = 89032; 
    "uid.elementID" = 1432; 
    "uid.elementOrHash" = 2125772976; 
}: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202} 

मैं कोशिश की चारों ओर खोज की है और यह पहले से ही लॉग ऑन किया गया है खोज करने में कामयाब लेकिन कोई मौजूदा समाधान (radar link) Xcode 7.3 के लिए भी प्रतीत होता है।

ऐसा लगता है कि मैं सिम्युलेटर/उपकरण पुन: प्रारंभ कभी कभी अगर इस त्रुटि नहीं होता है, लेकिन यह एक अच्छा समाधान नहीं है।

+0

मेरे पास भी वे थे। उम्मीदों को सही ढंग से सेट करना सुनिश्चित करें ताकि आपका दृश्य पदानुक्रम उस राज्य तक पहुंच जाए जिसे आप परीक्षण करने का प्रयास कर रहे हैं। एसिंक्रोनस घटनाओं का परीक्षण करते समय यह बेहद महत्वपूर्ण है (यानी एक बटन टैप करना जो नेटवर्क कॉल के बाद प्रतिक्रिया देता है)। –

+0

यह ऐप्पल की बग है जिसे आप ऐप्पल के [लिंक] (https://forums.developer.apple.com/thread/6437) में भी दिखा सकते हैं। यहां कुछ लोग सुझाव देते हैं कि कुछ समाधान आपके लिए काम कर सकते हैं। यदि कोई समाधान आपके लिए काम नहीं करता है तो ऐप्पल को एक बग की रिपोर्ट करें। हम इस तरह की स्थिति में कोई समाधान नहीं कर सकते या नहीं ढूंढ सकते हैं। – iMHitesh

+1

एक्सकोड 9 के रूप में, आप 'elementForExistence (टाइमआउट: टाइमइंटरवाल)' का उपयोग उस तत्व के अस्तित्व में आने के लिए प्रतीक्षा कर सकते हैं – onmyway133

उत्तर

2

ऐसा लगता है कि स्वचालन कोड कई बार होता है, और हालांकि अभिगम्यता पदानुक्रम के स्नैपशॉट में आपका तत्व होता है, आपकी क्वेरी अगले निर्देश पर बहुत तेजी से आगे बढ़ती है और ढांचे को कोई मौका नहीं मिलता है टैप() विधि पर कार्य करें जिसे आप भेज रहे हैं। मैं जो मैसिलोट्टी के helper functions का उपयोग करके इस त्रुटि को कम करने में सक्षम हूं ताकि पहले तत्वों को टिकाऊ होने की प्रतीक्षा कर सकें और फिर प्रश्न में तत्व को टैप करने से पहले नींद() जोड़ सकें। उम्मीद है कि यह मदद करता है।

+3

हाँ, यही वह है जो मैंने सोचा था कि यह पहले भी हो सकता है। हालांकि, मुझे अभी भी यह समस्या तब भी मिलती है जब जो की उपयोगी विधियों का उपयोग करते हुए भी 'नींद() 'के एक बुरा लेकिन उदार उपयोग के साथ मिलती है। मुझे लगता है कि इस तरह अभिगम्यता स्नैपशॉट अपनी वस्तुओं का संदर्भ देता है। मैंने इसे देखने में कई घंटे बिताए हैं और ऐसा लगता है कि कभी-कभी यह ट्रैक खो देता है और गलती से गलत अंतर्निहित UI तत्व का संदर्भ देता है। मैंने तत्वों के मेमोरी पतों को लॉग करके और स्नैपशॉट में उन लोगों को देखकर इसकी जांच की है और इसे कभी-कभी गलत अर्थ मिलता है कि गलत तत्व पर टैप() 'कहा जाता है, इसलिए त्रुटि। – Gordonium

+0

@ गॉर्डिनियम यदि आप इस बग को फाइल करने के लिए चारों ओर मिलता है, तो कृपया साझा करें :) – Citronex

4

आप अस्थायी रूप से XCUICoordinate.tap() को वैकल्पिक रूप से उपयोग कर सकते हैं। उदाहरण के लिए, button.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap() के साथ button.tap() को प्रतिस्थापित करें।

मैं एक ही मुद्दे में भाग गया, और कामकाज मेरे लिए काम करता है।

+0

अच्छा है। यह भी कोशिश करेंगे। अभी के लिए मैंने टैप() से पहले नींद (संख्याऑफ सेकेंड) का उपयोग किया था। –

3

मुझे यह समस्या है। यह एक फिक्स के बाद दिखाई दिया है, इसलिए मैंने यह पता लगाया है कि मेरे मामले में इसका कारण क्या हो सकता है।

मेरे ऐप में मेरे पास 'मुख्य' स्क्रीन है। यह सामग्री सर्वर से वापस आती है और डिवाइस पर कैश की जाती है। यह स्क्रीन उपयोगकर्ता को विभिन्न 'विस्तृत' स्क्रीन पर ले जाती है। प्रत्येक बार जब उपयोगकर्ता विस्तृत स्क्रीन से वापस जा रहा है, तो viewDidAppeare विधि मुख्य स्क्रीन पर कॉल की जाती है। इस विधि में मुख्य स्क्रीन सामग्री के लिए पूछता है। सामग्री प्रदान करने के लिए, 'डेटा मैनेजर' को या तो डीबी से लाने या सख्त क्रम में सर्वर 2 अलग-अलग इकाइयों से अनुरोध करने की आवश्यकता है, इसलिए यह dispatch_group का उपयोग करता है। मुख्य स्क्रीन dispatch_group_notify कॉल से नई सामग्री के बारे में अधिसूचना प्राप्त करती है, यही कारण है कि यह असीमित है। समय के लिए, जब dispatch_group_notify निष्पादित किया जाता है, viewDidAppeare समाप्त हो गया है, और जैसा कि मैं समझता हूं, ऐप कुछ छोटे समय के लिए निष्क्रिय हो जाता है। यूआई टेस्ट इंजन पहले ही एक्सेसिबिलिटी तत्व पेड़ बना सकता है।

इस स्थिति प्रक्रिया के दौरान और परीक्षण कोड मुख्य स्क्रीन पर कुछ तत्व सही होने के बाद दृश्य दिखाई दिया, पुराने पहुंच तत्वों का अस्तित्व (क्योंकि दृश्य पदानुक्रम है कि समय बदल गया है) मृत्यु पर tap कहता है, लेकिन tap विधि के साथ तत्व के लिए बुलाया गया था विशेष elementID, आदि जो उस समय मौजूद नहीं है। नतीजतन आप एक दुर्घटना है।

+0

'tl; dr' यूआई तत्वों को उसी 'accessibilityIdentifier' के साथ बहुत तेज़ी से स्वैप न करें। यदि आपने एक बटन बनाया है तो इसे पुन: उपयोग करें, इसे प्रतिस्थापित न करें। यह एक्सकोड 9 के साथ बहुत अधिक गंभीर लगता है। – arsenius

1

मुझे यह भी सामना करना पड़ा। मेरे मामले में, सर्वर त्वरित उत्तराधिकार में एकाधिक टाइपहेड खोज क्वेरी परिणामों को वापस कर रहा है।लक्ष्य तत्व जल्दी से पॉप अप करता है, लेकिन अंतिम क्वेरी तक लगातार टिकाऊ नहीं होता है। मैंने XCTWaiter के माध्यम से शुरुआत में पहली क्वेरी में तत्व के अस्तित्व की प्रतीक्षा करके इसे हल किया। फिर सभी प्रश्न परिणामों के समय को शामिल करने के लिए नींद डालें और उसके बाद तत्व को धब्बेदार होने का इंतजार करें। पहले क्वेरी परिणाम के लिए टिकाऊ उपयोग न करें क्योंकि यह असफल हो जाएगा क्योंकि धब्बेदार भी जांचता है कि तत्वों को टैप किया जा सकता है, लेकिन यूआई तत्व को टैप करने के लिए बहुत तेज़ी से बदल रहा है।

बेहतर होगा यदि आप परीक्षण उद्देश्यों के लिए या कोड बेस के माध्यम से केवल अंतिम क्वेरी को ट्रिगर कर सकते हैं। मैंने कई टाइपहेड प्रश्नों से बचने के लिए यूआईपीएस्टबोर्ड का उपयोग करने पर भी विचार किया, लेकिन जहां तक ​​मैं कह सकता हूं, यह एक्ससीटीएस्ट के लिए उपलब्ध नहीं है।

0

मैंने http://masilotti.com/xctest-helpers/ से प्रतीक्षाफोर हिटेबल() की कोशिश की लेकिन मेरे मामले में मुझे टैप करने से पहले नींद (सेकंड) का उपयोग करना पड़ा।

प्लस, ऐसा नहीं लगता कि जो Masilotti के तरीके बेकार हैं। वे बहुत अच्छे हैं और मैंने विस्तार XCTest और एक्सटेंशन XCUIElement में उन्हें जोड़ा है। यह बस है कि WaitForHittable() मेरे ऐप लोड की मुख्य स्क्रीन के बाद पहले टैप पर काम नहीं करता था।

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