Как я могу утверждать, что текстовое поле пусто?

У меня есть пустое текстовое поле в моем пользовательском интерфейсе, хотя в раскадровке установлен текст-заполнитель (значение которого равно foo). В моем тесте пользовательского интерфейса я пытаюсь проверить, что его текстовое значение начинается пустым, но когда я запрашиваю его значение, вместо этого он, кажется, дает мне значение заполнителя:

func testTextFieldInitiallyEmpty {
  let input = XCUIApplication().textFields["My Text Field"]
  XCTAssertEqual(input.value as! String, "")
}

поскольку тест завершается с ошибкой с этим сообщением:

Ошибка XCTAsertEqual: ("foo") не равно ("")

Конечно, foo — это значение-заполнитель, но это не текстовое значение этого текстового поля. Я бы ожидал этого сообщения об ошибке, если бы написал:

XCTAssertEqual(input.placeholderValue as! String, "")

input — это XCUIElement, реализующий XCUIElementAttributes, поэтому я не вижу здесь ничего другого, что могло бы помочь.

Как проверить (утвердить), что текстовое поле пусто?

раскадровкаинспектор атрибутов

Редактировать

Проведя некоторые дальнейшие исследования и опробовав приведенные ниже предложения по использованию свойств input accessibilityValue, label и title, я не нашел решения, которое дало бы мне текстовое значение текстового поля, когда есть текст, и пустую строку, когда только заполнитель виден.

Это похоже либо на (а) ошибку, либо (б) сомнительное проектное решение тестовой среды, не обеспечивающее эту возможность. Как минимум документация для XCUIElementAttributes#value кажется мне неадекватной. , так как единственная деталь:

Точный тип значения зависит от типа элемента.

Все еще ищу лучшее решение...


person akivajgordon    schedule 21.08.2018    source источник


Ответы (2)


Вы можете сравнить с переменной XCUIElementAttributes placeholderValue в дополнение к проверке наличия пустая строка

extension XCUIElement {
    func noTextEntered() -> Bool {
        return self.value as? String != "" && self.value as? String != placeholderValue
    }
}

Затем вы можете запустить XCAssert(input.noTextEntered(), "Unexpected text entered into field")

Просто убедитесь, что ваш заполнитель не является тем, что вводит пользователь. Таким образом, вам не нужно жестко кодировать значения заполнителя для проверки.

person Jason    schedule 13.02.2019
comment
Да, это имеет смысл, но просто убедитесь, что ваш заполнитель не является чем-то, что пользователь будет вводить, - это досадное требование, которого, как я надеялся, можно избежать. - person akivajgordon; 14.02.2019
comment
Я полностью согласен с тобой. У меня сам был этот вопрос, и я подумал о том, чтобы отправить радарный билет Apple для .value, чтобы игнорировать текст заполнителя. - person Jason; 15.02.2019

Попробуйте использовать свойство accessibilityValue объекта input.

func testTextFieldInitiallyEmpty {
  let input = XCUIApplication().textFields["My Text Field"]
  XCTAssertEqual(input.accessibilityValue, "")
}

Если вы нажмете команду + щелкнете по свойству, вы увидите следующее.

    /*
     Returns a localized string that represents the value of the element, such as the value 
     of a slider or the text in a text field. Use only when the label of the element
     differs from a value. For example: A volume slider has a label of "Volume", but a value of "60%".
     default == nil
     default on UIKit controls == values for appropriate controls 
     Setting the property will change the value that is returned to the accessibility client.  
     */
    public var accessibilityValue: String?
person Skywalker    schedule 21.08.2018
comment
Это действительно работает? Я не смог это проверить. accessibilityValue возвращается nil. - person akivajgordon; 22.08.2018
comment
@akivajgordon Почему бы вам не попробовать ввести значение по умолчанию в текстовое поле и проверить? Дайте мне знать, если это сработает. - person Skywalker; 23.08.2018
comment
Я поместил значение по умолчанию в текстовое поле, но accessibilityValue все еще появляется nil. - person akivajgordon; 23.08.2018
comment
@akivajgordon Можете ли вы проверить свойство label объекта input или title? - person Skywalker; 23.08.2018
comment
Эти тоже не работают. Ни метка, ни заголовок не представляют значение текста внутри текстового поля. - person akivajgordon; 23.08.2018
comment
@akivajgordon Почему бы вам тогда не свериться с текстом-заполнителем? Собирается ли кто-либо из пользователей вводить замещающий текст в текстовое поле? Или это тоже одно из требований бизнеса? - person Skywalker; 24.08.2018
comment
Я так и сделаю, но мне это не нравится. На мой вкус это слишком хакерски. В любом случае, спасибо за вашу помощь в этом. - person akivajgordon; 24.08.2018