파이썬 ANDROID 자동화 UIAUTOMATOR2
uiautomator2 는 Android 자동화 테스트 프레임워크입니다. Android 플랫폼에서만 자동화된 테스트를 지원하는 자동화된 테스트 오픈 소스 도구입니다. 이는 Google의 자체 uiautomator2 테스트 프레임워크를 캡슐화하고 Python을 지원하는 모든 시스템에서 실행될 수 있습니다.
오픈소스 라이브러리 주소 : https://github.com/openatx/uiautomator2
uiautomator2 설치
pip install -U uiautomator2
#설치후 확인
import uiautomator2 as u2
d = u2.connect()
print(d.info)
장치 정보가 올바르게 출력되면 설치가 성공한 것입니다.
편집기 설치
pip를 사용하여 설치
pip install -U weditor
#웹 브라우저가 뜨면 설치가 잘된겁니다.
python -m weditor
ANDROID 자동화 작동원리
python-uiautomator2는 주로 Python 클라이언트와 모바일 장치의 두 부분으로 나뉩니다.
- Python : 스크립트를 실행하고 HTTP 요청을 모바일 장치로 보냅니다.
- 모바일 장치 : uiautomator2를 캡슐화하는 HTTP 서비스는 모바일 장치에서 실행되고 수신된 요청을 구문 분석한 후 이를 uiautomator2 코드로 변환합니다.
모바일 장치에 atx-agent(데몬 프로세스)를 설치한 다음 atx-agent uiautomator2 서비스(기본 포트 7912)를 시작하여 수신합니다. ,PC에서 테스트 스크립트를 작성하고 실행합니다.(모바일 장치의 서버측에 HTTP 요청을 보내는 것과 동일)모바일 장치는 WIFI 또는 USB를 통해 PC로부터 HTTP 요청을 수신하고 지정된 작업을 수행합니다.
지원되는 포지셔닝 메서드
uiautomator2는 안드로이드의 UiSelector 클래스에 있는 모든 포지셔닝 메서드를 지원하며, 자세한 내용은 이 URL https://developer.android.com/reference/android/support/test/uiautomator/UiSelector 에서 확인할 수 있습니다.
| 이름 | 설 명 |
|---|---|
| text | text 텍스트를 지정하는 요소입니다. |
| textContains | text 지정된 텍스트를 포함하는 요소를 포함합니다. |
| textMatches | text 지정된 규칙성과 일치하는 요소 |
| textStartsWith | text 지정된 텍스트로 시작하는 텍스트 요소 |
| className | className은 클래스 이름을 지정하는 요소입니다. |
| classNameMatches | className은 클래스 이름이 지정된 일반 패턴과 일치하는 요소 |
| description | description 텍스트의 요소입니다. |
| descriptionContains | description 지정된 텍스트의 요소가 포함 |
| descriptionMatches | description 지정된 패턴과 일치하는 설명의 요소 |
| descriptionStartsWith | description 지정한 텍스트로 시작하는 요소 |
| checkable | 확인 가능한 요소, 매개변수는 True, False |
| checked | 체크된 요소로, 일반적으로 확인란에 사용되며 매개변수는 True, False |
| clickable | 클릭 가능 요소, True, False |
| longClickable | True, False 인수를 사용하여 길게 클릭할 수 있는 요소 |
| scrollable | 스크롤할 수 있는 요소로, True, False |
| enabled | True, False 매개변수를 사용하여 요소를 활성화 |
| focusable | focusable 설정 가능 요소, True, False |
| focused | 포커스를 받은 요소로, 매개변수는 True, False |
| selected | 현재 선택된 요소, 매개변수는 True, False |
| packageName | packageName 지정된 패키지 이름을 가진 요소 |
| packageNameMatches | packageName은 일반 요소입니다. |
| resourceId | resourceId는 지정된 콘텐츠가 있는 요소 |
| resourceIdMatches | resourceId 는 지정된 일반 패턴과 일치하는 요소 |
엘리먼트용 공통 API
프로퍼티로 장식된 클래스 속성 메서드는 아래 예시에 나와 있습니다.
| 방법론 | 설명 | 반환 | 비 고 |
|---|---|---|---|
| exists() | 요소가 존재하는지 여부를 판단합니다. | True,Flase | @property |
| info() | 엘리먼트에 대한 모든 정보를 반환합니다. | dict | @property |
| get_text() | 엘리먼트의 텍스트를 반환합니다. | 문자열 | |
| set_text(text) | 엘리먼트 텍스트를 설정합니다. | ||
| clear_text() | 요소의 텍스트를 지웁니다. | ||
| center() | 요소의 중심 위치를 반환합니다. | (x,y) |
사용방법
클릭
# 특정 UI 객체의 중앙을 클릭합니다.
d(text="Settings").click()
# 최대 10초 동안 요소가 표시될 때까지 기다린 다음 클릭합니다.
d(text="Settings").click(timeout=10)
# 오프셋으로 클릭(x_offset, y_offset)
d(text="Settings").click(offset=(0.5, 0.5)) # Default center
d(text="Settings").click(offset=(0, 0)) # click left-top
d(text="Settings").click(offset=(1, 1)) # click right-bottom
# 10초 안에 존재할 때 클릭, 기본 타임아웃 0초
clicked = d(text='Skip').click_exists(timeout=10.0)
# 요소가 사라질 때까지 클릭, bool 반환
is_gone = d(text="Skip").click_gone(maxretry=10, interval=1.0)
# 요소가 나타날 때까지 기다립니다.
d(text="Settings").wait(timeout=3.0)
# 요소가 사라질 때까지 기다렸다가 True False를 반환하고,
타임아웃 기본값은 전역적으로 설정된 대기 시간으로 설정합니다.
d(text='Settings').wait_gone(timeout=20)
# 세로로 페이지 상단으로 / 가로로 가장 왼쪽으로 스크롤합니다.
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")
# 특정 UI 객체의 중앙을 길게 클릭합니다.
d(text="Settings").long_click()
# 위젯 스크린샷 찍기
im = d(text="Settings").screenshot()
im.save("settings.jpg")
입력
d.send_keys('hello')
# 입력 상자 지우기
d.clear_text()
#2가지 enter
d.press('enter')
d.keyevent('enter')
슬라이딩
# 놓지 않고 누르는 시뮬레이션하기
touch.down(x, y)
# 3초 동안 정지
touch.sleep(x, y)
# 이동 시뮬레이션
touch.move(x, y)
# 위로 시뮬레이션
touch.up(x,y)
# 길게 누르기 구현, 같은 지점에서 5초 동안 잠자기 후 들어 올리는 동작 구현
d.touch.down(252,1151).sleep(5).up(252,1151)
# 4점 패턴을 구현하여 잠금 해제, 현재는 좌표점만 지원합니다.
d.touch.down(252,1151).move(559,1431).move(804,1674).move(558,1666).up(558,1666)
장치연결
# PC가 하나의 디바이스에만 연결되어 있을 때 사용할 수 있습니다.
d = u2.connect()
# PC가 디바이스와 동일한 네트워크 있는 경우, USB 케이블을 연결하지 않고도
IP 주소와 포트 번호를 사용하여 WIFI를 통해 연결할 수 있습니다.
connect("10.0.0.1:7912")
connect("10.0.0.1") # 기본 7912 포트 사용
connect("http://10.0.0.1")
connect("http://10.0.0.1:7912")
# 장치가 두 개 이상인 경우 장치 번호를 사용하여 연결할 장치를 지정할수도 있습니다.
connect("cff1123ea") # adb 디바이스 일련 번호
기타정보
# 디바이스의 (너비, 높이) 튜플을 반환합니다.
d.window_size()
# 화면켜기
d.screen_on()
# 화면끄기
d.screen_off()
# 홈버튼누르기
d.press("home")
# 뒤로가기누르기
d.press("back")
# 화면 방향 설정
d.set_orientation(value)
# 현재 화면 방향 가져오기
d.orientation
# 알림바 열기
d.open_notification()
# 빠른 설정 열기
d.open_quick_settings()
# 실행 중인 모든 앱을 중지
d.app_stop_all()
# 데이터 켜기/끄기
d.data_on()
d.data_off()
# 장치 CPU 사용량
cpu_usage = d.cpu_usage()
print(cpu_usage)
# 장치 메모리 정보
mem_info = d.meminfo()
print(mem_info)
# 장치 저장소 정보
storage_info = d.df()
print(storage_info)
# 장치 모델 정보
model_info = d.info['model']
print(model_info)
# 장치 운영 체제 버전 정보
os_version_info = d.info['version']
print(os_version_info)
# 현재 화면의 모든 알림 지우기
d.notification.clear_all()
# 현재 화면에서 특정 앱의 알림 정보를 모두 삭제합니다.
d.notification.clear_by_app('com.android.settings')
