Обработка оповещения с помощью МАУ-автоматики
Я пытаюсь проверить наличие UIAlertView с помощью UIAutomation, но мой обработчик никогда не вызывается.
В начале моего javascript я пишу:
UIATarget.onAlert = function onAlert(alert) {
UIALogger.logMessage("alertShown");
return false;
}
Насколько я понимаю, как только я указываю свою функцию onAlert, она должна вызываться при появлении alertView во время моих тестов. Поэтому я запускаю тест, который показывает alertView, вот код, который показывает предупреждение:
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:message message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
alertView.accessibilityLabel = @"alerte d'avertissement";
[alertView show];
Я запускаю тест в инструментах, появляется предупреждение, но мой обработчик никогда не вызывается. Имеет кто-нибудь мог использовать обработчики событий с помощью МАУ ?
Спасибо, Винсент.
7 ответов:
Документация, по-видимому, неверна. Оказывается, что оповещения обрабатываются в том же потоке, который пытается запустить ваш скрипт. Поэтому, если вы хотите, чтобы обработчик оповещений был вызван, вам нужно спать, например,
UIATarget.onAlert = { ... } window.buttons().triggerAlertButton.tap(); UIATarget.localTarget().delay(4);
Кроме того, похоже, что имя и значение предупреждения всегда имеют значение null. Тем не менее, я смог получить доступ к первому статическому тексту, который содержал заголовок предупреждения.
Убедитесь, что сценарий автоматизации пользовательского интерфейса все еще работает, когда отображается
UIAlertView
.Например, добавление следующей строки в конец скрипта будет поддерживать его работу до тех пор, пока не появится предупреждение или не истечет льготный период разрешения объекта.
Я понял это, тщательно прочитав и поняв руководство пользователя Instruments: Automating UI Testing , которое я настоятельно рекомендую сделать в качестве введения в автоматизацию пользовательского интерфейса.// Wait for UIAlert to appear so that UIATarget.onAlert gets called. target.frontMostApp().alert();
Это также может быть полезно. чтобы просмотреть ссылку на класс UIATarget , в частности методы
popTimeout
,pushTimeout
,setTimeout
,timeout
, иdelay
.
Приведенный ниже код работает для меня. Функция обработки уведомления и "уведомления показаны" печатается в журналах.
var target = UIATarget.localTarget(); var application = target.frontMostApp(); var window = application.mainWindow(); UIATarget.onAlert = function onAlert(alert){ UIALogger.logMessage("alert Shown"); } target.frontMostApp().mainWindow().tableViews()[0] .cells()["Fhgui"].buttons()["Images"].tap(); // Alert detected. Expressions for handling alerts // should be moved into the UIATarget.onAlert function definition. target.frontMostApp().alert().defaultButton().tap();
@vdaubry решение простое.
Согласно документации Apple, если вы хотите обрабатывать оповещения вручную, то вы должны вернуть
true
вместоfalse
вonAlert(alert)
UIATarget.onAlert = function onAlert(alert) { UIALogger.logMessage("alertShown"); return true; }
@Drew Crawford задержки не будут работать, потому что по умолчанию кнопка can нажата UI Automation. Документация не ошибочна, но она не имеет четкого объяснения.
У меня тоже была проблема "никогда не вызывал обработчик предупреждений". Просто перезапуск инструментов apple решил эту проблему для меня : -).
Например, оналерт не называется
var target = UIATarget.localTarget(); target.buttons()["ShowAlert"].tap() UIAtarget.onAlert = function onAlert(alert) {...}
-
Например, оналерт называется
var target = UIATarget.localTarget(); UIAtarget.onAlert = function onAlert(alert) {......} target.buttons()["ShowAlert"].tap()
Или
#import "onAlert.js" var target = UIATarget.localTarget(); target.buttons()["ShowAlert"].tap()
Попробуйте.
Следующий фрагмент работает для меня на XCode 6.3.1 & Instruments(6.3.1 (6D1002)):
var target = UIATarget.localTarget(); // Following line shows an internal alert with 'Cancel' & 'Continue' buttons target.frontMostApp().mainWindow().buttons()["ShowAlert"].tap(); // Handle an internal alert UIATarget.onAlert = function onAlert(alert) { return true; } // Perform Tap on alert. target.frontMostApp().alert().buttons()["Continue"].tap();