Основы

В этой главе представлены базовые знания, связанные с автоматизацией Android. Пожалуйста, обязательно прочтите описание в этой главе, так как в дальнейшем мы не будем повторяться. Автоматизация Android имеет существенные отличия от обычной веб-автоматизации, но также и много общего. В обычной веб-автоматизации можно легко просмотреть структуру веб-страницы и информацию, такую как ID элементов, с помощью инструментов разработчика F12, а затем использовать XPATH для получения элементов и выполнения операций, таких как клики и ожидания. В Android логика схожа: вы также можете использовать так называемые селекторы для выбора элементов и выполнения операций, таких как клики и проверки, так что не беспокойтесь о сложности вхождения.

Сходства и различия между мобильной и веб-автоматизацией

Между мобильной и веб-автоматизацией много общего, но, конечно, есть и много различий. Возьмем в качестве примера Selenium. Обычно для управления веб-страницей с помощью Selenium вам нужны три вещи: во-первых, браузер, во-вторых, WebDriver, и в-третьих, Selenium. Конечно, в мобильной автоматизации все так же: мобильный телефон эквивалентен браузеру, FIRERPA — WebDriver, а Python-библиотека FIRERPA, то есть lamda, — Selenium. Их цели совпадают: эмуляция действий пользователя для тестирования, сбора данных или автоматического выполнения задач. И то, и другое управляется скриптами, которые выполняют операции по поиску элементов, кликам, созданию скриншотов и проверкам. С этой точки зрения они действительно очень похожи.

Но они также и различны. Во-первых, для мобильной автоматизации вам нужен мобильный телефон и компьютер, в то время как веб-автоматизацию можно выполнять на вашем собственном компьютере. Кроме того, они используют разные подходы. Для веба распространены такие инструменты, как Selenium, Puppeteer, Playwright. Для мобильных устройств обычно используются FIRERPA, AutoJS, Appium, uiautomator и другие.

Для веба основные методы поиска элементов основаны на структуре HTML DOM, такие как xpath или csspath, и иерархия элементов относительно интуитивно понятна. Для мобильных устройств основным методом поиска являются селекторы, хотя интерфейсы приложений Android также используют XML-разметку, так что вы можете использовать xpath и для XML. Обычно в веб-автоматизации не нужно слишком беспокоиться о проблемах совместимости; в большинстве случаев их можно обойти, зафиксировав браузер и разрешение экрана при запуске. Но для Android, из-за различий между устройствами разных марок и моделей, размер экрана, версия системы и другие факторы могут влиять на совместимость кода автоматизации. Но не бойтесь, хотя влияние есть, оно невелико.

Различия между различными инструментами автоматизации

Как упоминалось выше, между несколькими распространенными инструментами автоматизации для Android также есть много различий. Сразу обозначим нашу позицию: FIRERPA — самый стабильный, функциональный, мощный и наиболее подходящий для проектного управления и применения инструмент автоматизации.

Примечание

Наша позиция — это не предвзятость, а результат 6 лет непрерывных исследований и оптимизаций. Мы прошли через все те же трудности и ошибки, с которыми вы можете столкнуться.

AutoJS

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

Appium

Appium, часто используемый тестировщиками, имеет архитектуру C/S и лучше подходит для кластерного управления, чем AutoJS. Однако у него есть очевидные недостатки: поскольку он подходит для автоматизации большинства систем, поддерживая не только Android, но и IOS, он громоздкий и раздутый, что делает его очень неудобным для крупномасштабного развертывания.

u2

Наконец, uiautomator2, также с архитектурой C/S, более точен по сравнению с Appium и достаточно минималистичен, без лишних функций, все как раз по делу. Но почему мы от него отказались? Основная причина — нестабильность при работе с несколькими устройствами. Во-вторых, логика автоматической установки подходит для новичков, но для профессионального кластерного управления она избыточна и трудно контролируема, к тому же проект не поддерживается.

Конечно, все они хорошо подходят для обычного использования. Но мы идем не совсем обычным путем, потому что в бизнесе редко бывает так, что требуется только автоматизация. Например, есть задача: протестировать определенное приложение, при этом необходимо записывать запросы, ответы, время запросов и т.д. Подумайте, как бы вы это сделали. Я думаю, что в вашем решении либо будет много ручных операций, либо оно будет крайне нестабильным или несовместимым. В мире FIRERPA вы можете выполнять все операции с помощью кода. Вы работаете только с кодом, а стабильность и совместимость — это забота FIRERPA. На самом деле, нам не следует сравнивать себя с ними, потому что по функциональности FIRERPA является надмножеством всех вышеперечисленных решений; он включает в себя все уроки, извлеченные из наших ошибок и пройденного пути.

