Swift UI Testing Строка доступа в TextField

Я использую класс тестового примера UI, интегрированный в Xcode и XCTest для тестирования пользовательского интерфейса приложения. Я хочу проверить что-то вроде этого:

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

Я пробовал textField.value как! String; это не работает. Я также попытался использовать новый метод async с expectationForPredicate(), и это приведет к таймауту.

Есть идеи, как это сделать? Или проверка этого типа невозможна при тестировании пользовательского интерфейса, и я могу только писать тесты с "черным ящиком"?

Ответ 1

Я использую этот код, и он отлично работает:

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

Если вы делаете что-то подобное, и оно не работает, я бы проверил, чтобы убедиться, что ваш элемент textField действительно существует:

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

Ответ 2

Swhift 4.2. Вам нужно очистить существующее значение в textField и вставить новое значение.

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 - это метод расширения 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)
        }
    }
}

Ответ 3

следующее работает в Xcode 10.3, работающем на macOS 10.14.3, для приложения iOS, работающего на iOS 12.4:

XCTAssert( app.textFields["testTextField"].exists, "test text field does not exist" )
let tf = app.textFields["testTextField"]
tf.tap()    // must give text field keyboard focus!
tf.typeText("Hello!")
XCTAssert( tf.exists, "tf exists" )   // text field still exists
XCTAssertEqual( tf.value as! String, "Hello!", "text field has proper value" )