스크립트 작성하기에서는

이번편에서는 Android Device에서 내가 조작하고자 하는 Element를 찾고, 이를 조작하는 방법에 대해서 소개한다.

테스트 시나리오

이번편에서도 자동화 테스트 시나리오를 작성하고 그 시나리오에 맞춰서 스크립트를 작성한다.
의식이 선택하는 테스트 대상앱은
두구두구두구!!
캘린더 앱으로 선정!

샘플 시나리오 : 캔린더앱의 달력 추가하고 확인하기!

뚝딱 뚝딱 완성!

Script작성

  1. Script파일 생성
    calendar_test.py 생성 후 실패코드 넣기

  2. 시나리오 내용을 주석으로 넣기

  3. weditor
    openatx쪽에서 만든 android inspect툴
    설치 방법

pip3 install --upgrade weditor

실행방법 CMD창에서 weditor 실행

weditor

실행결과 CMD에 서버를 하나 실행한다

실행됨과 동시에 기본 Browser에 창이 열리고, inspect서버 주소가 입력된다(http://localhost:17310)

  • 연결하기
    Connect 왼쪽의 입력란에 DeviceID(adb devices입력시 나오는 값) 또는 단말기의 atx서버 주소(ip:7912)를 입력한다.
  • Dump Hierarchy
    Connect우측의 Dump Hierarchy 버튼 클리시 다음과 같이 Screen Shot이 나오고 관련정보가 표시된다.
    그 Screenshot의 화면에서 아이콘을 클릭해 보면 다음과 같이 정보가 표시되고, 이중 Xpath정보를 많이 사용한다.
  1. Script작성하기
  • 연결 된 device중 내가 지정한 단말에 접속한다.
      # device_id정의
      device_id = "ce031713d239a82002"
      # 핸드폰을 연결한다.
      import uiautomator2 as u2
      device = u2.connect(device_id)
      # 정상적으로 연결된다.
      assert not device.alive, "디바이스가 정상적으로 연결되지 않았습니다."
  • 홈 화면 연결 후 Calendar앱 실행
    앱 실행을 위해서는 package명이 필요함, package명은 프로그램 실행 후 Dump Hierarchy실행 후 element를 클릭 하면 알수 있다

    해당 정보를 통해 APP실행 후 정상 실행 여부 확인!
    # 캘린더 앱을 실행한다.
    app_package = "com.samsung.android.calendar"
    device.app_start(app_package)
    # 프로그램이 정상적으로 수행된다.
    pid = device.app_wait(app_package, timeout=20.0)
    if not pid:
        print("com.example.android is not running")
        assert False, f"{app_package}가 정상적으로 수행되지 않았습니다."
  • 신규 일정 등록하기
    일정 버튼, 화면 입력란 등등의 element값을 inspect툴로 확인 후 스크립트 작성하기!
    일정추가 버튼 정보

    일정 제목 입력 란 정보

    저장 버튼 정보

    스크립트
        # 할일이름값을 정의한다.
      import time
      task_name = f"{time.time()}_할일"
      # 새로운 일정을 등록한다.
      # 일정등록 버튼 클릭
      d.xpath('//*[@resource-id="com.samsung.android.calendar:id/floating_action_button"]').click()
      # 일정 제목에 내용 입력
      d.xpath('//*[@resource-id="com.samsung.android.calendar:id/title"]').set_text(task_name)
      # 저장 버튼 클릭
      d.xpath('//*[@resource-id="com.samsung.android.calendar:id/action_done"]').click()
  • 일정 정상 등록 여부 확인하기
    일정이 정상적으로 등록되었는지 확인하기 위해서 오른쪽 위의 더보기 아이콘 xpath정보로 click()을 수행해보았지만 수행되지 않는다!

    이를 해결하기 위해서 uiautomator에서는 잘 찾아지는 element의 위/아래/왼쪽/오른쪽의 elemet를 지정할 수 있다.
    그래서 잘 찾아지는 보기 방식버튼을 찾은 후 그 오른쪽 element를 지칭하는 script는 다음과 같다.
    uiautomator에서는 다양한 방식을 통해서 element를 찾을 수 있게 지원한다
d(text="보기 방식").right(className='android.widget.FrameLayout').click()

이 방식을 사용해 이후 스크립트를 작성

    # 일정이 정상적으로 등록되었는지 확인한다.
    # 더보기 버튼 클릭
    d(text="보기 방식").right(className='android.widget.FrameLayout').click()
    # 검색 버튼 클릭
    d.xpath('//android.widget.ListView/android.widget.LinearLayout[1]').click()
    # task_name으로 검색
    d(resourceId="android:id/search_src_text").send_keys(task_name)
    # task_name element존재 여부 확인
    d(resourceId="com.samsung.android.calendar:id/title", text=task_name).exists()    

수행 결과

스크립티 url : https://github.com/jjunghyup/UIAutomator2Sample/blob/master/calendar_test.py

profile
안녕하세요~ :)

4개의 댓글

comment-user-thumbnail
2020년 9월 9일

weditor 존재를 알려주셔서 감사합니다 (_ _)

1개의 답글
comment-user-thumbnail
2020년 9월 22일

좋아여!!

답글 달기