Перевод статьи «Automating System Apps with Appium — iOS and Android».
В этой статье мы рассмотрим, как автоматизировать определенный тип приложений – приложения, встроенные в саму ОС телефона. Замечательная особенность технологии Appium заключается в том, что в зависимости от используемого драйвера мы можем автоматизировать не только установленные нами приложения. Мы можем автоматизировать любые приложения, которые окажутся на устройстве, включая встроенные или системные.
БЕСПЛАТНО СКАЧАТЬ КНИГИ в телеграм канале "Библиотека тестировщика"
Системные приложения в iOS – это такие, как Календарь, Настройки или Карты. Наше приложение может взаимодействовать с некоторыми из этих встроенных приложений, поэтому часто бывает полезно иметь возможность автоматизировать и их.
Хитрость автоматизации системных приложений на iOS заключается в том, что нужно обязательно знать идентификатор их пакета (bundle ID). Это уникальный идентификатор, который присваивается каждому приложению его разработчиком. В случае с приложениями Apple их идентификаторы начинаются с com.apple
. Списки, в которых указаны идентификаторы пакета каждого приложения для каждой версии iOS, доступны онлайн.
Чтобы запустить системное приложение, необходимо настроить наши Capabilities (“возможности”). Для нашего тестового приложения мы используем его Capabilities, чтобы указать URL-адрес или путь к локальному файлу, по которому файл приложения можно загрузить или получить. Но вместо этого мы можем использовать идентификатор пакета. Так что мы можем вставить bundle ID любого встроенного или другого приложения, установленного на симуляторе, и оно будет работать.
# 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, как и приложения для iOS, имеют свои уникальные идентификаторы. В мире Android такой идентификатор называется package ID. Эта информация нужна нам для запуска системных приложений на Android.
Однако для Android нам нужна еще одна информация, и это так называемая “Activity” (“активность, деятельность”). Приложения для Android могут быть разделены на несколько Activity, и системе необходимо знать, какую конкретно мы хотим запустить.
В таблице ниже мы видим идентификатор пакета и соответствующее имя действия, используемые для запуска различных системных приложений Android. Например, для запуска приложения Настройки (Settings) нам понадобится как идентификатор пакета com.android.settings
, так и название активности .Settings
.
В Android, как и в случае с iOS, нам нужно настроить наши Capabilities, чтобы запустить системное приложение. Обычно мы используем Capabilities приложения, чтобы указать APK-файл для загрузки. Но теперь вместо этого мы используем комбинацию двух других Capabilities, appPackage и appActivity. В качестве значения для Capability appPackage мы указываем идентификатор пакета, а в качестве значения для Capability appActivity – активность запуска.
# 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 на каждом из них.
В редакторе 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 на этом эмуляторе.
Теперь давайте проверим iOS. Выполним команду python3 system_apps_ios.py
для запуска теста. После этого мы увидим, как Appium начинает сессию. Приложение Settings загрузилось, как и ожидалось.
И если мы вернемся в PyCharm IDE, то увидим, что тест не только выполнился без проблем, но и действительно распечатал XML-вывод, который показывает нативные элементы, составляющие приложение Settings на iOS-симуляторе.
Таким образом, с Appium мы можем автоматизировать все аспекты работы устройства, даже приложения, которые мы не писали сами.
? Python код, XML вывод, GIFы: https://github.com/lana-20/appium-system-apps.
? Видео выполнения теста: https://youtu.be/tnDiCR8lUdk (Android) и https://youtu.be/0UqPioH1l10 (iOS).