2015-11-28 7 views
6

मैं इंस्ट्रूमेंट्स ऑटोमेशन में एक स्क्रीनशॉट सहेज रहा हूं, लेकिन उस स्क्रीनशॉट में कुछ नियंत्रण गायब हैं। ऐसा लगता है कि प्रोग्रामेटिक रूप से जोड़े गए नियंत्रण "अनदेखा" हैं।इंस्ट्रूमेंट्स ऑटोमेशन स्क्रीनशॉट प्रोग्रामेटिक रूप से जोड़े गए नियंत्रणों को अनदेखा करता है

मैं इसे कैसे ठीक कर सकता हूं?

सिम्युलेटर में मैनुअल स्क्रीनशॉट: (पीला बॉक्स ध्यान दें)

Screenshot in Simulator with Yellow Button

स्क्रीनशॉट उपकरण में स्वचालन:

Screenshot in Instruments Automation without Yellow Button

स्वचालन स्क्रिप्ट:

var target = UIATarget.localTarget(); 
target.delay(0.5) 
target.captureScreenWithName("screenshot1.png"); 

मैंने एक्सकोड (सार्वभौमिक, उद्देश्य-सी) में एक नया एकल दृश्य अनुप्रयोग बनाया। मैंने स्टोरीबोर्ड में ऑटो लेआउट के लिए कुछ बाधाओं वाला एक बटन और एक लेबल जोड़ा।

मैं पीला बटन प्रोग्राम के रूप में जोड़ने के लिए इस कोड कहा:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIButton *b = [[UIButton alloc] init]; 
    b.backgroundColor = [UIColor yellowColor]; 
    [b setTitle:@"Extra" forState:UIControlStateNormal]; 
    [b setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self.view addSubview:b]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTopMargin multiplier:1.0 constant:0.0]]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailingMargin multiplier:1.0 constant:0.0]]; 

    [self.view setNeedsUpdateConstraints]; 
    // Correction: - initially I used the line below, but that was wrong 
    // The problem is not solved with using setNeedsUpdateConstraints. 
    // [self.view updateConstraints]; 
} 

मैं Xcode संस्करण 7.1.1 (7B1005) का उपयोग कर रहा है, मेरे ओएस एल कैप्टन 10.11.1 (15B42) है। मुझे पता है कि यह पिछले संस्करणों में काम करता था, क्योंकि मैं अपने ऐप के स्क्रीनशॉट के लिए ui-screen-shooter का उपयोग करता हूं और समस्याएं अब होती हैं और इससे पहले काम किया जाता है। यह यूई-स्क्रीन-शूटर के साथ कोई समस्या नहीं है, क्योंकि मैं इसे अकेले उपकरणों स्वचालन के साथ पुन: उत्पन्न कर सकता हूं।

मैं इसके बारे में क्या कर सकता हूं?

संपादित करें:

एक स्टोरीबोर्ड में नियंत्रण के बीच का अंतर और मैन्युअल रूप से बनाए गए ऑब्जेक्ट ID है, जो एक स्टोरीबोर्ड स्रोत में देख सकते हैं हो सकता है। यदि यह समस्या होगी, तो क्या मैं मैन्युअल रूप से बनाए गए नियंत्रणों के लिए id सेट कर सकता हूं? (या यह, खो दिया एक बार दृश्य स्टोरीबोर्ड से पढ़ रहा है?)

संपादित करें 2: (के माध्यम से ObjC/क्रम)

मैं दृश्य नियंत्रक के दृश्य में तत्वों के सभी गुण दिलवाया और संपत्ति मूल्यों की तुलना दो बटनों में से। वहाँ थोड़ा अंतर हैं: (समान प्रविष्टियाँ शामिल नहीं होंगे)

 
Button from Storyboard   | Manual Button 
----------------------------------------------------------------- 
"_defaultRenderingMode" = 2;  | "_defaultRenderingMode" = 1; 
text = Button;     | text = Extra; 
           | 
     (several position values slightly different) 
           | 
description contains:   | 
"autoresize = RM+BM;"   | 
           | backgroundColorSystemColorName = yellowColor; 

संपादित करें 3:

target.logElementTree() के उत्पादन का एक स्क्रीनशॉट:

target.logElementTree() output

संपादित करें 4:

मैंने

[UIButton appearance].backgroundColor = [UIColor yellowColor]; 
जोड़ा

और सभी बटनों में अब पीले रंग की पृष्ठभूमि है, हालांकि, "अतिरिक्त" बटन स्क्रीनशॉट में नहीं है।

