Тестирование пользовательского интерфейса Xcode [xcode7-beta6] - утверждение фактических значений меток при использовании меток доступности

Вопрос на самом деле очень прост:

Есть ли способ утверждать отображаемое значение с определенной метки (например, UILabel) при использовании метки доступности на этом объекте?

Насколько я понимаю, все утверждения (например, XCTAssertEquals), сделанные в примерах, будь то из WWDC Talk или Blogposts, проверяют только, существует ли элемент для запроса, такого как XCTAssertEquals(app.staticTexts["myValue"].exists, true) или если количество ячеек в таблице правильное XCTAssertEquals(app.tables.cells.count, 5). Поэтому, избегая ярлыков доступности, можно проверить, отображается ли объект определенным значением, но не каким объектом/элементом. А при использовании ярлыков доступности он лишает меня возможности запросить отображаемые значения, потому что app.staticTexts["myValue"] теперь не сможет предоставить результат, но app.staticTexts["myAccessibilityLabel"] ударит.

Предполагая, что я хочу проверить свою функциональность "Добавить новую ячейку в таблицу", я могу проверить, что в списке добавлена новая ячейка, но я понятия не имею, добавлена ли новая ячейка в верхней или нижней части списка или где-то посередине.

Для меня простой способ проверить, имеет ли определенный элемент определенное значение, должен быть без проблем, когда дело доходит до тестирования пользовательского интерфейса.

Возможно, из-за недостающей документации я мог бы упустить очевидное. Если да, просто скажи мне.

Ответ 1

Обязательно задайте свойство.accessibilityValue UILabel всякий раз, когда вы устанавливаете его значение.text. Затем в UITest вы можете проверить значение доступности следующим образом:

    let labelElement = app.staticTexts["myLabel"]
    ...
    XCTAssertEqual(labelElement.value as! String, "the expected text")

Ответ 2

Я думаю, вы задаете несколько разных вещей, поэтому я постараюсь ответить на каждый вопрос индивидуально.

  1. Есть ли способ утверждать отображаемое значение с определенной метки (например, UILabel) при использовании метки доступности на этом объекте?

Короче говоря, нет. Тестирование пользовательского интерфейса работает, подключаясь к API доступности, поэтому вы ограничены запросом на объекты на основе этого. Тем не менее, вы можете проверить свойство -value определенных элементов, таких как элементы управления. Это используется для проверки, включен или выключен переключатель. Обратите внимание, что эти кипятить вниз с использованием API-интерфейсов доступности также представляют собой другой метод (-accessibilityValue через -accessibilityIdentifier и -accessibilityLabel).

  1. ... но я понятия не имею, добавлена ли новая ячейка в верхней или нижней части списка или где-то посередине.

Чтобы XCUIElement для своего фрейма, вы можете использовать новый протокол XCUIElementAttributes, который предоставляет -frame. Например:

let app = XCUIApplication()
app.launch()

app.buttons["Add New Cell to Table"].tap()

let lastCell = app.cells["Last Cell"]
let newCell = app.cells["New Cell"]

XCTAssert(newCell.exists)
XCTAssert(newCell.frame.minY > lastCell.frame.maxY)
  1. Для меня простой способ проверить, имеет ли определенный элемент определенное значение, должен быть без проблем, когда дело доходит до тестирования пользовательского интерфейса.

Если вы думаете обо всем в плане доступности, это становится проблемой. Тестирование пользовательского интерфейса может взаимодействовать только с вашими элементами через API-интерфейсы доступности, поэтому вы должны их реализовать. Вы также получаете дополнительное преимущество в том, чтобы сделать ваше приложение более доступным для пользователя с включенными настройками.

Попробуйте установить для -accessibilityLabel или -accessibilityIdentifier для отображаемого текста. Тестирование пользовательского интерфейса может быть весьма точным в отношении того, какой он использует.

  1. Возможно, из-за недостающей документации я мог бы упустить очевидное. Если да, просто скажи мне.

У XCTest и UI Testing нет официальной документации. Поэтому я ушел и извлек свой собственный из файлов заголовков, открытых в рамках. Обратите внимание, что хотя они были вытащены из источника, они неофициальны.

Документация по тестированию XCTest/UI

Ответ 3

Что для меня работает, так это установить идентификатор доступности UILabel, чтобы сказать MyLabel.

func myLabelText() -> String {
  let myLabelUIElement: XCUIElement = self.application.staticTexts["MyLabel"]

  return myLabelUIElement.label
}

Протестировано с помощью Xcode 8 и iOS 10

Ответ 4

На форумах Apple выглядит так, что можно получить значение метки:

Единственный способ, которым я нашел, - не устанавливать метку специальных возможностей, а вместо этого использовать идентификатор. Затем XCUIElement.label изменится в соответствии с текущим текстом метки.

Однако есть вопрос: если вы ранее устанавливали метку специальных возможностей в XC и удаляли ее, запись, указывающая на метку "", остается в раскадровке. В этом случае не только вызовет.label вернется "", но вы не сможете запросить ярлык по тексту!

Единственное, что вы можете сделать, это удалить и повторно добавить ярлык или вручную отредактировать xml.

lastobelus - https://forums.developer.apple.com/thread/10428