Обработка оповещения с помощью МАУ-автоматики


Я пытаюсь проверить наличие 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 14

7 ответов:

Документация, по-видимому, неверна. Оказывается, что оповещения обрабатываются в том же потоке, который пытается запустить ваш скрипт. Поэтому, если вы хотите, чтобы обработчик оповещений был вызван, вам нужно спать, например,

UIATarget.onAlert = { ... }
window.buttons().triggerAlertButton.tap();
UIATarget.localTarget().delay(4);

Кроме того, похоже, что имя и значение предупреждения всегда имеют значение null. Тем не менее, я смог получить доступ к первому статическому тексту, который содержал заголовок предупреждения.

Убедитесь, что сценарий автоматизации пользовательского интерфейса все еще работает, когда отображается UIAlertView.

Например, добавление следующей строки в конец скрипта будет поддерживать его работу до тех пор, пока не появится предупреждение или не истечет льготный период разрешения объекта.

// Wait for UIAlert to appear so that UIATarget.onAlert gets called.
target.frontMostApp().alert();
Я понял это, тщательно прочитав и поняв руководство пользователя Instruments: Automating UI Testing , которое я настоятельно рекомендую сделать в качестве введения в автоматизацию пользовательского интерфейса.

Это также может быть полезно. чтобы просмотреть ссылку на класс 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();