GUI 자동화 테스트 실무: 컨트롤, 키보드/마우스, 메뉴 리스트 조작 가이드

1. 대기 메커니즘

대기 처리 없이 발생하는 오류 사례:

from pywinauto import Application
app = Application(backend='uia').connect(process_id=24600)
window = app.window(title_pattern='.*Sublime Text.*')
# 대기 코드 주석 처리 시 오류 발생
window.minimize()
print("최소화 상태:", window.is_minimized())
window.maximize()
print("최대화 상태:", window.is_maximized())
window.close()

GUI 애플리케이션은 동작이 불안정할 수 있어, 새 창이 나타나거나 기존 창이 닫힐 때까지 대기해야 합니다. pywinauto는 기본 타임아웃 설정으로 대화상자 초기화를 기다리거나, 명시적 메서드를 사용해 코드 안정성을 높일 수 있습니다.

1.1 wait/wait_not()

  • wait(): 지정 상태가 될 때까지 대기
  • wait_not(): 지정 상태가 아닐 때까지 대기
주요 파라미터:
  • 대기 조건: exists(유효 핸들), visible(표시 상태), enabled(활성화), ready(준비 완료), active(활성 창)
  • 타임아웃: 최대 대기 시간
  • 재시도 간격: 확인 주기(초 단위)
사용 예시:
app = Application(backend='uia').connect(process_id=38544)
win = app.window(title_pattern='.*Sublime Text.*')
win.wait('exists')  # 창 핸들 유효성 확인
win.wait('visible') # 창 표시 상태 확인
win.wait('enabled') # 창 활성화 상태 확인

2. 컨트롤 조작

2.1 클릭 동작

# 일반 클릭
control.click_input()

# 우클릭
control.right_click_input()

# 더블클릭
control.double_click_input()

2.2 텍스트 추출

# 모든 텍스트 내용 가져오기 (리스트 반환)
print(control.texts())

# 주요 텍스트 내용 가져오기 (문자열 반환)
print(control.window_text())

3. 마우스 조작

mouse 모듈을 사용하면 화면 좌표 기반의 정밀한 조작이 가능합니다.

from pywinauto import mouse
# 특정 좌표 클릭
mouse.click(coords=(x, y))

# 스크롤 조작
element = win.child_window(title="스크롤바")
mid_point = element.rectangle().mid_point()
mouse.scroll(coords=(mid_point.x, mid_point.y), wheel_dist=500)

4. 키보드 조작

type_keys() 메서드를 사용하면 특정 컨트롤에 직접 입력할 수 있습니다.

# 텍스트 입력 예시
edit_control.type_keys("입력할 내용")

# 특수키 조합 예시
edit_control.type_keys("{ENTER}")  # 엔터 키
edit_control.type_keys("^s")       # Ctrl+S

5. 메뉴 조작

# 메뉴 경로로 선택
menu.item_by_path("File->Save").click_input()

# 간편한 메뉴 선택
win.menu_select("File->Open Recent->Clear Items")

6. 리스트 컨트롤 조작

# 리스트 항목 가져오기
items = list_control.get_items()

# 항목 수 확인
count = list_control.item_count()

# 특정 항목 선택
item = list_control.get_item(row=0)

고급 활용 예제: 메시지 전송 검증

# 전송 전 메시지 수 확인
initial_count = message_list.item_count()

# 메시지 입력 및 전송
message_input.type_keys("테스트 메시지")
send_button.click_input()

# 전송 결과 검증
assert message_list.item_count() == initial_count + 1
last_message = message_list.get_item(row=-1)
assert "테스트 메시지" in last_message.texts()[0]

태그: pywinauto GUI테스트 자동화테스트 윈도우자동화 UI테스트

9월 24일 09:51에 게시됨