Платформа автоматизированного тестирования мобильных приложений — основы UiAutomator2
Платформа автоматизированного тестирования мобильных приложений — основы UiAutomator2

Предисловие

Давным-давно я использовал uiautomator+java для практики автоматизации тестирования приложений Android, но сегодня я хочу упомянуть не uiautomator, а uiautomator2. Похоже, что uiautomator2 — это обновленная версия uiautomator, но эти две платформы похожи только по названию и не имеют реальной связи.

1. Прошлая и настоящая жизнь uiautomator/uiautomator2

Адрес проекта: https://github.com/openatx/uiautomator2

1.Официальное введение документа

2. Разберитесь с контекстом

  • Есть Google uiautomator, но он поддерживает только Java;
  • Позже разработчик по имени hexiaocong инкапсулировал версию Python на основе uiautomator для поддержки запуска кода Python;
  • вдохновленный этим,uiautomator2Автор разработалuiautomator2。Таким образом, их порядок рождения должен быть:uiautomator(Google издание)-->uiautomator(pythonверсия)-->uiautomator2

3. Сравнение трех кадров

рамка

Поддерживаемые языки

Функции

uiautomator

java

Открытый исходный код от Google, поддерживает только Android

xiaocong/uiautomator

python

Открытый исходный код, поддерживает только Android

uiautomator2

python

Открытый исходный код, поддерживает только Android

2. Знакомство с uiautomator2

1. Состав проекта

  • uiautomator-server: основной сервис
  • minicap: скринкастинг в реальном времени и снимки экрана в реальном времени.
  • minitouch: для точного управления устройствами в реальном времени
  • atx-agent: демон, работающий на устройстве, разработанный Go и используемый для поддержания активности связанных служб на устройстве.
  • weditor: аналог uiautomatorviewer, вспомогательного редактора, специально разработанного для этого проекта.

2. Принцип работы

1) Обязанности каждого отдела
  • Python: написание сценариев для инициации HTTP-запросов к мобильным устройствам;
  • Мобильное устройство: запускает http-сервис, инкапсулирующий uiautomator2, анализирует запрос, инициированный скриптом Python, и преобразует его в код, который может распознаваться uiautomator2;
2) Запуск процесса
  1. Запустите демон atx-agent на мобильном устройстве, а затем atx-agent запустит службу uiautomator2 и прослушивает порт по умолчанию 7912;
  2. Напишите на ПК скрипт Python и выполните его (эквивалент отправки HTTP-запроса на серверную часть мобильного устройства);
  3. Мобильное устройство получает HTTP-запрос от ПК через WIFI или USB и выполняет указанную операцию для управления мобильным устройством;

3. Строительство окружающей среды

1.Установить uiautomator2

Язык кода:javascript
копировать
pip install uiautomator2
pip install -U weditor  # Установить редактор

2.Инициализируйте устройство

Язык кода:javascript
копировать
python -m uiautomator2 init

Если инициализация прошла успешно, появится следующее приглашение:

Когда к ПК или Linux-серверу подключено несколько устройств adb, «python -m uiautomator2 init» инициализирует все устройства по умолчанию. Если вы указываете устройство для инициализации, вам необходимо использовать параметр «--serial»:

Язык кода:javascript
копировать
python -m uiautomator2 init --serial $SERIAL  # $SERIAL — серийный номер мобильного телефона, доступ к которому можно получить через adb. устройства Просмотреть

3.Что вы делали во время инициализации?

Выполнение команды «python -m uiautomator2 init» автоматически установит на телефон кучу всего:

  • app-uiautomator.apk
  • app-uiautomator-test.apk
  • atx-agent
  • minicap
  • minitouch

Для получения дополнительной информации см.: https://github.com/openatx/uiautomator2/wiki/Manual-Init.

4. Основные операции

1. Подключите устройство

uiautomator2 предоставляет 3 метода подключения

1) Подключитесь через Wi-Fi
Язык кода:javascript
копировать
import uiautomator2 as u2

d = u2.connect('10.0.0.1') # alias for u2.connect_wifi('10.0.0.1')
print(d.info)
2) Подключитесь через USB
Язык кода:javascript
копировать
import uiautomator2 as u2

d = u2.connect('123456f') # alias for u2.connect_usb('123456f')
print(d.info)
3) Подключитесь через ADB WiFi.
Язык кода:javascript
копировать
import uiautomator2 as u2

d = u2.connect_adb_wifi("10.0.0.1:5555")

# Эквивалентно
# + Shell: adb connect 10.0.0.1:5555
# + Python: u2.connect_usb("10.0.0.1:5555")

2. Инструменты командной строки

