Я только начинаю с автоматизации пользовательского интерфейса для моего приложения iOS, и у меня уже проблемы. Я не могу приложить скриншоты, поэтому сделаю все возможное, чтобы описать мой сценарий.Элемент автоматизации iOS UI не находит подэлементов
Я строю для iOS 6.0 и использую раскадровку. Приложение запускается на экран с навигационным контроллером. Контроллер корневого представления содержит основное представление, которое имеет 1 подчиненный UIView, который занимает нижние 60% экрана и сегментированный элемент управления, который находится над этим подвью. Мне удалось настроить доступность основного вида (ярлык «mainview»). Тогда я смогу найти этот элемент в своем тесте без проблем. Тем не менее, теперь у меня проблемы с поиском сегментированного контроллера. Поэтому я решил вывести длину «elements()» и «segementedControls()» из моего элемента «mainview», а длина каждого массива равна 0. Так что как-то, когда тест запускает мое приложение, он говорит, что нет суб- -элементы на моем основном взгляде.
Другое дело, что я не смог найти раздел специальных возможностей в инспекторе идентификации редактора раскадровки для сегментированного элемента управления. Однако я временно добавил кнопку в мой основной вид и настроил ее с помощью метки доступности, чтобы проверить, будут ли вызовы элементов() или кнопок() впоследствии отображать элемент для основного представления при выполнении моего теста, но эти массивы все еще были возвращающийся как пустой, даже с помощью кнопки.
Вот мой сценарий:
var target = UIATarget.localTarget();
var app = target.frontMostApp();
function selectListView() {
var testName = "selectListView";
UIALogger.logStart(testName);
var view = app.mainWindow().elements()["mainview"];
if (!view.isValid()) {
UIALogger.logFail("Could not locate main view");
}
UIALogger.logMessage("Number of elements for sub element: " + view.elements().length);
var segmentedControl = view.segmentedControls()[0];
if (!segmentedControl.isValid()) {
UIALogger.logFail("Could not locate segmented control on physician collection parent view");
}
var listButton = segmentedControl.buttons()[1];
if (!listButton.isValid()) {
UIALogger.logFail("Could not locate list button on segemented controller on physician collection parent view");
}
UIALogger.logMessage("Tapping List button on physician collection view's segmented control");
listButton.tap();
UIALogger.logPass(testName);
}
selectListView();
Любая помощь очень ценится.
EDIT: Я добавил это в свой скрипт для поиска всей иерархии представлений из главного окна, установил значение метки доступности для моего сегментированного элемента управления в initWithCoder (поскольку я не могу установить его в редакторе раскадровки для сегментированный контроль, как я уже говорил ранее) и до сих пор не удалось найти элемент - это, как будто это просто не в иерархии зрения, хотя это на экране и функции просто отлично:
function traverse(root, name) {
if (root.name() == name) {
return root;
}
var elements = root.elements();
for (var i = 0; i < elements.length; i++) {
var e = elements[i];
var result = traverse(e, name);
if(result != null) {
return result;
}
}
return null;
}
function selectListView() {
var testName = "selectListView";
var segmentedControl = traverse(UIATarget.localTarget().frontMostApp().mainWindow(), "mysegementedcontrol");
if (segmentedControl == null) {
UIALogger.logMessage("Still could not find it");
}
....
}
EDIT: Добавлен вызов app.logElementTree() и все еще не сегментированный контроль в поле зрения («PhysicianCollectionParentView» является моим «основным видом» - вы можете видеть, никаких подэлементов нет):
EDIT: Вот несколько снимков экрана. Первый показывает мой «главный» контроллер вида. Следующее показывает, что в дополнение к сегментированному элементу управления также есть под просмотр UIView. Третий показывает основную точку входа для приложения в моей раскадровке.
Вот расширение класса для моего "мастера" вид контроллера здесь, с указанием точек для сегментированного управления, а другой UIView подвида:
@interface PhysicianCollectionMasterViewController()
@property (strong, nonatomic) IBOutlet UISegmentedControl *viewSelectionControl;
@property (strong, nonatomic) IBOutlet UIView *physicianCollectionView;
@end
EDIT: Вот что-то очень интересное - я решил пойти с совершенно новым скрипт, созданный в инструментах, и использовать функцию записи.Когда я нажал на моем сегментированном управлении, вот JavaScript он создан, чтобы показать мне, как он получил доступ на одну из кнопок на моем сегментированном управлении:
var target = UIATarget.localTarget();
target.frontMostApp().mainWindow().elements()["PhysicianCollectionParentView"].tapWithOptions({tapOffset:{x:0.45, y:0.04}});
Так что, я думаю, наихудший я мог бы что-то вроде этого , но мне просто не кажется, что UI Automation просто не думает, что контроль существует. Так странно. Должно быть, что-то мне не хватает, но моя установка настолько базовая, что я не могу представить, что это может быть.
upvoted, так что вы можете надеяться, что теперь добавьте scree-снимки ... –
Попробуйте вызвать 'app.logElementTree();' из вашего скрипта он будет регистрировать полное дерево элементов для текущего экрана , –
Спасибо за upvote! Также спасибо за информацию о logElementTree(). Я запустил это и разместил вывод здесь. – fogwolf