Xcode UI परीक्षण - UI परीक्षण विफलता - जब खोज फ़ील्ड "रद्द" बटन पर टैप करने पर दृश्यमान (AX क्रिया द्वारा) स्क्रॉल करने में विफल रहा


85

मैं खोज बार में 'रद्द करें' बटन पर टैप करके खोज फ़ील्ड को खारिज करने का प्रयास कर रहा हूं।

रद्द करने का बटन ढूंढने में परीक्षण का मामला विफल हो रहा है। यह Xcode 7.0.1 में ठीक काम कर रहा था

मैंने बटन दिखने के लिए प्रतीक्षा करने के लिए विधेय को जोड़ा है। जब हम "रद्द" बटन पर टैप करते हैं तो परीक्षण का मामला विफल हो रहा है

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

लॉग :

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@ जो मैसीलोटी कोई विचार?
विनपई

सिर्फ एक पवित्रता की जांच, लेकिन स्क्रीन पर रद्द करें बटन है या इसे स्क्रॉल करने की आवश्यकता है? मुझे पता है कि अभी भी ऐसे मुद्दे हैं जहां तत्वों को स्क्रॉल करना हमेशा काम नहीं करता है।
जो मैसीलोटी

@JoeMasilotti कैंसिल बटन स्क्रीन पर है। रद्द करें बटन सिस्टम डिफ़ॉल्ट बटन है जो UISearchbar का हिस्सा है। यह Xcode 7.0.1 में ठीक काम कर रहा था जब मैंने [self.buttons [@ "Cancel"] टैप] किया;
विन्पाई

1
@Vinpai क्या होता है जब आप app.tables.cells.allElementsBoundByAccessibilityElement.countअपने बटन को टैप करने से पहले जोड़ते हैं ? बस उत्सुक - यह मेरे लिए कई बार स्क्रीन को 'ताज़ा' करने में मदद करता है।
केक88

@Konnor, मैंने आपके द्वारा सुझाए गए API के साथ प्रयास किया, लेकिन जब मैं रद्द करें बटन पर टैप करता हूं तो यह विफल हो जाता है। जब मैं डिबगर में application.buttons को क्वेरी करता हूं, तो यह रद्द बटन दिखा रहा है
Vinpai

जवाबों:


140

मुझे लगता है कि यहां "रद्द करें" बटन संपत्ति के falseलिए रिटर्न देता hittableहै, जो इसे दोहन से रोक रहा है।

यदि आप tap()प्रलेखन में देखते हैं तो यह कहता है

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

ऐसा लगता है कि चीजें XCode 7.1 के साथ टूटी हुई हैं। अपने आप को (और यू भी रखें?) इन मुद्दों से अनब्लॉक मैंने लिखा है XCUIElementकि इस पर एक एक्सटेंशन लिखा है, भले ही यह हिट योग्य न हो, तत्व पर टैप करने की अनुमति देता है। निम्नलिखित आपकी मदद कर सकते हैं।

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

अब आप जैसे चाहे कॉल कर सकते हैं

button.forceTapElement()

अद्यतन - स्विफ्ट 3 के लिए निम्नलिखित उपयोग करें:

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

ठीक करने के लिए धन्यवाद। मैं इसी तरह की समस्या से जूझ रहा था cell.tap()और इसने इसे ठीक कर दिया। ऐसा लगता है कि Xcode7.1 में कुछ बदलाव आया है, जिसके कारण कुछ तत्व अब हिट करने योग्य नहीं है
francisOpt

मेरे पास एक कस्टम नेवीगेशन है। BackButtonItem Xcode7.1 में 'hittable' नहीं है, और यह समाधान मेरे लिए काम करता हैself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

धन्यवाद - मेरे इसी मुद्दे के लिए काम किया।
टॅच

7
मेरे मामले में यह काम किया जब नल दृश्य के केंद्र में है। ऑफसेट को (0.5, 0.5) में बदलें। let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
ग्राहम पर्क

1
अच्छा कार्य। यह देखने से पहले मैं अपनी मैकबुक को लगभग मारना शुरू कर रहा था।
चॉस्पस्पीडर

11

मेरे लिए, मूल कारण यह था कि जिन वस्तुओं को मैं टैप करना चाहता था

  • छिपाया गया है (और वापस)
  • हटा दिया गया है और फिर से जुड़ा हुआ है

