iOS / UI Automation: UIAActionSheet не имеет возможности манипулировать кнопками

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

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

4 Solutions collect form web for “iOS / UI Automation: UIAActionSheet не имеет возможности манипулировать кнопками”

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

var arrButtons = objActionSheet.buttons(); 

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

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

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

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

Я нашел решение проблемы, используя симуляцию прямого нажатия. Это не отличное решение, но, по крайней мере, оно работает. Я задал тот же вопрос на форуме разработчиков 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; } } 

Поскольку мой лист действий был в popover, он возвращает элемент nil:

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

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

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

Но у него есть nil elements () и buttons ().

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

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

Если вам нравится держать его организованным, как я:

 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(); } 
  • Поиск учебника об автоматизации реальных iOS-устройств с Appium
  • Есть ли хороший способ сценариев сетевых тестов с использованием UIAutomation на iOS
  • Как проверить имя метки в представлении таблицы с помощью инструментов iOS?
  • Если «Идентификатор специальных возможностей» предназначен для тестов автоматизации UI, почему он включен в локализованные ресурсы?
  • Как получить идентификатор Bundle вашего приложения iOS
  • Функция Xcode INSTRUMENTS для проверки пропускной способности / сбоя кажется сломанной в Xcode 4.6
  • Как я могу автоматически протестировать функциональность приложений iOS и Android?
  • Распределение XCODE
  • UIAutomation через командную строку на реальном устройстве
  • Использование памяти журнала Xcode Automated UI
  • как я могу улучшить iPhone UI Automation?
  • Interesting Posts

    Как переключаться между источником входного аудиосигнала (Bluetooth, встроенным микрофоном) с использованием AVFoundation

    Разве нам не нужно больше привязывать фреймворк к проекту XCode?

    Штриховые коды запроса Firebase, содержащиеся в случайно сгенерированных ключах

    Не удается получить доступ к отношениям «один ко многим» в CoreData с помощью Swift

    Запрос FBSessionNewPublishPermissions выходит из строя до ответа

    Xcode 8.3 Предупреждения Linker

    Классы JamVM за пределами ядра java на iPhone

    как приложение iOS может установить скорость передачи данных Core Bluetooth?

    Swift: Основные данные на устройстве IOS7 -> entityForName для второго объекта – nil

    импортирование быстрой структуры в проект объектно-ориентированного проекта

    Как вы можете протестировать содержимое обработчика UIAlertAction с помощью OCMock

    requestLocation () всегда терпит неудачу в симуляторе с Swift 2

    Этот класс не является ключевым кодом, совместимым с @IBInspectable

    Как правильно обосновать текст на iOS 7

    Core Data возвращает NSArrays вместо NSStrings

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.