2013-02-11 4 views
5

Я только начинаю с автоматизации пользовательского интерфейса для моего приложения 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» является моим «основным видом» - вы можете видеть, никаких подэлементов нет):

enter image description here

EDIT: Вот несколько снимков экрана. Первый показывает мой «главный» контроллер вида. Следующее показывает, что в дополнение к сегментированному элементу управления также есть под просмотр UIView. Третий показывает основную точку входа для приложения в моей раскадровке.

This shows the "master" view controller

This shows that in addition to the segmented control there is also an UIView subview

This shows the basic entry point part of my storyboard file

Вот расширение класса для моего "мастера" вид контроллера здесь, с указанием точек для сегментированного управления, а другой 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 просто не думает, что контроль существует. Так странно. Должно быть, что-то мне не хватает, но моя установка настолько базовая, что я не могу представить, что это может быть.

+0

upvoted, так что вы можете надеяться, что теперь добавьте scree-снимки ... –

+0

Попробуйте вызвать 'app.logElementTree();' из вашего скрипта он будет регистрировать полное дерево элементов для текущего экрана , –

+0

Спасибо за upvote! Также спасибо за информацию о logElementTree(). Я запустил это и разместил вывод здесь. – fogwolf

ответ

4

Когда вы устанавливаете accessibilityLabel для элемента и отмечаете его isAccessibilityElement = YES;, подвид этого элемента скрыт. Для автоматизации, следует использовать accessibilityIdentifier вместо accessibilityLabel и установить isAccessibilityElement = NO;

В вашем объектный код C после physicianCollectionView визуализируется, снимите флаг этикетки и доступность и сделать это вместо того, чтобы:

physicianCollectionView.accessibilityIdentifier = @"PhysicianCollectionParentView"; 
physicianCollectionView.isAccessibilityElement = NO; 

Для последних элементов в элементе дерево, которое не имеет подменю, установить isAccessibilityElement = YES;

+0

Спасибо, я сделаю это! – fogwolf

1

Если вы еще не пробовали это уже, вы можете попробовать добавить задержку в начале вашего скрипта:

UIATarget.localTarget().delay(3); 

Я думаю, что это возможно, что ваше приложение не будет сделано рендеринг/анимация, прежде чем logElementTree(), который вы разместили выше. Мы добавляем задержки в начале и между каждым переходом приложения в наших автоматизированных тестовых сценариях, чтобы убедиться, что экран завершил рендеринг.

РЕДАКТИРОВАТЬ: После того, как вы включили свою установку в тестовое приложение, я считаю, что ваша проблема заключается в том, что вы разрешаете доступность в UIView, которая содержит сегментированный элемент управления. Если в UIView отключена доступность, я могу получить UISegmentedControl для отображения в дереве элементов, но после ее включения UIView начинает отображаться как UIAElement без каких-либо дочерних элементов. Мое предложение состоит в том, чтобы отключить доступность для содержащего UIView и использовать только доступность для базовых элементов управления (например, кнопок, ячеек таблицы или элемента управления с сегментированными кнопками).

+0

Спасибо. Я попробовал это, но попробую еще раз. Какую продолжительность вы рекомендуете? Я пробовал 5 секунд, но буду подпрыгивать, чтобы увидеть. Сегментированный контроль определенно виден, но, возможно, задержка на достаточное время позаботится об этом. – fogwolf

+0

См. Редактирование исходного ответа. – Bradford2000

+0

Это исправляет это для меня тоже! Большое спасибо за то, что вы потратили много времени, чтобы помочь мне. – fogwolf

Смежные вопросы