1) Скриншот
Язык кода:javascript
копировать
uiautomator2 screenshot test.jpg
2) Получите текущую регистрацию приложения и активность.
Язык кода:javascript
копировать
uiautomator2 current
3) Удалить приложение
Язык кода:javascript
копировать
uiautomator2 uninstall <package-name> # Удалить пакет
uiautomator2 uninstall <package-name-1> <package-name-2> # Удалить несколько пакетов
uiautomator2 uninstall --all # Удалить все
4) Остановите приложение
Язык кода:javascript
копировать
$ uiautomator2 stop com.example.app # Остановить приложение
$ uiautomator2 stop --all # Остановить все приложения

3. Расположение элемента

1) Общие методы позиционирования

ui2 поддерживает все методы позиционирования в классе UiSelector в Android. Подробную информацию можно найти на официальном сайте: https://developer.android.com/reference/android/support/test/uiautomator/UiSelector. Только несколько распространенных методов позиционирования. перечислены ниже:

Метод позиционирования

описывать

text

Позиция по тексту

textMatches

Позиционирование по регулярному совпадению текста

className

Найти по названию класса

classNameMatches

Позиционирование посредством регулярного сопоставления названий классов

description

Позиция через атрибут desc

descriptionMatches

Обычное позиционирование с помощью атрибута desc

resourceId

Найти по идентификатору ресурса

resourceIdMatches

Позиционирование через регулярное сопоставление идентификатора ресурса

2) Расположение дочерних элементов и расположение родственных элементов
① Позиционирование дочернего элемента-child
Язык кода:javascript
копировать
#Находим элемент Bluetooth по имени класса android.widget.ListView
d(className="android.widget.ListView").child(text="Bluetooth")
# Следующие два метода позиционирования несколько неточны и не рекомендуются.
d(className="android.widget.ListView")\
.child_by_text("Bluetooth",allow_scroll_search=True)
d(className="android.widget.ListView").child_by_description("Bluetooth")
② Позиционирование родственного элемента
Язык кода:javascript
копировать
#Найти тот же уровень, что и в Google,Элемент с именем класса android.widget.ImageView
d(text="Google").sibling(className="android.widget.ImageView")
③Цепной вызов
Язык кода:javascript
копировать
d(className="android.widget.ListView", resourceId="android:id/list") \
  .child_by_text("Wi‑Fi", className="android.widget.LinearLayout") \
  .child(className="android.widget.Switch") \
  .click()
3) Относительное позиционирование
Язык кода:javascript
копировать
d(A).left(B),# Выберите B слева от A.
d(A).right(B),# Выберите B справа от A.
d(A).up(B), #Выберите B над A
d(A).down(B),# Выберите B под A
#выбирать WIFI правая кнопка переключения
d(text='Wi‑Fi').right(resourceId='android:id/widget_frame')
4) Xpath-позиционирование

Java uiautoamtorсередина по умолчанию не поддерживает xpath. Это расширение ui2, и скорость будет сравниваться с другими методами. ложить медленнее. Найдите середину в xpath, описании ui2середина. Позиционирование необходимо заменить на content-desc, resourcesId. Необходимо заменить идентификатором ресурса

Язык кода:javascript
копировать
# Будет возвращен только один элемент. Если элемент не найден, будет сообщено об ошибке XPathElementNotFoundError.
# Если найдено несколько элементов, по умолчанию будет возвращен 0-й.
d.xpath('//*[@resource-id="com.android.launcher3:id/icon"]')

# Если возвращено несколько элементов, вам нужно использовать метод all() для возврата списка.
# При использовании allметода, если элемент не найден, об ошибке не будет сообщено и будет возвращен пустой список.
d.xpath('//*[@resource-id="com.android.launcher3:id/icon"]').all()

4. Часто используемые API для элементов

метод

описывать

возвращаемое значение

Примечание

exists()

Определить, существует ли элемент

True,Flase

@property

info()

Возвращает всю информацию об элементе

словарь

@property

get_text()

Возвращаемый текст элемента

нить

set_text(text)

Установить текст элемента

None

clear_text()

Очистить текст элемента

None

center()

Возвращает положение центральной точки элемента

(x,y)

Очки на основе всего экрана

send_keys()

Отправить текст

Примеры использования:

Язык кода:javascript
копировать
d(test="Settings").exists
d.exists(text='Wi‑Fi',timeout=5)

5. Взаимодействие с устройством

