<style>.lazy{display:none}</style>Автоматизация системных приложений iOS и Android с помощью Appium

Автоматизация системных приложений iOS и Android с помощью Appium

Перевод статьи «Automating System Apps with Appium — iOS and Android».

В этой статье мы рассмотрим, как автоматизировать определенный тип приложений – приложения, встроенные в саму ОС телефона. Замечательная особенность технологии Appium заключается в том, что в зависимости от используемого драйвера мы можем автоматизировать не только установленные нами приложения. Мы можем автоматизировать любые приложения, которые окажутся на устройстве, включая встроенные или системные.

БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"
Системные приложения на iOS
Системные приложения на iOS

Системные приложения в iOS – это такие, как КалендарьНастройки или Карты. Наше приложение может взаимодействовать с некоторыми из этих встроенных приложений, поэтому часто бывает полезно иметь возможность автоматизировать и их.

Хитрость автоматизации системных приложений на iOS заключается в том, что нужно обязательно знать идентификатор их пакета (bundle ID). Это уникальный идентификатор, который присваивается каждому приложению его разработчиком. В случае с приложениями Apple их идентификаторы начинаются с com.apple. Списки, в которых указаны идентификаторы пакета каждого приложения для каждой версии iOS, доступны онлайн.

Bundle ID для встроенных приложений iOS
Bundle ID для iOS

Чтобы запустить системное приложение, необходимо настроить наши Capabilities (“возможности”). Для нашего тестового приложения мы используем его Capabilities, чтобы указать URL-адрес или путь к локальному файлу, по которому файл приложения можно загрузить или получить. Но вместо этого мы можем использовать идентификатор пакета. Так что мы можем вставить bundle ID любого встроенного или другого приложения, установленного на симуляторе, и оно будет работать.

Шапка для запуска системного приложения iOS
Шапка для запуска системного приложения iOS
# capability для использования вашего собственного приложения
CAPS = {
  "platformName": "iOS",
  ...,
  "appium:app": "/path/to/test.ipa"
}
# или
CAPS.setdefault("appium:app", "/path/to/test.ipa")
# capability для использования системного приложения
CAPS = {
  "platformName": "iOS",
  ...,
  "appium:app": "com.apple.Preferences"
}
# или
CAPS.setdefault("appium:app", "com.apple.Preferences")

В Android также есть системные приложения, такие как КонтактыНастройки и т. д. Иногда и приложения Google, например Фотографии, уже установлены по умолчанию.

Системные приложения на Android
Системные приложения на Android

Приложения для Android, как и приложения для iOS, имеют свои уникальные идентификаторы. В мире Android такой идентификатор называется package ID. Эта информация нужна нам для запуска системных приложений на Android.

Однако для Android нам нужна еще одна информация, и это так называемая “Activity” (“активность, деятельность”). Приложения для Android могут быть разделены на несколько Activity, и системе необходимо знать, какую конкретно мы хотим запустить.

В таблице ниже мы видим идентификатор пакета и соответствующее имя действия, используемые для запуска различных системных приложений Android. Например, для запуска приложения Настройки (Settings) нам понадобится как идентификатор пакета com.android.settings, так и название активности .Settings.

Идентификатор пакета и активность для Android
Идентификаторы пакетов и Activity для Android

В Android, как и в случае с iOS, нам нужно настроить наши Capabilities, чтобы запустить системное приложение. Обычно мы используем Capabilities приложения, чтобы указать APK-файл для загрузки. Но теперь вместо этого мы используем комбинацию двух других Capabilities,  appPackage и appActivity. В качестве значения для Capability appPackage мы указываем идентификатор пакета, а в качестве значения для Capability appActivity – активность запуска.

Шапка для запуска системного приложения Android
Шапка для запуска системного приложения Android
# capability для использования вашего собственного приложения
CAPS = {
  "platformName": "Android",
  ...,
  "appium:app": "/path/to/test.apk"
}
# или
CAPS.setdefault("appium:app", "/path/to/test.app")
# capabilities для использования системного приложения
CAPS = {
"platformName": "Android",
  ...,
  "appium:appPackage": "com.android.settings",
  "appium:appActivity": ".Settings"
}
# или
CAPS.setdefault("appium:appPackage": "com.android.settings")
CAPS.setdefault("appium:appActivity": ".Settings")

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

симулятор iOS и эмулятор Android
Запустите мобильные устройства и сервер Appium

В редакторе PyCharm я работаю с файлами system_apps_android.py и system_apps_ios.py. У нас есть все стандартные шаблоны, за исключением списка URL-адресов приложений для загрузки с помощью Appium. Это из-за того, что мы собираемся автоматизировать встроенные системные приложения.

Типичные Capabilities, которые мы используем в наших установках для Android и iOS, не будут работать в их нынешнем виде, так что давайте исправим этот момент. Сначала заполним наши Capabilities для Android. Нам нужны Capabilities appPackage и appActivity, поэтому мы добавим их.

Мы будем использовать Capability appPackage для запуска приложения Settings, которое имеет идентификатор пакета com.android.settings. Мы также добавим Capability appActivity, значение которой должно быть .Settings. Значения используем те же, которые уже видели выше в статье.

Теперь нам нужно выполнить ту же задачу для iOS, добавив соответствующую возможность приложения. Поэтому мы добавим Capability app со значением com.apple.Preferences.

Поскольку на данном этапе нам важно только запустить приложения и больше ничего с ними не делать, я просто добавлю метод sleep, чтобы убедиться, что приложение запустилось. Поэтому я напишу time.sleep и задам ожидание в пять секунд.

driver = webdriver.Remote(APPIUM, CAPS)
try:
    time.sleep(5) # for demo only - to observe the app launch
    print(driver.page_source)
finally:
    if driver is not None:
        driver.quit()

Но мы также хотим что-что сделать с приложениями позже, поэтому просто распечатаем исходный текст каждого приложения. Таким образом после завершения теста мы сможем проверить его вручную и убедиться, что Appium увидел внутри системного приложения все, что нужно. Итак, выведем в консоль нативный источник страницы приложения, который мы получим, вызвав driver.page_source.

Сначала запустим Android-версию теста. У нас есть эмулятор Android и сервер Appium. Я выполню команду python3 system_apps_android.py в терминале. Мы видим, что Appium действительно запустил приложение Settings на этом эмуляторе.

запуск приложения Settings в Android-версии теста
Посмотреть запись HD-видео можно здесь: https://youtu.be/tnDiCR8lUdk.

Теперь давайте проверим iOS. Выполним команду python3 system_apps_ios.py для запуска теста. После этого мы увидим, как Appium начинает сессию. Приложение Settings загрузилось, как и ожидалось.

И если мы вернемся в PyCharm IDE, то увидим, что тест не только выполнился без проблем, но и действительно распечатал XML-вывод, который показывает нативные элементы, составляющие приложение Settings на iOS-симуляторе.

запуск приложения Settings в iOS-версии теста
Посмотреть запись HD-видео можно здесь: https://youtu.be/0UqPioH1l10.

Таким образом, с Appium мы можем автоматизировать все аспекты работы устройства, даже приложения, которые мы не писали сами.

🔗 Python код, XML вывод, GIFыhttps://github.com/lana-20/appium-system-apps.

🔗 Видео выполнения тестаhttps://youtu.be/tnDiCR8lUdk (Android) и https://youtu.be/0UqPioH1l10 (iOS).

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *