swift - पाठ क्षेत्र में UI परीक्षण हटाने वाला पाठ




uitextfield xcode7 (8)

मेरे परीक्षण में मेरे पास पहले से मौजूद पाठ के साथ एक पाठ क्षेत्र है। मैं सामग्री को हटाना चाहता हूं और एक नया स्ट्रिंग टाइप करना चाहता हूं।

let textField = app.textFields
textField.tap()
// delete "Old value"
textField.typeText("New value")

हार्डवेयर कीबोर्ड के साथ स्ट्रिंग हटाने पर मेरे लिए कुछ भी नहीं हुआ। सॉफ्टवेयर कीबोर्ड के साथ ऐसा ही करने के बाद मुझे मिला:

let key = app.keys["Usuń"] // Polish name for the key
key.tap()
key.tap() 
... // x times

या

app.keys["Usuń"].pressForDuration(1.5)

मुझे चिंता थी कि मेरा परीक्षण भाषा-निर्भर है इसलिए मैंने अपनी समर्थित भाषाओं के लिए ऐसा कुछ बनाया है:

extension XCUIElementQuery {
    var deleteKey: XCUIElement {
        get {
            // Polish name for the key
            if self["Usuń"].exists {
                return self["Usuń"]
            } else {
                return self["Delete"]
            }
        }
    }
}

यह कोड में अच्छे लगते हैं:

app.keys.deleteKey.pressForDuration(1.5)

लेकिन यह बहुत नाजुक है। सिम्युलेटर Toggle software keyboard से छोड़ने के बाद रीसेट किया गया था और मुझे एक असफल परीक्षा मिली है। मेरा समाधान सीआई परीक्षण के साथ अच्छी तरह से काम नहीं करता है। इसे और अधिक सार्वभौमिक बनाने के लिए कैसे हल किया जा सकता है?


अब swift 4.2 शायद आपको निम्नलिखित कोड आज़माना चाहिए:

extension XCUIElement {
    /**
     Removes any current text in the field before typing in the new value
     - Parameter text: the text to enter into the field
     */
    func clearAndEnterText(text: String) {
        guard let stringValue = self.value as? String else {
            XCTFail("Tried to clear and enter text into a non string value")
            return
        }

        self.tap()
        for _ in 0..<stringValue.count {
            self.typeText(XCUIKeyboardKey.delete.rawValue)
        }

        self.typeText(text)
    }
}

इसलिए, मुझे अभी तक कोई अच्छा समाधान नहीं मिला: /

और मैं स्पष्ट "स्पष्ट पाठ" देखने के साथ ऊपर की तरह, स्थानीय निर्भर समाधान पसंद नहीं करता।

तो, मैं टाइप चेक करता हूं, फिर टेक्स्ट फ़ील्ड में स्पष्ट बटन खोजने की कोशिश करता हूं। यह तब तक अच्छी तरह से काम करता है जब तक कि आपके पास एक से अधिक टेक्स्ट के साथ कस्टम टेक्स्ट फ़ील्ड न हो।

मेरा अब सबसे अच्छा है (मेरे पास अधिक बटन के साथ कोई कस्टम टेक्स्ट फ़ील्ड नहीं है):

    class func clearTextField(textField : XCUIElement!) -> Bool {

        guard textField.elementType != .TextField else {
            return false
        }

        let TextFieldClearButton = textField.buttons.elementBoundByIndex(0)

        guard TextFieldClearButton.exists else {
            return false
        }

        TextFieldClearButton.tap()

        return true
    }

उपरोक्त समस्या के समाधान के लिए मुझे कुछ कठिनाई हो रही थी कि मैं इसी तरह की समस्या के लिए काम करूँ: क्यूरर पाठ से पहले खुद को जगह देगा और फिर वहाँ से पीछे की ओर काम करेगा। इसके अतिरिक्त, मैं यह जांचना चाहता था कि टेक्स्टफील्ड को हटाने से पहले उसमें पाठ था। यहाँ मेरा समाधान विस्तार से प्रेरित है ने लिखा है। मुझे ध्यान देना चाहिए कि डिलीट कुंजी को टैप करने में लंबा समय लग सकता है, और इसे .pressForD के साथ प्रतिस्थापित किया जा सकता है।

func clearAndEnterText(element: XCUIElement, text: String) -> Void
    {
        guard let stringValue = element.value as? String else {
            XCTFail("Tried to clear and enter text into a non string value")
            return
        }

        element.tap()

        guard stringValue.characters.count > 0 else
        {
            app.typeText(text)
            return
        }

       for _ in stringValue.characters
        {
            app.keys["delete"].tap()
        }
        app.typeText(text)
    }

चूँकि आपने अपने प्रश्नों की टिप्पणियों में अपनी स्थानीयकृत कुंजी नाम की समस्या को ठीक कर लिया था, इसलिए मैं मान लूंगा कि आप डिलीट कुंजी को "डिलीट" कहकर उसका उपयोग कर सकते हैं।

