У меня есть подкласс UIView, допустим, это class DemoView: UIView { }
, который содержит UILabel и UIButton. Мне нужно было сгруппировать его и добавить UIAccessibilityCustomAction, поэтому я переопределил var accessibilityElements: [Any]?
и использовал объединение для соединения обоих элементов. Я также присвоил строку «Пользователи» accessibilityLabel
.
С точки зрения пользователя это работает так, как должно, VoiceOver читает Users
, а затем пользователь может выбрать пользовательское действие с именем Edit
.
Проблема в том, что я не знаю, как запустить это пользовательское действие из UITests. Я знаю, что XCUIElement
содержит массив UICustomActions
, и я могу получить его селектор, но что тогда?
@XLE_22 XLE_22 Да, в тестах пользовательского интерфейса это ноль.
Цель, которую вы пытаетесь достичь, в настоящее время невозможно с iOS13 и Xcode 11.
Платформа UITesting не обращается к коду приложения, как это делают модульные тесты: вы не можете заставить экземпляр выполнять селектор + массив пользовательских действий равен нулю, когда в UITest ⇒ вообще каждый пользовательское действие недоступно, а затем не может быть запущено.
XCUITEST работает благодаря таким свойствам доступности, как accessibilityIdentifier
, но определенно не предназначен для простой работы с VoiceOver (немыслимо и непонятно на мой взгляд).
Я надеюсь, что во время следующей конференции WWDC для НАСТОЯЩЕГО тестирования специальных возможностей будет представлено что-то новое в тестировании пользовательского интерфейса.
Я разговаривал с инженерами Apple во время WWDC19 в лаборатории специальных возможностей и тестирования, и они сказали, что сейчас это невозможно. Причина, по которой доступность недоступна во время тестирования, связана с проблемами безопасности. Они также сказали, что они не используют UITests для тестирования UIAccessibility и при создании элементов доступности поддерживают два случая — когда UITests выполняются, а когда нет.
Я рекомендую сделать предложение, используя Помощник по обратной связи.
Для тех, кто еще застрял на этом, если у вас есть прямая ссылка на рассматриваемый UIView
, я (ну, мой коллега) обнаружил, что следующий «хак» работает довольно хорошо.
let view: UIView = YourViewWithCustomAction()
let customActionName: String = "<Your custom action name here>"
let action: UIAccessibilityCustomAction = view.accessibilityCustomActions!.first(where: { $0.name == customActionName })!
_ = action.target!.perform(action.selector, with: action)
В качестве отказа от ответственности, это может работать только в том случае, если у вас есть собственный подкласс UIView
, который реализует свой собственный override var accessibilityElements
.
Вы уже пытались получить упомянутые вами UIAccessibilityCustomActions из вашего XCUIElement во время UITest, используя, например, точку останова? Разве это не ноль?