2010-09-06 2 views
14

Я пытаюсь проверить наличие UIAlertView с UIAutomation, но мой обработчик никогда не вызван.Обработка предупреждения с 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?

Thanks, Vincent.

ответ

19

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

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

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

+0

Во многих случаях, когда элемент не имеет имя, указанное но имеет статический текст внутри, этот текст может быть используется как свойство имени ... для меня, который работал на кнопки, представления, таблицы .... – yoosiba

+2

привет, им тоже такая же проблема. может ли мне уйти, как получить статический txt из alertview? заранее заблаговременно – cancerian

+1

@cancerian в функции обратного вызова 'onAlert', попробуйте' alert.logElementTree() '. Отсюда я вижу, что 'alert.name()' является его 'title' и' alert.elements() [2] .name() 'является его' message'. – ma11hew28

0

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

4

Этот код работает для меня. Функция обрабатывает предупреждение, и в журналах печатается «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(); 
6

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

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

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

Я понял это, тщательно читая & понимание Instruments User Guide: Automating UI Testing, который я настоятельно рекомендую это делать, как введение в UI Automation.

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

+0

Это исправило мою проблему. Вызов '.alert()' будет ждать до 5 секунд (по умолчанию, настраивается с помощью 'target.setTimeout'), чтобы он отображался. –

0

, например. - 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() 

Попробуйте.

3

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

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

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

@Drew Кроуфорд задержки не будет работать, так как по умолчанию может нажимается кнопка с помощью пользовательского интерфейса Автоматизация. Документация не ошибается, но это неясно объяснено.

0

После сниппет работает для меня на 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();