मैं मुख्य रूप से कस्टम उपस्थिति पर केंद्रित नहीं हूं।मैंने

UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem]; 

भी कोशिश की ताकि बटन सामान्य नीले बटन की तरह हो। अभी भी बटन स्वचालन स्क्रीनशॉट में प्रकट नहीं होता है।

संपादित 5:

मामले में यह प्रासंगिक है: मैं स्वचालन स्क्रिप्ट से नियंत्रणों पर पहुंचने और नल कर सकते हैं - (एक और अनुप्रयोग, नहीं इस परीक्षण कोड से) उदाहरण के लिए:

target.frontMostApp().mainWindow().buttons()[25].tap() 

नलियां संसाधित की जाती हैं, इसलिए स्वचालन स्क्रिप्ट नियंत्रण तक पहुंच सकती है।

संपादित करें 6: मैंने ऐप्पल की बग्रेपोर्ट प्रणाली पर एक बग रिपोर्ट बनाई है। यदि आप इसे पुन: उत्पन्न कर सकते हैं, तो ऐसा करना अच्छा हो सकता है (कम से कम मैं एप्पल में बग रिपोर्टिंग के इच्छित उपयोग को समझता हूं)।

संपादित 7: (आपके उत्तर के लिए quellish के लिए धन्यवाद - यहां विचारों की मेरी पहली लहर प्रसंस्करण :) मैंने कोड में एक त्रुटि को सही किया - मैंने [self.view updateConstraints]; कहा, लेकिन यह [self.view setNeedsUpdateConstraints]; होना चाहिए। हालांकि, स्वचालन स्क्रीनशॉट परिणामों पर कोई प्रभाव नहीं पड़ा।

मैं सोच रहा था कि क्या बाधाओं को अद्यतन किया गया था और updateViewConstraints और कुछ अन्य लोगों को कॉल लॉग इन किया गया था।

viewDidLoad 
viewWillAppear 
updateViewConstraints 
viewWillLayoutSubviews 
viewWillLayoutSubviews 
viewDidAppear 

तो जब मैं viewDidLoad में बटन और बाधाओं जोड़ सकते हैं और updateViewConstraints कहा जाता है, मुझे लगता है है कि सभी बाधाओं जब viewDidAppear कहा जाता है निपटाया जाता है: यह है कि यह कैसे एप्लिकेशन लोड कर रहा है लॉग होता है है।

मैं viewDidAppear में इस का उपयोग करते हुए एक त्वरित परीक्षण किया: (अभी तक सुनिश्चित नहीं हैं, कि क्या यह जाने का रास्ता है - मैं पहुँच के साथ थोड़ा अनुभव है।)

_extraButton.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(_extraButton.frame, self.view); 

स्वचालन स्क्रीनशॉट सफेद बनी हुई है।

हालांकि यह दिलचस्प है कि तत्व पेड़ में अतिरिक्त बटन का स्क्रीनशॉट भाग सही स्थान दिखाता है। तो मुझे लगता है कि स्वचालन ने सही स्थिति उठाई है।

+0

) 'logElementTree से उत्पादन (' के साथ अपने प्रश्न अपडेट करें। – quellish

+0

@quellish यह था - जब मैं "अतिरिक्त" बटन के साथ लाइन का चयन करें, उस बटन के छोटे स्क्रीनशॉट सही पर दिखाया गया है। क्षेत्र मेल खाता है, लेकिन बटन वहां नहीं है।सिम्युलेटर स्क्रीनशॉट में बटन में सफेद टेक्स्ट रंग होता है। हालांकि, उन ऐप्स में जिन्हें मैं अंततः "स्क्रीनशूट" करना चाहता हूं, उनमें तत्वों का काला टेक्स्ट रंग होता है लेकिन पाठ स्क्रीनशॉट में पाठ दिखाई नहीं देता है। –

+0

यह लगभग निश्चित रूप से एक समय मुद्दा है। यदि आप बटन को स्टाइल करने के लिए यूआईपीपीरेंस का उपयोग करते हैं तो क्या आप अलग-अलग व्यवहार देखते हैं? – quellish

उत्तर

0

जो समस्या आप देख रहे हैं वह कई कारकों के कारण है। जैसा कि आपके प्रश्न में बताया गया है, आपकी समस्या यह है कि:

  • UIAutomation स्क्रीनशॉट में आपके द्वारा शामिल किए गए परीक्षण प्रोजेक्ट और स्वचालन स्क्रिप्ट दिए गए आपके स्टाइल बटन को शामिल नहीं किया जाएगा।

