Давным-давно я использовал uiautomator+java для практики автоматизации тестирования приложений Android, но сегодня я хочу упомянуть не uiautomator, а uiautomator2. Похоже, что uiautomator2 — это обновленная версия uiautomator, но эти две платформы похожи только по названию и не имеют реальной связи.
Адрес проекта: https://github.com/openatx/uiautomator2
2. Разберитесь с контекстом
рамка | Поддерживаемые языки | Функции |
---|---|---|
uiautomator | java | Открытый исходный код от Google, поддерживает только Android |
xiaocong/uiautomator | python | Открытый исходный код, поддерживает только Android |
uiautomator2 | python | Открытый исходный код, поддерживает только Android |
pip install uiautomator2
pip install -U weditor # Установить редактор
python -m uiautomator2 init
Если инициализация прошла успешно, появится следующее приглашение:
Когда к ПК или Linux-серверу подключено несколько устройств adb, «python -m uiautomator2 init» инициализирует все устройства по умолчанию. Если вы указываете устройство для инициализации, вам необходимо использовать параметр «--serial»:
python -m uiautomator2 init --serial $SERIAL # $SERIAL — серийный номер мобильного телефона, доступ к которому можно получить через adb. устройства Просмотреть
Выполнение команды «python -m uiautomator2 init» автоматически установит на телефон кучу всего:
Для получения дополнительной информации см.: https://github.com/openatx/uiautomator2/wiki/Manual-Init.
uiautomator2 предоставляет 3 метода подключения
import uiautomator2 as u2
d = u2.connect('10.0.0.1') # alias for u2.connect_wifi('10.0.0.1')
print(d.info)
import uiautomator2 as u2
d = u2.connect('123456f') # alias for u2.connect_usb('123456f')
print(d.info)
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")
uiautomator2 screenshot test.jpg
uiautomator2 current
uiautomator2 uninstall <package-name> # Удалить пакет
uiautomator2 uninstall <package-name-1> <package-name-2> # Удалить несколько пакетов
uiautomator2 uninstall --all # Удалить все
$ uiautomator2 stop com.example.app # Остановить приложение
$ uiautomator2 stop --all # Остановить все приложения
ui2 поддерживает все методы позиционирования в классе UiSelector в Android. Подробную информацию можно найти на официальном сайте: https://developer.android.com/reference/android/support/test/uiautomator/UiSelector. Только несколько распространенных методов позиционирования. перечислены ниже:
Метод позиционирования | описывать |
---|---|
text | Позиция по тексту |
textMatches | Позиционирование по регулярному совпадению текста |
className | Найти по названию класса |
classNameMatches | Позиционирование посредством регулярного сопоставления названий классов |
description | Позиция через атрибут desc |
descriptionMatches | Обычное позиционирование с помощью атрибута desc |
resourceId | Найти по идентификатору ресурса |
resourceIdMatches | Позиционирование через регулярное сопоставление идентификатора ресурса |
#Находим элемент 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")
#Найти тот же уровень, что и в Google,Элемент с именем класса android.widget.ImageView
d(text="Google").sibling(className="android.widget.ImageView")
d(className="android.widget.ListView", resourceId="android:id/list") \
.child_by_text("Wi‑Fi", className="android.widget.LinearLayout") \
.child(className="android.widget.Switch") \
.click()
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')
Java uiautoamtorсередина по умолчанию не поддерживает xpath. Это расширение ui2, и скорость будет сравниваться с другими методами. ложить медленнее. Найдите середину в xpath, описании ui2середина. Позиционирование необходимо заменить на content-desc, resourcesId. Необходимо заменить идентификатором ресурса
# Будет возвращен только один элемент. Если элемент не найден, будет сообщено об ошибке XPathElementNotFoundError.
# Если найдено несколько элементов, по умолчанию будет возвращен 0-й.
d.xpath('//*[@resource-id="com.android.launcher3:id/icon"]')
# Если возвращено несколько элементов, вам нужно использовать метод all() для возврата списка.
# При использовании allметода, если элемент не найден, об ошибке не будет сообщено и будет возвращен пустой список.
d.xpath('//*[@resource-id="com.android.launcher3:id/icon"]').all()
метод | описывать | возвращаемое значение | Примечание |
---|---|---|---|
exists() | Определить, существует ли элемент | True,Flase | @property |
info() | Возвращает всю информацию об элементе | словарь | @property |
get_text() | Возвращаемый текст элемента | нить | |
set_text(text) | Установить текст элемента | None | |
clear_text() | Очистить текст элемента | None | |
center() | Возвращает положение центральной точки элемента | (x,y) | Очки на основе всего экрана |
send_keys() | Отправить текст |
Примеры использования:
d(test="Settings").exists
d.exists(text='Wi‑Fi',timeout=5)
d(text='Settings').click() # щелкнуть
d.double_click(x, y)
d.double_click(x, y, 0.1) # Дважды щелкните интервал времени по умолчанию 0,1 с.
d(text='Settings').longclick() # Длительное нажатие
# "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) # Элемент сдвигается вправо
d(text="Settings").drag_to(text="Clock", duration=0.25) # Перетащите на элемент на 0,25 секунды.
d(text="Settings").drag_to(877,733) # Перетащите в определенную точку координат на экране. Длительность по умолчанию составляет 0,5 секунды.
d(text="Settings").pinch_in() # уменьшить масштаб
d(text="Settings").pinch_out() # увеличить
d(text="Settings").wait(timeout=3.0) # Подождите, пока появится элемент
d(text='Settings').wait_gone(timeout=20) # Подождите, пока элемент исчезнет, и верните True Ложь, время ожидания по умолчанию равно глобально установленному времени ожидания.
# Прокрутите страницу вертикально вверх/прокрутите горизонтально до крайнего левого края.
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")
d.send_keys("test")
d.clear_text() # Очистить поле ввода
# Получить всплывающее сообщение. Если всплывающее сообщение не найдено, возвращается содержимое по умолчанию.
d.toast.get_message(timout=5,default='no toast')
# Очистить кеш тостов
d.toast.reset()
# Удалить мониторинг 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.
python -m weditor
Порт по умолчанию — 17310, адрес доступа: http://localhost:17310/, подключите мобильный телефон к ПК (убедитесь, что режим отладки USB включен), нажмите «Подключиться», чтобы подключить устройство, когда значок «Подключиться» станет зеленым. , соединение успешно.
Редактор предоставляет элемент Метод, благодаря которому вы получаете то, что выполняете операцию. позиционирования,При двойном нажатии значка или кнопки на экране,Поле «Кодирование» в правой части интерфейса редактора будет синхронно отображать код для операций с элементами.,При этом мобильный интерфейс также будет синхронно переключать страницы.
Пожалуйста, обратитесь к следующей части содержания: