Строка доступа к тестированию пользовательского интерфейса Swift в текстовом поле

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

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

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

Любая идея, как это сделать, или проверка такого рода невозможна с тестом пользовательского интерфейса, и я мог бы писать только тесты черного ящика?


person leoluo    schedule 18.11.2015    source источник
comment
Спасибо @Charles A. за указание на то, что проблема в том, что textField не существует. Я сбит с толку, потому что я вызываю метод typeText и вижу, что текст вводится в текстовое поле.   -  person leoluo    schedule 19.11.2015


Ответы (3)


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

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")
person Charles A.    schedule 18.11.2015
comment
Да, ты прав. Текстовое поле не существует. Но я этого не понимаю: я вызываю typeText для textField и вижу, что текст вводится в textField. - person leoluo; 19.11.2015
comment
Должен ли я использовать асинхронный метод для этого? - person leoluo; 19.11.2015
comment
Является ли исходный текст Apple? Поведение по умолчанию, вероятно, заключается в том, что метка доступности поля является его содержимым, поэтому запрос завершается ошибкой при второй попытке разрешить элемент. - person Charles A.; 19.11.2015
comment
Вы должны установить идентификатор доступности в текстовое поле и искать его с ним вместо Apple, чтобы он был последовательным. Каждый раз, когда вы обращаетесь к элементу, он пытается разрешить его снова. - person Charles A.; 19.11.2015
comment
Я понимаю, о чем вы говорите, и нашел обходной путь с помощью elementBoundByIndex(). Спасибо за помощь - person leoluo; 19.11.2015
comment
@leoluo, вы должны добавить свой комментарий в раздел ответов. - person Urmi; 09.12.2017
comment
@leoluo Если вы знаете индекс своего текстового поля, вы можете сделать что-то вроде этого: let textField = XCUIApplication().textFields.element(boundBy: index). Конечно, было бы проще определить индекс текстового поля более конкретного элемента, чем экземпляр корня XCUIApplication. - person Charles A.; 09.12.2017

Свифт 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)
        }
    }
}
person Agisight    schedule 31.01.2019

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

XCTAssert( app.textFields["testTextField"].exists, "test text field doesn't 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" )
person Dad    schedule 03.09.2019