Основной процесс автоматизации

Обычно вам нужно предварительно исследовать решение: будет ли это только обычная автоматизация, или же потребуется сбор данных о работе приложения одновременно с автоматизацией. Как правило, у вас есть два способа сбора данных: во-первых, перехват HTTP/s-коммуникаций с помощью "человека посередине" (Man-in-the-Middle), во-вторых, перехват данных с помощью хуков (Hook). Метод "человека посередине" проще и подходит для обычного использования, но может не работать с некоторыми приложениями. Метод с хуками требует обширных знаний в области обратной разработки, сложен для новичков и подходит для использования в специфических случаях.

Сбор данных через "человека посередине"

Метод "человека посередине" довольно прост. Вам нужно найти в документации разделы об установке сертификата "человека посередине" и настройке прокси, и использовать это в сочетании с mitmproxy. Если вы совсем не знакомы с этим, вы можете обратиться к нашему официальному скрипту startmitm.py, в котором уже написана вся необходимая логика, которую вы можете скопировать или использовать повторно.

Сбор данных через хуки

Метод с хуками требует от вас наличия начальных и выше знаний в области обратной разработки. Если вы раньше не слышали об этом, то пока можете не рассматривать этот вариант. В общих чертах, метод с хуками заключается в написании скриптов Frida для перехвата вызовов соответствующих функций, получения параметров или возвращаемых значений и их отправки, внедрения в приложение и т.д. Вы можете ознакомиться с простым демо и способом использования в главе "Использование Frida для отправки данных".

Код автоматизации

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

Удаленный рабочий стол

Теперь откройте приложение, которое вы хотите автоматизировать, а затем нажмите на значок "глаза" в правом верхнем углу удаленного рабочего стола. Вы увидите следующий интерфейс. Теперь выберите элемент, с которым хотите взаимодействовать, и кликните по нему, чтобы просмотреть информацию об элементе.

Совет

Конечно, приложение можно открыть и с помощью кода, об этом будет написано позже.

Выбор элемента

Вы можете видеть информацию об элементе справа, такую как text, resourceId и т.д. Теперь мы хотим кликнуть по этому элементу, для этого напишем следующий код. Смысл этого кода: "кликнуть по элементу, у которого text равен '同意' (Согласен)".

d(text="同意").click()

Примечание

Это всего лишь пример. Существует много способов написания селекторов, здесь показан только самый простой.

Итак, вы ознакомились с самым простым способом. Теперь напишите управляющую логику с if-else, используя exists и другие интерфейсы, и вы сможете реализовать целый процесс автоматизации. Видите, это не так уж и сложно.

Инспектор макета интерфейса

В нормальных условиях написание кода автоматизации неотделимо от инспектора макета интерфейса, это единственный способ получить условия для селектора. Сначала вам нужно открыть удаленный рабочий стол устройства в браузере. Затем нажмите на значок глаза в правом верхнем углу удаленного рабочего стола, чтобы войти в режим инспектора макета. Теперь вы можете кликать по пунктирным рамкам на левом экране, чтобы просмотреть информацию о соответствующем элементе. Вы можете использовать его атрибуты в качестве параметров селектора. Повторное нажатие на значок глаза закроет инспектор макета. Инспектор макета не обновляется при изменении страницы; он всегда показывает макет экрана на момент нажатия горячей клавиши. Для обновления макета вручную нажмите CTRL + R.

Инспектирование элемента

Подсказка

Вы также можете нажать клавишу TAB в режиме инспектора макета, чтобы перебирать и просматривать все элементы.

Селектор интерфейса

Селектор (Selector) используется для взаимодействия с элементами Android. Вы можете рассматривать его как аналог правил Xpath; хотя они и отличаются, их назначение в целом одинаково. В FIRERPA селектор — это Selector, но в большинстве случаев вам не придется напрямую работать с этим классом. Вы уже видели его в предыдущем тексте. Полный список его необязательных параметров выглядит следующим образом.

