iOS / UI Automation: UIAActionSheet не имеет возможности манипулировать кнопками - PullRequest
2 голосов
/ 09 марта 2011

Мой вопрос связан с шаблоном автоматизации пользовательского интерфейса из инструмента инструментов XCode.Как UI Automation поддерживает тестирование UIActionSheet?Я знаю, что есть элемент UIAActionSheet, и я смог получить его в своем приложении.Но я не знаю, как получить и манипулировать кнопками из листа действий.UI Automation не предоставляет никаких элементов для этих кнопок.Документация по UI Automation также не содержит никакой информации по этому вопросу.Смотрите ссылку ниже.Похоже, этот элемент управления не использует класс UIButton для кнопок и отображает их определенным образом.Не могли бы вы дать мне некоторую подсказку, как получить доступ к кнопкам из UIAActionSheet?Спасибо.

http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Reference/UIAActionSheetClassReference/UIAActionSheet/UIAActionSheet.html#//apple_ref/doc/uid/TP40009895

Ответы [ 4 ]

6 голосов
/ 17 марта 2011

Я нашел решение этой проблемы с помощью моделирования прямого постукивания.Это не отличное решение, но, по крайней мере, оно работает.Я задал тот же вопрос на форуме разработчиков Apple, но не получил никакого ответа.

Итак, функция ниже - мое решение.Я проверил это, и это хорошо работает.Я все еще продолжу искать лучший подход.

function tapActionSheetButton(target, actionSheet, buttonIndex)
{
    var headerHeight = 28;
    var buttonHeight = 50;

    if (buttonIndex >= 0) 
    {
        var actionSheetRect = actionSheet.rect();
        UIALogger.logMessage("actionSheet:{rect:{origin:{x:" + actionSheetRect.origin.x.toString() 
                             + ", y:" + actionSheetRect.origin.y.toString()
                             + "}, size:{width:" + actionSheetRect.size.width.toString()
                             + ", height:" + actionSheetRect.size.height.toString()
                             + "}}}");
        var xOffset = actionSheetRect.size.width / 2;
        var yOffset = headerHeight + buttonIndex * buttonHeight + buttonHeight / 2;
        if (yOffset < actionSheetRect.size.height) {
            var tap_x = actionSheetRect.origin.x + xOffset;
            var tap_y = actionSheetRect.origin.y + yOffset;
            target.tap({x:tap_x, y:tap_y});
        }
    }
    else
    {
        var message = "Cannot tap button " + buttonIndex.toString() + ". It does not exist";
        throw message;
    }
}
5 голосов
/ 10 марта 2011

Как вы можете видеть, есть метод возврата кнопки по умолчанию для каждого листа действий, то есть кнопка Отмена. Поскольку нет других кнопок «по умолчанию» для листа действий, вам нужно реализовать их самостоятельно.
Стоит отметить, что ссылка на worth apple является пропуском методов для данного класса, которые унаследованы от parent. UIAActionSheet (как и большинство элементов UIA) наследует все методы из класса UIAElement. Проверьте эту ссылку . Вы должны быть в состоянии получить массив всех кнопок из таблицы действий, вызвав

var arrButtons = objActionSheet.buttons();

Затем вы можете проверить по имени свойства, какое вам нужно (снова метод из UIAElement name()).

Аллитеративно, если вы проверите, какой элемент массива вас интересует, вы можете вызвать эту кнопку напрямую (при условии, что вы не измените ActionSheet), используя метод UIAElement elements().
Например, если вы хотите нажать на вторую кнопку в дереве ActionSheet, просто позвоните

UIATarget.localTarget().frontMostApp().actionSheet().elements()[1].tap();

Возможно, вы можете пропустить localTarget (), не уверен, но приведенный выше код должен работать.

0 голосов
/ 04 ноября 2013

Если вы хотите, чтобы все было организовано, как я:

function getTarget() {
    return UIATarget.localTarget();
}

function getApp() {
    return getTarget().frontMostApp();
}

function getWindow() {
    return getApp().mainWindow();
}

function tapActionSheetButtonInIndex(index) {
    var actionSheet = getApp().actionSheet() || getWindow().popover().actionSheet();
    actionSheet.buttons()[index].tap(); 
}
0 голосов
/ 08 марта 2013

Так как мой лист действий был в поповере, это возвращает ноль элемента:

UIATarget.localTarget().frontMostApp().actionSheet();

Это действительно возвращает лист действия:

UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet();

Но он имеет ноль элементов ()Кнопки ().

Поэтому я использовал функцию MikhailV, чтобы нажимать кнопки.

var target = UIATarget.localTarget();
var actionSheet = UIATarget.localTarget().frontMostApp().mainWindow().popover().actionSheet();
var buttonIndex = 1;

tapActionSheetButton(target, actionSheet, buttonIndex);
...