दोनों मामलों में isAccessibilityElementसंपत्ति falseबाद में थी। इसे trueनिर्धारित करने के लिए इसे वापस सेट करें ।


3
यह वास्तव में मेरी समस्या थी। अजीब तरह से, यह iOS 11 पर शुरू हुआ (यह iOS 10 पर ठीक काम कर रहा था)।
रिकार्डो सांचेज-सेज

4

यह प्रश्न Google के " अच्छी तरह से दिखाई देने में विफल (AX क्रिया द्वारा) बटन" शब्द के लिए रैंक करता है । प्रश्न की आयु को देखते हुए मुझे लगता है कि यह XCUITest ढांचे के साथ एक मुद्दा नहीं था जैसा कि स्वीकृत उत्तर से पता चलता है।

मैंने पाया कि यह समस्या XCElementमौजूदा के कारण थी , लेकिन सॉफ्टवेयर कीबोर्ड के पीछे छिपी रही। त्रुटि को फ्रेमवर्क द्वारा उत्सर्जित किया जाता है क्योंकि यह एक दृश्य को स्क्रॉल करने में असमर्थ है जो देखने में मौजूद है कि यह टैप करने योग्य है। मेरे मामले में कभी-कभी सॉफ़्टवेयर कीबोर्ड के पीछे प्रश्न बटन होता था ।

मैंने पाया कि आईओएस सिम्युलेटर के सॉफ्टवेयर कीबोर्ड को कुछ मामलों में बंद किया जा सकता है (जैसे: आपकी मशीन पर) और दूसरों पर टॉगल किया जाता है (जैसे: आपके सीआई पर)। मेरे मामले में मैंने एक मशीन पर सॉफ़्टवेयर कीबोर्ड को टॉगल किया था, और डिफ़ॉल्ट रूप से इसे दूसरों पर टॉगल किया गया था।

समाधान: बटन को टैप करने का प्रयास करने से पहले कीबोर्ड को खारिज कर दें जो इसके पीछे हो सकता है।

मैंने कहीं पर टैपिंग पाया कि बटन पर टैप करने से पहले कीबोर्ड को स्पष्ट रूप से खारिज कर दिया, जिससे सभी वातावरण में मेरी समस्या हल हो गई।

मैंने वर्तमान रेस्पोंडर को इस्तीफा देने के लिए कुछ कार्रवाई जोड़ दी। मेरे पाठ विचारों के पीछे के विचार पहले उत्तरदाता को इस्तीफा देने के लिए मजबूर करेंगे, इसलिए मैं पिछले पाठ क्षेत्र के नीचे कहीं टैप करता हूं।

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

कृपया तत्व के गुण की जांच करें, मैं TableViewSectionHeader के साथ एक ही मुद्दे का सामना कर रहा था, मैं टैप करने की कोशिश कर रहा था लेकिन यह हर बिंदु पर विफल हो रहा था

यहां छवि विवरण दर्ज करें


1

सैंडी का वर्कअराउंड कुछ समय के लिए मदद करने लगा, लेकिन फिर और नहीं - मैंने फिर इसे इस तरह बदल दिया:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

मुख्य बिंदु यह है कि जैसा कि मुद्दा यह है कि हैटिटेबल चेक एक अपवाद फेंकता है, मैं यह जांच बिल्कुल नहीं करता हूं और तत्व मिलने के बाद निर्देशांक के लिए सीधे जाता हूं।


0

मेरे मामले में यह एक प्रोग्रामेटिक रूप से जोड़ा गया यूआई तत्व बटन को कवर कर रहा था।


0

यदि आप परीक्षण चलाने के लिए AppCenter सिम्युलेटर का उपयोग कर रहे हैं, तो आपको यह सुनिश्चित करना चाहिए कि आप अपने स्थानीय सिम्युलेटर की तुलना में उसी डिवाइस संस्करण पर परीक्षण चला रहे हैं। मैंने इस वजह से 3 दिन का काम गंवा दिया।


0

उन चीजों की भावना में जो आपके तत्व को कवर कर सकती हैं, मेरे पास आरएन डीबगर आंशिक रूप से मेरे आइकन के शीर्ष पर ओवरलेड था:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.