2013-02-11 19 views
5

Właśnie zaczynam od aplikacji UI Automation dla mojej aplikacji na system iOS i mam już problemy. Nie mogę dołączyć zrzutów ekranu, więc postaram się jak najlepiej opisać mój scenariusz.Element automatyzacji interfejsu użytkownika w systemie iOS Brak podelementów

Buduję na iOS 6.0 i korzystam z storyboardu. Aplikacja uruchamia się na ekranie z kontrolerem nawigacyjnym. Kontroler widoku głównego zawiera główny widok, który ma jedno wyskakujące UIView, które zajmuje dolne 60% ekranu i podzieloną na segmenty kontrolkę, która znajduje się nad tym podzbiorem. Udało mi się skonfigurować dostępność dla głównego widoku (etykieta "mainview"). Jestem w stanie zlokalizować ten element w moim teście bez problemu. Jednak obecnie mam problem ze znalezieniem segmentowanego kontrolera. Zdecydowałem się więc wylogować z "elementu mainview" długości "elementów()" i "segementedControls()", a długość każdej z tablic wynosi 0. Tak więc, kiedy test działa, moja aplikacja mówi, że nie ma -elementy w moim głównym widoku.

Inną rzeczą, na którą należy zwrócić uwagę, jest to, że nie mogłem znaleźć żadnej sekcji ułatwień dostępu w inspektorze tożsamości edytora scenorysów dla kontroli segmentacji. Jednak tymczasowo dodałem przycisk do mojego głównego widoku i skonfigurowałem go za pomocą etykiety dostępności, tylko po to, aby sprawdzić, czy wywołania elements() lub buttons() będą następnie pokazywały element dla widoku głównego podczas uruchamiania mojego testu, ale te tablice były nadal powracający jako pusty, nawet za pomocą przycisku.

Oto mój skrypt:

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(); 

Każda pomoc mile widziana.

EDYCJA: Dodałem to do mojego skryptu, aby przeszukać całą hierarchię widoków z głównego okna, ustawić wartość etykiety dostępności dla kontrolki podzielonej na segmenty w initWithCoder (ponieważ nie wydaje mi się, żeby ustawić ją w edytorze scenorysów dla segmentowy kontrola, jak już wspomniano wcześniej) i wciąż nie mógł znaleźć element - to tak, jakby po prostu nie jest w hierarchii widoku, choć to na ekranie i funkcjonuje dobrze:

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: Dodano wywołanie app.logElementTree() i nadal brak widocznej kontroli segmentu ("PhysicianCollectionParentView" to mój "widok główny" - widać tam brak podelementów):

enter image description here

EDYCJA: Oto kilka zrzutów ekranu. Pierwszy pokazuje mój kontroler widoku "master". Następny pokazuje, że oprócz kontrolki podzielonej na segmenty istnieje również podgląd podrzędny UIView. Trzeci pokazuje podstawowy punkt wejścia dla aplikacji w moim scenorysie.

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

Oto rozszerzenie klasy dla mojego "master" widoku kontrolera tutaj, pokazując wyloty do segmentowej kontroli i drugiej UIView podrzędny:

@interface PhysicianCollectionMasterViewController() 
@property (strong, nonatomic) IBOutlet UISegmentedControl *viewSelectionControl; 
@property (strong, nonatomic) IBOutlet UIView *physicianCollectionView; 
@end 

EDYCJA: Oto coś bardzo interesującego - postanowiłem pójść z zupełnie nowym skrypt stworzony w ramach instrumentów i wykorzystujący funkcję nagrywania.Po kliknięciu na mój segmentowej kontroli, oto JavaScript jest stworzony, aby pokazać mi, jak to się uzyskać jeden z przycisków na moim segmentowej kontroli:

var target = UIATarget.localTarget(); 

target.frontMostApp().mainWindow().elements()["PhysicianCollectionParentView"].tapWithOptions({tapOffset:{x:0.45, y:0.04}}); 

Więc chyba najgorszym przypadku mogę iść z czymś takim , ale to nie ma dla mnie sensu, że UI Automation po prostu nie uważa, że ​​kontrola istnieje. Bardzo dziwne. Musi być coś, czego mi brakuje, ale moja konfiguracja jest tak podstawowa, że ​​nie mogę sobie wyobrazić, co to może być.

+0

przegłosowane, aby można było teraz hopefulyl dodać piargi teraz ... –

+0

Spróbuj wywołać 'app.logElementTree();' ze skryptu zaloguje się do drzewa elementów dla bieżącego ekranu . –

+0

Dzięki za przegraną! Dziękuję również za informacje na temat logElementTree(). Uruchomę to i opublikuję wyniki tutaj. – fogwolf

Odpowiedz

4

Po ustawieniu accessibilityLabel dla elementu i flagi to isAccessibilityElement = YES; z subviews tego elementu są ukryte. Automatyzacji, należy użyć accessibilityIdentifier zamiast accessibilityLabel i ustawić isAccessibilityElement = NO;

W swojej obiektywnej kodu C po physicianCollectionView jest renderowany, zdjąć flagę etykiety i dostępności, a to zrobić w zamian:

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

dla ostatnich elementów w elemencie drzewo, które nie ma widoków podrzędnych, ustawiane jest isAccessibilityElement = YES;

+0

Dzięki, dam ci szansę! – fogwolf

1

Jeśli nie próbował go już, można spróbować dodać opóźnienie na początku skryptu:

UIATarget.localTarget().delay(3); 

myślę, że to jest możliwe, że aplikacja nie jest wykonywana renderowania/animacji przed logElementTree(), który napisałeś powyżej. Dodajemy opóźnienia na początku i pomiędzy każdą zmianą aplikacji w naszych zautomatyzowanych skryptach testowych, aby upewnić się, że ekran zakończył renderowanie.

EDIT: Po aprowizacji z konfiguracją w aplikacji testowej, wierzę, że problemem jest to, że umożliwiają Accessibility na UIView, który zawiera segmentową kontroli. Z dostępnością niepełnosprawnych na UIView, jestem w stanie uzyskać UISegmentedControl do pokazania w drzewie elementu, ale kiedy go włączyć, UIView następnie rozpoczyna wyświetlanie jako UIAElement bez dzieci. Moja propozycja jest taka, aby wyłączyć dostęp do zawierającej UIView i użyć dostępności dla kontroli bazowych tylko (jak przyciski, zobacz tabela komórki, albo zwrot segmentową kontrolę przycisku).

+0

Dzięki. Próbowałem tego, ale spróbuję ponownie. Jaki czas polecasz? Próbowałem 5 sekund, ale podniosę to, żeby zobaczyć. Segmentowana kontrola jest zdecydowanie widoczna, ale może się nią zająć opóźnienie o wystarczającą ilość czasu. – fogwolf

+0

Proszę zobaczyć edycję oryginalnej odpowiedzi. – Bradford2000

+0

To też naprawia to dla mnie! Dziękuję bardzo za poświęcenie tylu czasu, aby mi pomóc. – fogwolf

Powiązane problemy