Xcode UITesting: метка исчезает из иерархии и больше не возвращается


Это использование Xcode 7.2.1 и Swift 2.0.

У меня есть ячейка таблицы, содержащая UILabel, которая используется для отображения сообщения об ошибке. Поэтому при начальной загрузке он заглушается с помощью кода, подобного этому:

cell.errorLabel.alpha = 0.0
cell.errorLabel.text = nil

Затем позже, когда я обнаружил ошибку, которую я хочу отобразить, я делаю это:

cell.label.text = "to"
cell.errorLabel.alpha = 1.0
cell.errorLabel.text = "Error !!!!"

Это прекрасно работает при запуске приложения. Однако при запуске в тесте пользовательского интерфейса я пытаюсь проверить, что ошибка отображается следующим образом:

let toCell = XCUIApplication().tables.... // Finds the cell with label 'to'
XCTAssertTrue(toCell.staticTexts["Error !!!!"].exists)
И она терпит неудачу. Я проверил, что я ... получение нужной ячейки путем проверки другой ('to') метки присутствует. Которого она является. Но тестирование пользовательского интерфейса не увидит метки ошибки. Я проверил это, добавив точку останова и используя отладчик следующим образом:
(lldb) p toCell.staticTexts.count
    t =   427.03s     Get number of matches for: Descendants matching type StaticText
    t =   427.29s         Snapshot accessibility hierarchy for enterprise.com.me
    t =   427.31s         Find: Descendants matching type Table
(UInt) $R2 = 1
    t =   427.31s         Find: Descendants matching type Cell
    t =   427.32s         Find: Elements containing elements matching type StaticText with identifier 'to'
    t =   427.32s         Find: Descendants matching type StaticText

Значение (UInt) $R2 = 1, указывающее на наличие одного статического текста. Однако, глядя на тренажер, я ясно вижу две UILabels.

Я попробовал несколько вещей индивидуально, чтобы изолировать проблему-используя только alpha или установив текст в nil, или используя UIView hidden собственность. Использование любой из этих опций для первоначального скрытия метки делает ее невидимой для тестов пользовательского интерфейса, когда позже она становится видимой, независимо от того, что я пытаюсь.

Я совершенно сбит с толку этим и подозреваю, что это ошибка. У кого-нибудь есть идеи, как заставить UI-тесты увидеть UILabel, как только я сделаю его видимым? P.S. Я также пытался использовать цикл ожидания, чтобы дождаться появления метки (используя expectationForPredicate(...), но UILabel не появился.
1 2

1 ответ:

Проблема оказалась в том, что я не установил свойство accessibilityElements на ячейки. Поэтому у accessibility возникли проблемы, пытаясь выяснить, что было в каждом из них.

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