Тип соответствияОписание
textПолное совпадение текста
textContainsТекст содержит указанную подстроку
textStartsWithТекст начинается с указанной подстроки
classNameСовпадение по имени класса
descriptionПолное совпадение описания
descriptionContainsОписание содержит указанную подстроку
descriptionStartsWithОписание начинается с указанной подстроки
clickableЭлемент кликабелен
longClickableЭлемент поддерживает долгое нажатие
scrollableЭлемент прокручиваемый
resourceIdСовпадение по ID ресурса

В большинстве случаев в качестве параметров используются resourceId, text, description, textContains и т.д. Если у элемента есть нормальный resourceId, предпочтительно использовать его в качестве селектора, например, d(resourceId="com.xxx:id/mobile_signal"). В противном случае используется text, например, d(text="Нажмите для входа"), или более нечеткий вариант d(textContains="Нажмите"). description используется аналогично text, но реже.

Подсказка

Селектор (Selector) конструируется из основных параметров, полученных вами с помощью функции инспектора макета интерфейса, описанной выше.

Определение координат экрана

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

Как известно, у изображений есть разрешение, и у экранов тоже. Для экрана Android, будь то в портретной, альбомной ориентации или с автоповоротом, верхний левый угол всегда принимается за начало координат (0,0), а система координат расширяется вправо и вниз. X — это горизонтальная ось, Y — вертикальная, как показано на рисунке.

Координаты экрана

Из рисунка выше видно, что координаты верхнего левого угла экрана — 0,0, верхнего правого — 1080,0, левого нижнего — 0,1920, а правого нижнего — 1080,1920. Вы можете использовать эту информацию для расчета координат любой точки на экране.

Примечание

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

Точка на экране

В FIRERPA есть два определения, касающиеся экрана. Некоторые операции, такие как клики или создание скриншотов, требуют от вас предоставления информации об области или координатах. Для обычных точек координат мы используем следующее определение, которое представляет точку с координатами 100,100 на экране.

Point(x=100, y=100)

Определение области

Определение области представляет собой прямоугольную область на экране. Его определение немного сложнее, пожалуйста, прочтите внимательно. Мы используем Bound для представления области на экране. Он требует от вас четыре параметра: top, left, bottom, right. Это может вас немного смутить, поэтому, пожалуйста, внимательно разберитесь в следующем: top представляет расстояние в пикселях от верхнего края прямоугольника до верхнего края экрана, left — расстояние от левого края прямоугольника до левого края экрана, right — расстояние от правого края прямоугольника до левого края экрана, bottom — расстояние от нижнего края прямоугольника до верхнего края экрана. В общем, вы можете понимать все расстояния как расстояния от начала координат по осям X и Y. Ниже мы используем рисунок для лучшего понимания. Экран телефона по-прежнему 1080x1920, устройство в данный момент находится в портретном режиме.

Область экрана

Теперь предположим, что экран разделен на четыре равные части, и нам нужно получить определения для двух областей, показанных на рисунке: верхней левой и нижней правой. Согласно правилам, для области 1 расстояние от верхнего края прямоугольника до верхнего края экрана равно 0 пикселей, от левого края до левого края экрана — 0 пикселей, от нижнего края до верхнего края экрана — 960 пикселей (1920÷2), от правого края до левого края экрана — 540 пикселей (1080÷2). Таким образом, ее определение должно быть:

Bound(top=0, left=0, right=540, bottom=960)

Аналогично, для области 2 расстояние от верхнего края прямоугольника до верхнего края экрана составляет 960 пикселей, от левого края до левого края экрана — 540 пикселей, от правого края до левого края экрана — 1080 пикселей, от нижнего края до верхнего края экрана — 1920 пикселей. Следовательно, определение второго прямоугольника будет:

Bound(top=960, left=540, right=1080, bottom=1920)

Данные приложений Android

Каждое приложение Android на устройстве имеет специальный каталог для хранения своих данных. Обычно данные приложения хранятся в каталоге /data. Вы можете получить каталог данных приложения, вызвав интерфейс d.application("com.example").info(). В большинстве случаев вы также можете напрямую перейти в каталог пользователя, выполнив cd /data/user/0/com.example.test. Помимо обычного каталога /data, некоторые приложения также хранят мультимедийные и другие файлы в каталоге /sdcard/Android.

Просмотр базы данных SMS

