Обработка предупреждения с помощью UIAutomation

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

Я запускаю свой тест в инструментах, появляется предупреждение, но мой обработчик никогда не вызывается. Кто-нибудь мог использовать обработчики событий с помощью UIAutomation?

Спасибо, Винсент.

Ответ 1

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

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

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

Ответ 2

Убедитесь, что UI Automation script все еще работает, когда отображается UIAlertView.

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

// Wait for UIAlert to appear so that UIATarget.onAlert gets called.
target.frontMostApp().alert();

Я понял это, тщательно прочитав и поняв Руководство для разработчиков: автоматизация тестирования пользовательского интерфейса, которую я настоятельно рекомендую сделать в качестве введения в автоматизацию пользовательского интерфейса.

Также может быть полезно просмотреть ссылку на класс UIATarget, в частности методы popTimeout, pushTimeout, setTimeout, timeout и delay.

Ответ 3

Следующий код работает для меня. Функция обрабатывает предупреждение, и в журналах печатается "alert Shown".

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

Ответ 4

@vdaubry решение прост.

В соответствии с документацией Apple, если вы хотите обрабатывать предупреждения вручную, вы должны вернуть true вместо false в onAlert(alert)

 UIATarget.onAlert = function onAlert(alert) {
    UIALogger.logMessage("alertShown");
    return true;
}

@Drew Crawford задержки не будут работать, потому что по умолчанию кнопка может быть нажата с помощью UI Automation. Документация не является неправильной, но это неясно объяснено.

Ответ 5

У меня также была проблема с "никогда не вызываемым предупреждением". Просто перезапустив apple Instruments, я решил это для меня:-).

Ответ 6

например. - onAlert не называется

var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap()
UIAtarget.onAlert = function onAlert(alert)
{...}

-

например. - onAlert называется

var target = UIATarget.localTarget(); 
UIAtarget.onAlert = function onAlert(alert)
{......}
target.buttons()["ShowAlert"].tap()

или

#import "onAlert.js"
var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap()

Попробуйте.

Ответ 7

Следующий фрагмент работает для меня на XCode 6.3.1 и инструментах (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();