1) Одиночный/двойной щелчок
Язык кода:javascript
копировать
d(text='Settings').click()  # щелкнуть
d.double_click(x, y)
d.double_click(x, y, 0.1) # Дважды щелкните интервал времени по умолчанию 0,1 с.
2) Длительное нажатие
Язык кода:javascript
копировать
d(text='Settings').longclick()  # Длительное нажатие
3) Слайд
Язык кода:javascript
копировать
# "left", "right", "up", "down"
d(text="Settings").swipe("up", steps=20)  # Элемент сдвигается вверх с шагом 20.
d(text="Settings").swipe("down", steps=20)  # Элемент скользит вниз
d(text="Settings").swipe("left", steps=20)  # Элемент сдвигается влево
d(text="Settings").swipe("right", steps=20)  # Элемент сдвигается вправо
4) Перетащите
Язык кода:javascript
копировать
d(text="Settings").drag_to(text="Clock", duration=0.25)  # Перетащите на элемент на 0,25 секунды.
d(text="Settings").drag_to(877,733)  # Перетащите в определенную точку координат на экране. Длительность по умолчанию составляет 0,5 секунды.
5) Управление двумя пальцами (увеличение/уменьшение элементов)
Язык кода:javascript
копировать
d(text="Settings").pinch_in()  # уменьшить масштаб
d(text="Settings").pinch_out()  # увеличить
6) Подождите, пока элементы появятся/исчезнут.
Язык кода:javascript
копировать
d(text="Settings").wait(timeout=3.0)  # Подождите, пока появится элемент
d(text='Settings').wait_gone(timeout=20)  # Подождите, пока элемент исчезнет, ​​и верните True Ложь, время ожидания по умолчанию равно глобально установленному времени ожидания.
7) Прокрутка экрана
Язык кода:javascript
копировать
# Прокрутите страницу вертикально вверх/прокрутите горизонтально до крайнего левого края.
d(scrollable=True).scroll.toBeginning()
d(scrollable=True).scroll.horiz.toBeginning()
# Прокрутите страницу вертикально вниз/прокрутите горизонтально вправо
d(scrollable=True).scroll.toEnd()
d(scrollable=True).scroll.horiz.toEnd()
# Прокрутка по вертикали назад до указанной позиции/Прокрутка по горизонтали вправо до указанной позиции
d(scrollable=True).scroll.to(description="Указать местоположение")
d(scrollable=True).scroll.horiz.to(description="Укажите местоположение")
# Прокрутка вперед по вертикали (так же, как и по горизонтали)
d(scrollable=True).scroll.forward()
# Прокрутите вперед по вертикали до указанной позиции (то же самое применимо и по горизонтали)
d(scrollable=True).scroll.forward.to(description="указанное местоположение")
# Прокрутите, пока не появится элемент «Система».
d(scrollable=True).scroll.to(text="System")
8) Работа с текстовым полем
Язык кода:javascript
копировать
d.send_keys("test")
d.clear_text()  # Очистить поле ввода
9) Операция тоста
Язык кода:javascript
копировать
# Получить всплывающее сообщение. Если всплывающее сообщение не найдено, возвращается содержимое по умолчанию.
d.toast.get_message(timout=5,default='no toast')
# Очистить кеш тостов
d.toast.reset()
10) Мониторинг операций
Язык кода:javascript
копировать
# Удалить мониторинг ANR
d.watcher.remove("ANR")

# Удалить весь мониторинг
d.watcher.remove()

# Начать фоновый мониторинг
d.watcher.start()
d.watcher.start(2.0) # Интервал мониторинга по умолчанию составляет 2,0 с.

# Принудительно запустить весь мониторинг
d.watcher.run()

# Прекратить мониторинг
d.watcher.stop()

# Остановиться и Удалить весь мониторинг,Обычно используется для инициализации
d.watcher.reset()

Дополнительные сведения об API см. на странице https://github.com/openatx/uiautomator2.

5. Расположение элементов редактора

1. Запустите службу редактора.

Язык кода:javascript
копировать
python -m weditor

2. Посетите редактора

Порт по умолчанию — 17310, адрес доступа: http://localhost:17310/, подключите мобильный телефон к ПК (убедитесь, что режим отладки USB включен), нажмите «Подключиться», чтобы подключить устройство, когда значок «Подключиться» станет зеленым. , соединение успешно.

3. Отладка интерфейса

Редактор предоставляет элемент Метод, благодаря которому вы получаете то, что выполняете операцию. позиционирования,При двойном нажатии значка или кнопки на экране,Поле «Кодирование» в правой части интерфейса редактора будет синхронно отображать код для операций с элементами.,При этом мобильный интерфейс также будет синхронно переключать страницы.

благодарный

Пожалуйста, обратитесь к следующей части содержания:

  1. https://www.cnblogs.com/fnng/p/8486863.html
  2. https://testerhome.com/topics/11357
  3. https://blog.csdn.net/Master724/article/details/107962349?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163394586216780265448858%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163394586216780265448858&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-107962349.pc_search_ecpm_flag&utm_term=uiautomator2&spm=1018.2226.3001.4187
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose