#javascript #ios #xcode4 #ios-ui-automation
#javascript #iOS #xcode4 #ios-ui-автоматизация
Вопрос:
Я пытаюсь получить доступ к value()
объекту JavaScript UIAStaticText
(a UILabel
в коде objective C). Я могу просто установить значение с помощью setValue()
и я могу подтвердить, что симулятор обновляет текст, но когда я пытаюсь получить значение, я получаю только null
.
т.е.
text.setValue("new text");
обновляет метку на «новый текст» в симуляторе.
text.value()
все еще возвращается null
после того, как я установил значение.
Что я здесь делаю не так?
Комментарии:
1. Спасибо, я собирался начать биться головой о ноутбук
Ответ №1:
Похоже, что корень проблемы заключается в accessibilityValue
свойстве UILabel
возврата accessibilityLabel
, а не в UILabel
тексте, как следовало бы. Чтобы решить эту проблему, я переопределяю accessibilityValue
свойство в моей пользовательской UILabel
категории.
@interface UILabel (MyAccessibility)
@property(nonatomic, copy) NSString *accessibilityValue;
@end
@implementation UILabel (MyAccessibility)
@dynamic accessibilityValue;
-(NSString *)accessibilityValue {
// Here we force UIKit to return Label value, not the accessibility label
return self.text;
}
@end
Помимо этого небольшого трюка, я всегда стараюсь предпочесть идентификатор доступности метке доступности, чтобы подготовить элементы моего пользовательского интерфейса для автоматического тестирования. Ознакомьтесь с разделом «Ярлык доступности и атрибуты идентификатора» в руководстве пользователя по новым функциям инструментов.
Комментарии:
1. Потрясающе. На случай, если кому-то еще интересно, что мне было интересно, оказывается, нет необходимости импортировать заголовок категории куда-либо; просто скомпилируйте его в своем приложении, и это сработает.
Ответ №2:
После многих часов поиска и попыток я нашел это в ответах О’Рейли, подтверждающих наличие ошибки, из-за которой вы не можете получить значение для статической текстовой метки с помощью платформы UIAutomation от Apple. Вот цитата:
Строка текстовой метки UILabel отображается как имя поля StaticText, а не как его значение, которое всегда равно нулю. Если вы установите метку доступности, она становится свойством name, и больше нет никакого способа обнаружить текущий текст в UILabel. У меня есть открытый отчет об ошибке в Apple по этому поводу.
Комментарии:
1. Спасибо, значит, я установил метку доступности, которая делает это для меня? Я думал сообщить об этом как об ошибке, но некоторые сложности с входом на портал разработчиков Apple заставили меня забыть об этом.
2. Я думаю, что сценарии автоматизации для проверки значений UILabel на данный момент практически бесполезны. Я использовал обходной путь, предложенный в статье О’Рейли, — преобразовал мои UILabels в не редактируемые UITextFields. Компромисс заключается в том, что вы теряете простое форматирование для таких вещей, как отбрасываемые тени, но в остальном все работает как по маслу.
3. Вы должны предпочесть ответ Виктора, который является более чистым. Вы не должны изменять свое приложение, чтобы оно было совместимо с вашими тестами.
4. есть какие-либо обновления в вашем отчете об ошибке? Статус этого тот же?
5. Что-то новое в этом? можем ли мы уже получить значение UIStaticText с помощью UIAutomation?.
Ответ №3:
На самом деле, нет необходимости создавать категорию, указанную Виктором Крикуном. Достаточно установить accessibilityIdentifier — говорится в документах Apple (iOS 6.1.3):
Атрибуты метки доступности и идентификатора
Атрибут identifier позволяет использовать более описательные имена для элементов. Это необязательно, но оно должно быть установлено для скрипта для выполнения любой из этих двух операций:
- Доступ к представлению контейнера по имени, а также возможность доступа к его дочерним элементам.
- Доступ к представлению UILabel по имени для получения отображаемого текста (через его атрибут value).
Также может потребоваться явно установить
uilabel.accessibilityLabel = NSLocalizedString(@"Element description", @"Localized accessibility label for VoiceOver");
uilabel.accessibilityValue = uilabel.text;
В моем собственном коде у меня есть один случай, когда это просто работает, и другой, когда я должен явно установить значения. Мое лучшее предположение о разнице заключается в том, что, возможно, это потому, что я ввел, а затем удалил метку доступности в Interface Builder в одном случае — в конечном итоге может возникнуть разница между nil и пустой строкой или что-то в этом роде. Код Apple здесь явно хрупкий (SDK 6.1.3, тестирование на симуляторе iOS 5.0).
Ответ №4:
В ответ на Криша (поскольку я не вижу, как ответить ему): вы могли бы применить тот же трюк к UITableViewCell, что и к UILabel, а затем для текста метки внутри ячейки связаться с ячейкой для значения () вместо статического текста в ней. Хотя на самом деле это похоже на нагромождение большего количества хаков поверх хаков. Но я не вижу другого способа.
Редактировать: Добавлена полная реализация, включая существующее решение для полноты картины.
@interface UILabel (MyAccessibility)
@property(nonatomic, copy) NSString *accessibilityValue;
@end
@implementation UILabel (MyAccessibility)
@dynamic accessibilityValue;
-(NSString *)accessibilityValue {
// Here we force UIKit to return Label value, not the accessibility label
return self.text;
}
@end
@interface UITableViewCell (AccessibilityFix)
@property(nonatomic, copy) NSString *accessibilityValue;
@end
@implementation UITableViewCell (AccessibilityFix)
@dynamic accessibilityValue;
-(NSString *)accessibilityValue {
// Here we force UIKit to return Label value, not the accessibility label
return self.textLabel.text;
}
@end