Иногда вам может быть интересно, где хранятся полученные на устройстве SMS. Это отличная идея, и это очень просто. Вы даже можете написать расширение (extension), чтобы напрямую читать содержимое и получать его в реальном времени через HTTP-интерфейс! Мы будем следовать стандартному подходу для Android. Если у вас все по-другому, пожалуйста, адаптируйте подход самостоятельно. На Android имя приложения для SMS должно быть com.android.mms, поэтому мы можем напрямую перейти в каталог /data/user/0/com.android.mms. С помощью следующих операций вы увидите несколько баз данных в каталоге databases, и mmssms.db — это наша цель.

 λ 10:12 /data/user/0/com.android.mms ➥ ls -la
total 82
drwx------    7 u0_a78   u0_a78        3452 Jan  2  2021 .
drwxrwx--x  381 system   system       53248 May  2 16:46 ..
drwxrws--x    3 u0_a78   u0_a78_c      3452 Jan  2  2021 cache
drwxrws--x    2 u0_a78   u0_a78_c      3452 Jan  2  2021 code_cache
drwxrwx--x    2 u0_a78   u0_a78        3452 Jan  2  2021 databases
drwxrwx--x    7 u0_a78   u0_a78       24576 Feb 26 13:43 files
drwxrwx--x    2 u0_a78   u0_a78        3452 May  4 10:12 shared_prefs
 λ 10:12 /data/user/0/com.android.mms ➥ ls -l databases/
total 504
-rw-rw----    1 u0_a78   u0_a78       24576 Jan  2  2021 dynamic_bubble
-rw-------    1 u0_a78   u0_a78           0 Jan  2  2021 dynamic_bubble-journal
-rw-rw----    1 u0_a78   u0_a78      491520 Feb 27 04:18 mmssms.db
-rw-------    1 u0_a78   u0_a78           0 Jan  2  2021 mmssms.db-journal
 λ 10:12 /data/user/0/com.android.mms ➥

Конечно, чтение очень простое, потому что в Android базы данных обычных приложений — это SQLite. Однако некоторые приложения с высоким уровнем безопасности обычно шифруют свои базы данных. Но FireRPA настолько мощный, что, конечно же, у него есть решение. FireRPA может не только читать обычные SQLite, но и поддерживает чтение в реальном времени различных типов баз данных, таких как WeChat (sqlcipher) aes-256, Work WeChat aes-128, приложения Alibaba (sqlcrypto) aes-128 и другие (конечно, при условии, что вы сами найдете ключ). Ниже мы просто продемонстрируем, как прочитать содержимое системных SMS. Это очень просто, достаточно одной команды. Конечно, вы также можете написать расширение для чтения.

sqlite3 databases/mmssms.db .dump

Конечно, вывод будет большим, но вы сможете быстро найти в нем нужную таблицу с данными, а затем самостоятельно составить SQL-запрос. Этот метод подходит для 98% приложений Android, остальные 2% — это зашифрованные базы данных.

Просмотр зашифрованных баз данных

Для этих зашифрованных баз данных вам нужно самостоятельно найти ключ или способ его вычисления. Ниже мы кратко расскажем, как читать базы данных соответствующего программного обеспечения. Мы покажем только, как использовать PRAGMA для предварительной установки ключа. Если вы не понимаете, что это, пожалуйста, сначала изучите SQLite.

Серия WeChat (sqlcipher)

PRAGMA cipher = "sqlcipher";
PRAGMA legacy = 1;
PRAGMA key = "database-key";

Work WeChat (wxsqlite)

PRAGMA cipher = "aes128cbc";
PRAGMA hexkey = "database-key"

Серия Alibaba (sqlcrypto)

PRAGMA cipher = "sqlcrypto";
PRAGMA key = "database-key"

Подсказка

Базы данных приложений Android не обязательно находятся в каталоге `databases`.

Просмотр других данных

Конечно, в каталоге данных приложения есть не только базы данных, но и некоторые параметры, конфигурации, кэш, файлы, такие как shared_prefs (xml) и т.д. Мы не будем подробно на этом останавливаться, вы можете исследовать это самостоятельно.

Вспомогательные меры автоматизации

В задачах автоматизации не все приложения подходят для поиска элементов с помощью селекторов. Некоторые интерфейсы, например, в играх, рендерятся в реальном времени и не имеют макета на уровне Android. Поэтому для таких приложений вы можете использовать только OCR или сопоставление изображений для определения операций. Мы предоставляем полное решение для OCR, а также встроенные решения для сопоставления изображений SIFT и по шаблону для помощи в достижении этих бизнес-целей. Вы можете найти соответствующие интерфейсы и способы их использования в документации.

Обновляется...