web-dev-qa-db-fra.com

Swift UI Testing Access string dans le TextField

J'utilise la classe UI Test Case intégrée à Xcode et XCTest pour tester l'interface utilisateur de l'application. Je veux tester quelque chose comme ça:

    app = XCUIApplication()
    let textField = app.textFields["Apple"]
    textField.typeText("text_user_typed_in")
    XCTAssertEqual(textField.text, "text_user_typed_in")

J'ai essayé le textField.value as! String méthode; cela ne fonctionne pas. J'ai également essayé d'utiliser la nouvelle méthode asynchrone avec expectationForPredicate () , et cela entraînerait un dépassement du délai d'attente.

Une idée comment faire ça? Ou une telle validation n’est pas possible avec UI Test et je ne peux écrire que des tests en boîte noire?

10
leoluo

J'utilise ce code et ça marche bien:

textField.typeText("value")
XCTAssertEqual(textField.value as! String, "value")

Si vous faites quelque chose de similaire et que cela ne fonctionne pas, je vérifierais que votre élément textField existe réellement:

XCTAssertTrue(textField.exists, "Text field doesn't exist")
textField.typeText("value")
XCTAssertEqual(textField.value as! String, "value", "Text field value is not correct")
27
Charles A.

Swhift 4.2. Vous devez effacer une valeur existante dans textField et coller une nouvelle valeur.

let app = XCUIApplication()
let textField = app.textFields["yourTextFieldValue"]
textField.tap()
textField.clearText(andReplaceWith: "VALUE")
XCTAssertEqual(textField.value as! String, "VALUE", "Text field value is not correct")

clearText est une méthode d'extension XCUIElement:

extension XCUIElement {
    func clearText(andReplaceWith newText:String? = nil) {
        tap()
        press(forDuration: 1.0)
        var select = XCUIApplication().menuItems["Select All"]

        if !select.exists {
            select = XCUIApplication().menuItems["Select"]
        }
        //For empty fields there will be no "Select All", so we need to check
        if select.waitForExistence(timeout: 0.5), select.exists {
            select.tap()
            typeText(String(XCUIKeyboardKey.delete.rawValue))
        } else {
            tap()
        }
        if let newVal = newText {
            typeText(newVal)
        }
    }
}
0
Agisight