Тестирование пользовательского интерфейса Xcode 7 - не удается получить доступ к элементу в подвиде

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

Иерархия:

Просмотр контроллера:

  • View
    • tempView
    • userEnterView
      • zipCodeEntered

Я хочу получить доступ к текстовому полю zipCodeEntered. У меня есть метка доступности с именем «zipCodeEntered».

Когда я пытаюсь записать автоматизацию, она регистрирует только супервизор «userEnterView», а не фактическое текстовое поле, к которому я могу подключиться.

Я печатаю «app.otherElements[SUPER_VIEW_NAME].debugDescription», чтобы увидеть, какие элементы находятся в этой иерархии, и ничего не печатает.

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


person sebradloff    schedule 26.09.2015    source источник
comment
Можете ли вы попробовать вместо этого установить accessibilityIdentifer?   -  person Joe Masilotti    schedule 26.09.2015
comment
Джо: Я много читал ваш блог по тестированию пользовательского интерфейса, и он мне очень помог, поэтому я просто хотел поблагодарить вас за это. Я добавил accessibilityIdentifier в текстовое поле zipCodeEntered, и он все еще не может его найти. Используя либо app.otherElements["zipCodeEntered"], либо app.textFields["zipCodeEntered"]. Добавлено изображение макета раскадровки   -  person sebradloff    schedule 27.09.2015
comment
Спасибо, рад, что помог! Вы пытались получить доступ к элементу по его тексту-заполнителю, почтовому индексу?   -  person Joe Masilotti    schedule 28.09.2015
comment
Есть ли способ получить доступ к элементам по их тексту-заполнителю прямо из приложения? Я вижу, что app.placeholderValue существует, но он просто возвращает строку для значения заполнителя приложения.   -  person sebradloff    schedule 29.09.2015
comment
Вы можете использовать тот же запрос, который вы уже используете. app.textFields["Zip Code"].   -  person Joe Masilotti    schedule 29.09.2015
comment
к сожалению, app.textfields["Zip Code"].exists возвращает false.   -  person sebradloff    schedule 29.09.2015
comment
Вот где это может стать немного странным. Я обнаружил, что тестирование пользовательского интерфейса не может идентифицировать элементы по тексту-заполнителю (или тексту метки), если вы либо используете, либо использовали идентификатор доступа или имя. Даже если вы использовали его один раз и отключили. Вы должны перейти к XML раскадровки и буквально вручную удалить XML доступности для этого элемента пользовательского интерфейса. Я открыл ошибку Apple, и я полагаю, что они признали, что это открытая проблема. Как только XML доступности раскадровки больше не существует, просто нет причин, по которым app.textFields["Zip Code"].exists не должен работать. Дайте мне знать, если это поможет!   -  person Nick McConnell    schedule 29.09.2015
comment
Я удалил весь код специальных возможностей из XML и все равно не радуюсь. Затем я удалил текстовое поле и добавил его снова, только с почтовым индексом-заполнителем, по-прежнему ничего ... Вы заметили, что это проблема с элементами, расположенными в подпредставлениях? Спасибо за вашу помощь!   -  person sebradloff    schedule 30.09.2015


Ответы (3)


Подпредставления недоступны, поскольку родительское представление не является представлением контейнера. Из раздела Обеспечение доступности вашего приложения для iOS из Руководства по программированию специальных возможностей:

С точки зрения специальных возможностей пользовательское представление — это либо отдельное представление, либо представление-контейнер. Отдельное представление не содержит никаких других представлений, которые должны быть доступны.

Контейнерное представление, с другой стороны, содержит другие элементы, с которыми могут взаимодействовать пользователи.

Чтобы сделать подпредставления доступными, родительское представление должно сообщить UIAccessibility, что это контейнер доступности, возвращая NO из -isAccessibilityElement и реализуя методы протокола UIAccessibilityContainer.

person quellish    schedule 02.10.2015
comment
Благодарю вас! Именно в этом была проблема. Есть два способа добиться этого. 1) снимите флажок доступности для всех элементов представления, которые у меня были. 2) программно в контроллере представления используйте конкретный выход представления для записи viewOutletVariable.isAccessibilityElement = false. - person sebradloff; 07.10.2015
comment
Этот ответ был для меня в основном ингалятором. - person rambossa; 02.05.2017
comment
UIAccessibilityContainer предназначен только для представлений, содержащих элементы, не поддерживаемые UIKit. Например, рисование текста и изображений вручную с помощью drawAtPoint, а не UILabel или UIImageView. - person Jonathan.; 26.10.2017
comment
@Джонатан. UIAccessibilityContainer — это методы, которые можно переопределить для продажи отдельных элементов, управляемых одним UIView. Например, интерфейс набора номера iOS может быть представлением, которое реализует UIAccessibilityContainer, чтобы обеспечить доступность для индивидуального взаимодействия с содержащимися в нем UIButtons, а не с родительским представлением. который их содержит. - person quellish; 29.10.2017
comment
Это решает проблему. Просто установите isAccessibilityElement = false для любого пользовательского представления, содержащего другие элементы. Я должен тебе пиво в этой или в другой жизни. - person Fmessina; 27.10.2018

То, что исправило это для меня, заключалось в том, чтобы установить √ флажок «Доступность» для включения в Interface Builder.

введите здесь описание изображения

Если не работает в IB, попробуйте установить для свойства isAccessibilityElement представления значение true.

Надеюсь, это поможет!

person Patrick Ridd    schedule 15.01.2019
comment
Почему это получило отрицательный голос? Это буквально просто графическое представление принятого ответа. - person Bawenang Rukmoko Pardian Putra; 27.01.2021

Я также столкнулся с этой проблемой в своем UITableView. В моей ячейке есть containerView (UIView), который имеет подпредставления (TextView, UIButton...) и collectionView с его ячейками.

Я попробовал принятый ответ, но он не сработал (UI Recorder или ручной код не распознали мои подэлементы). Но иногда я обнаруживал, что UITest внезапно распознавал мои подэлементы, когда я запускал что-то для обновления таблицы.

Итак, прямо сейчас я знаю, что если UITest не может найти мои подпредставления, я вызываю tableView.reloadData для обновления представления, и тогда вся проблема исчезает.

В любом случае, это всего лишь обходной путь, я надеюсь, что Apple сможет исправить его как можно скорее.

person Andres Wang    schedule 25.06.2016
comment
Как вы вызываете tableView.reloadData в XCUI? - person Ishmeet; 14.02.2017
comment
Этот ответ никоим образом не связан с вопросом, поскольку код и скриншот показывают, что UITableView вообще не задействовано. - person Max Desiatov; 22.04.2017
comment
Несмотря на то, что это на самом деле не связано с исходным вопросом, я нашел это полезным, потому что у меня была та же проблема - XCUI не нашел никаких ячеек внутри таблицы, хотя в тот момент на снимке были ячейки. Помогла перезагрузка табличного представления. Для этого я использовал github.com/Subito-it/SBTUITestTunnel. Я надеюсь, что XCode скоро это исправит. - person Artem Aleksandrov; 25.06.2018