विभिन्न शर्तों के तहत आप अलग व्यवहार देखें:

  • जब बटन एक निब के माध्यम से instantiated या मुद्दा नहीं होती है स्टोरीबोर्ड है, केवल जब यह बटन की घोषणा की और है दृश्य पदानुक्रम को जोड़ा गया कोड में (विशेष रूप से, दृश्य नियंत्रक के viewDidLoad)।

  • आईओएस के पुराने संस्करणों (यानी आईओएस 8) में चलाए जाने पर बटन यूआईयूटोमेशन स्क्रीनशॉट में दिखाई देता है।

कहा, यदि आप बाधाओं को दूरviewDidLoad में जोड़ा आप स्टाइल बटन स्क्रीनशॉट में प्रदर्शन शुरू हो देखेंगे। यह एक संकेत होना चाहिए - बाधाएं समस्या का हिस्सा हैं।

जब लेआउट इंजन की कमी यह प्रदर्शन के लिए बाधाओं वालों बैचों में जितना संभव हो उतना काम करने के लिए, प्रयास करता सुलझाने। जब बटन और बाधाओं को निब या स्टोरीबोर्ड में वर्णित किया जाता है तो बाधा इंजन उन्हें एक साथ मिल जाएगा, और बहुत पहले दृश्य पदानुक्रम के जीवन चक्र में। इस वजह से लेआउट प्रक्रिया के चरणों को सुव्यवस्थित किया जा सकता है।

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

आईओएस 9 कैसे लेआउट प्रक्रिया हुड, जिसके कारण अब आप इस मुद्दे को देख रहे हैं के तहत काम करता के बारे में कई चीजें बदल दिया है।

कार्रवाई के पाठ्यक्रमों की एक संख्या हैं आप ले जा सकते हैं:

  • एक निब या स्टोरीबोर्ड में आपके विचार पदानुक्रम का निर्माण करें। यह आपको सबसे लगातार अनुभव मिलेगा और इसमें प्रदर्शन और अन्य फायदे होंगे।

  • संकेत है कि बटन की स्थिति (पहुँच फ्रेम) लेआउट पास करने के बाद बदल गया है पहुँच एपीआई का प्रयोग करें। दुर्भाग्यवश आप अभी भी लेआउट पूरा होने तक पहुंचने के दौरान UIAutomation इसे कैप्चर करने की संभावना रखते हैं जब तक कि पहुंच पूर्ण होने तक पहुंच, दृश्यता या उपयोगकर्ता इंटरैक्शन अक्षम नहीं हो जाता है।

  • अपने स्वचालन लिपि में एक मनमाना देरी के बजाय

    , UIAutomation प्रभावी रूप से टाइमआउट तत्व के लिए उपलब्ध होने के लिए प्रतीक्षा करने के लिए इस्तेमाल करते हैं। यह covered in the documentation है और यह एक सर्वोत्तम अभ्यास है। लेआउट पूरा होने तक इसे अनुपलब्ध या अमान्य बनाएं।

इन तरीकों मैं आसानी से अपने उदाहरण परियोजना समस्या आप देख रहे हैं पुन: पेश नहीं करने के लिए प्राप्त करने में सक्षम था का उपयोग करना। कुछ, या ये सभी समाधान आपकी परियोजना के लिए उपयुक्त हो सकते हैं - या नहीं।

+0

उत्तर के लिए धन्यवाद - मुझे विवरणों के बारे में सोचना है - कुछ अभी तक मुझे समझ में नहीं आता है। क्रियाएँ 1) स्टोरीबोर्ड/एनआईबी में यूआई का निर्माण केवल संभव नहीं है (नियंत्रण आदि का चर सेट) क्रियाएं 2) इसके बारे में सोचना है। क्रियाएं 3) मैं निश्चित रूप से इन पर ध्यान रखूंगा। –

+0

अब मुझे बक्षीस से सम्मानित किया गया क्योंकि यह अन्यथा समाप्त हो जाएगा। –

0

संभावना उपकरण स्वचालन के साथ समस्या तय नहीं किया जाएगा।

समाधान भाग 1: "Xcode 7 यूआई टेस्ट 'नई' उपकरण स्वचालन" है।

समाधान भाग 2: fastlane/snapshot नई ui-screen-shooter है। (यूई-स्क्रीन-शूटर को इसके लेखक द्वारा बहिष्कृत कर दिया गया है और वह फास्टलेन/स्नैपशॉट पर स्विच करने की सिफारिश करता है।)

तो मैं फास्टलेन/स्नैपशॉट पर जाऊंगा और मेरी समस्या को हल किया जाएगा।

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

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