Я пытаюсь создать пешеход с помощью XCode 7 XCTest UI, который систематически исследует детерминированное дерево табличных представлений на заданную глубину. Он почти работает, за исключением того, что я не могу надежно определить, действительно ли нажатие на какой-либо данный элемент вызвало переход на новый экран. У меня есть хакерский метод, который работает большую часть времени, чтобы обнаружить, что либо наклейка навигационной панели изменилась, либо изменилось количество элементов меню.
Первый тест имеет ложные негативы, потому что на последовательных экранах могут быть одинаковые ярлыки навигационных баров (кодовая база, которую я хожу, не моя). Второй тест имеет ложные срабатывания, потому что иногда нажатие на элемент таблицы не переходит на другую таблицу/экран, а вместо этого добавляет дополнительные элементы к текущему экрану.
После некоторого чтения казалось, что использование меток доступности может быть способом. Поэтому я устанавливаю идентификатор UID для метки доступности навигационной панели в коде приложения (в viewDidAppear), а затем тестирую его в тестовом коде UI. Кажется, что это должно работать, но я только когда-либо возвращаю значение nil в тестовом коде.
Я буду свободно признаваться, что я - noob, когда речь заходит о тестировании пользовательского интерфейса, и в основном это сокращение/вставка/адаптация кода других людей без четкого понимания того, что я делаю. Поэтому я, вероятно, делаю какую-то наивную ошибку, в самом коде метки доступности и, возможно, на концептуальном уровне для обнаружения того, что экран изменился; возможно, там что-то гораздо более простое/более идиоматическое, чем я мог бы делать.
В приложении:
- (void)viewDidAppear: (BOOL)animated {
[super viewDidAppear: animated];
//...
UINavigationBar* navBar = self.navigationController.navigationBar;
if( navBar )
{
static NSInteger s_UID = 0;
navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++];
}
}
В тесте XCTest UI:
- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app
{
NSString* result = NULL;
XCUIElementQuery *navBars = app.navigationBars;
XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0];
if( firstElem )
{
result = (NSString*)firstElem.accessibilityLabel; // This is always nil
}
return result;
}
Обратите внимание, что firstElem IS найден, и что я могу извлечь, например. firstElem.label от него очень счастливо.
Любая помощь была оценена.