Python-UIAutomation-for-Windows 이란?

초기버전 windows의 GUI객체 컨트롤은 Autoit으로 모두 조작이 가능하였다, 하지만 Windows버전이 올라감에 따라 새로운 UI요소를 그릴 수 있는 Library가 공개되었고 그 것이 .Net Framework임, 현재 사용중인 대부분의 창은 .Net Framework 3.0이후의 버전을 사용해서 그려지고 있다.

이에 따라 Microsoft에서는 .Net Framework의 GUI객체 컨트롤을 위해서 UIAutomation API를 공개하였고, 이번에 소개할 Python-UIAutomation-for-Windows는 UIAutomation API를 Python에서 사용할 수 있도록 하게 해주는 Library이다

그리고..

현재 대부분의 RPA(Robotic Process Automation)툴 특히 Windows기반의 툴들은 UIAutomation API를 기반으로 만들어져있다

그래서 이번 편에서...

Python에서 UIAutomation API를 사용할 수 있게 해주는 Python-UIAutomation-for-Windows의 사용법을 소개한다

설치방법(Python기준)

  1. Win32com 설치 ※ 간혹 있는 오류를 위한 사전작업
    정상적인 경우면 필요 없지만 간혹 Python에서 Com object를 조작하는에 오류가 발생한다.
    Win32com을 설치 할 경우 그런 오류를 해결할 수 있다
  • 설치 url 클릭
  • 최신빌드버전 클릭 ※ 2020년1월기준 최신버전은 Build 221
  • 본인 Python버전에 맞는 파일 다운 ※ 필자는 python3.6버전 이므로 pywin32-221.win-amd64-py3.6.exe파일 다운로드
  • 관리자 권한으로 파일 실행 후 Next연타
  • 만약 설치 결과 화면이 다음과 같으면 설치가 정상적으로 안된것
  • 이때는 CMD를 관리자 권한 으로 실행
  • Python설치 폴더내 Scripts폴더로 이동 후 python pywin32_postinstall.py -install명령어 수행
  1. pip로 library 설치하기
    이 명령어도 되도록 이면 관리자 CMD창을 열어서 실행할 것!
pip install uiautomation
  1. inspect.exe 내려받기
    다운로드
  2. Pycharm에서 Sample스크립트 짜보기 ※ 가장 흔한 계산기어플 샘플만들어 보기
  • 계산기 실행을 위해서 subprocess import 및 계산기 실행
    import subprocess
    subprocess.Popen('calc.exe')
  • 실행결과
  • inspect.exe 실행 후 객체 확인하기
    프로그램 실행 후 마우스를 가져다 대면 인식 된 객체의 정보가 표시된다

    정보를 해석해 보면 해당 객체는 계산기 창 이하에 "1" 단추이고 이 단추는 오른쪽 텝에 관련된 속성값을 가진 Element로 볼 수 있다
  • 확인 된 정보를 통해서 계산기숫자1번 버튼 클릭하기
    * uiautomation을 auto로 import하기
    import uiautomation as auto
    * 계산기 창을 조작하기 위해서 계산기 창을 찾고 해당 객체값을 반환
    calculator = auto.WindowControl(searchDepth=1, Name='계산기')
    위의 값중 searchDepth값이 중요한데...
    ※ searchDepth란? Github페이지에 다음과 같이 Depth에 대해서 설명한다
    아래그림에서..
    0 depth는 Desktop윈도우의 객체 영역으로 우리가 잘 알고 있는 시작메뉴 Bar같은 영역이고
    1 depth는 Desktop윈도우 위에 떠있는 우리가 실행 시킨 프로그램의 영역
    n depth inspect.exe를 실행한 후 Tree구조상에 하위 레벨을 확인하여 어디까지 검색할 지 범위를 지정한다

    * 계산기 창이 확인될때까지 총 3초를 1초간격으로 확인하기 못찾을 경우 못찾았다는 메시지와 함께 종료
    ```
    if not calculator.Exists(3, 1):
    	print('Can not find Calculator window')
    	exit(0)
    ```
    * calculator의 `1번`버튼을 클릭
    앞선 객체 정보에서 보면 `1번`버튼은 다음과 같은 속성을 가지고 있다

    이 중 중요한 정보는 객체가 Button속성이라게 중요하고, Name값이 1이라고 표시된 것이 중요하다
    그래서 이 정보를 가지고 앞서 선언한 calculator객체에 Button속성의 Child검색을 수행한다
     ```
     calculator.ButtonControl(Name="1").Click()
     ```
     수행결과    

    소스 정보 : https://github.com/jjunghyup/UIAutomationExample/blob/master/calculator_sample.py
profile
안녕하세요~ :)

3개의 댓글

comment-user-thumbnail
2020년 1월 29일

안녕하세요. 좋은 정보 공유해주셔서 감사합니다. 자동화 테스트 쪽에 준비하고 있는데 도움이 많이 됩니다.
공유해주신대로 따라해보았는데. python에서 ModuleNotFoundError: No module named 'uiautomaiton' Error 가 출력되는데 Search를 해보아도 해결 방법이 나와있지 않아 이렇게 댓글로 해결 방법이 있는지 문의 드립니다.

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

우아!!!꿀팁 감사합니다.

답글 달기