नीचे दिया गया कोड आपको अपने क्षेत्र की सामग्री को मज़बूती से हटाने की अनुमति देगा:

    while (textField.value as! String).characters.count > 0 {
        app.keys["Delete"].tap()
    }

लेकिन साथ ही, आपका मुद्दा आपके ऐप की उपयोगिता को बेहतर बनाने के लिए इसे और अधिक सुरुचिपूर्ण ढंग से हल करने की आवश्यकता को इंगित कर सकता है। पाठ फ़ील्ड पर आप एक Clear button भी जोड़ सकते हैं जिसके साथ उपयोगकर्ता पाठ क्षेत्र को तुरंत खाली कर सकता है;

स्टोरीबोर्ड खोलें और टेक्स्ट फ़ील्ड का चयन करें, विशेषताओं के तहत निरीक्षक "स्पष्ट बटन" ढूंढें और इसे वांछित विकल्प पर सेट करें (जैसे कि हमेशा दिखाई देता है)।

अब उपयोगकर्ता पाठ फ़ील्ड के दाईं ओर एक साधारण नल से फ़ील्ड को साफ़ कर सकते हैं:

या आपके UI परीक्षण में:

textField.buttons["Clear text"].tap()

मैं iOS के साथ UI परीक्षण में नया हूं, लेकिन मैं इस सरल वर्कअराउंड के साथ पाठ फ़ील्ड को साफ़ करने में सक्षम था। Xcode8 के साथ काम करना और इसे जल्द ही फिर से शुरू करने पर योजना:

func testLoginWithCorrectUsernamePassword() {
      //Usually this will be completed by Xcode
    let app = XCUIApplication()
      //Set the text field as a constant
    let usernameTextField = app.textFields["User name"]
      //Set the delete key to a constant
    let deleteKey = app.keys["delete"]
      //Tap the username text field to toggle the keyboard
    usernameTextField.tap()
      //Set the time to clear the field.  generally 4 seconds works
    deleteKey.press(forDuration: 4.0);
      //Enter your code below...
}

मैंने अपने लिए ऐसा करने के लिए एक विस्तार विधि लिखी और यह बहुत तेज़ है:

extension XCUIElement {
    /**
     Removes any current text in the field before typing in the new value
     - Parameter text: the text to enter into the field
     */
    func clearAndEnterText(text: String) {
        guard let stringValue = self.value as? String else {
            XCTFail("Tried to clear and enter text into a non string value")
            return
        }

        self.tap()

        let deleteString = stringValue.characters.map { _ in XCUIKeyboardKeyDelete }.joined(separator: "")

        self.typeText(deleteString)
        self.typeText(text)
    }
}

यह तब बहुत आसानी से उपयोग किया जाता है: app.textFields["Email"].clearAndEnterText("[email protected]")


यह टेक्स्टफील्ड और टेक्स्टव्यू के लिए काम करेगा

स्विफ्ट 3 के लिए

extension XCUIElement {
    func clearText() {
        guard let stringValue = self.value as? String else {
            return
        }

        var deleteString = String()
        for _ in stringValue {
            deleteString += XCUIKeyboardKeyDelete
        }
        self.typeText(deleteString)
    }
}

SWIFT 4 के लिए SWIFT 99 के लिए

extension XCUIElement {
    func clearText() {
        guard let stringValue = self.value as? String else {
            return
        }

        var deleteString = String()
        for _ in stringValue {
            deleteString += XCUIKeyboardKey.delete.rawValue
        }
        self.typeText(deleteString)
    }
}

अद्यतन XCODE 9

एक ऐप्पल बग है जहां यदि टेक्स्टफील्ड खाली है, तो मान और प्लेसहोल्डरवैल्यू बराबर हैं

extension XCUIElement {
    func clearText() {
        guard let stringValue = self.value as? String else {
            return
        }
        // workaround for apple bug
        if let placeholderString = self.placeholderValue, placeholderString == stringValue {
            return
        }

        var deleteString = String()
        for _ in stringValue {
            deleteString += XCUIKeyboardKey.delete.rawValue
        }
        self.typeText(deleteString)
    }
}

वर्चुअल कीबोर्ड पर भरोसा किए बिना टेक्स्ट बॉक्स में वर्तमान स्ट्रिंग मान को हटाने के लिए ऐसा करें।

// इस चर में अपने टेक्स्ट बॉक्स के मूल्य को पढ़ें

  let characterCount: Int = textInTextField.count
  for _ in 0..<characterCount {
    textFields[0].typeText(XCUIKeyboardKey.delete.rawValue)
  }

इस समाधान के बारे में अच्छी बात यह है कि यह सिम्युलेटर की परवाह किए बिना काम करता है वर्चुअल कीबोर्ड है या नहीं।





xcode-ui-testing