본문 바로가기
Software coding skill(python, web등)

pywinauto 10 - find window 중복 에러 벗어나기

by 호빵님 2020. 2. 12.
반응형

 

자동화 프로그램을 만드려면, 내가 컨트롤하고 싶은 단 하나의 window객체를 찾아내야한다.

그러나, 대부분 프로그램들이 같은 타이틀명, 컨트롤네임을 사용하는 경우가 많아서, 내가 원하는 컨트롤 window를 찾을 수 없거나, 두개이상이 찾아졌다는 에러를 자주 볼 수 있다.

 

find errors

 

https://pywinauto.readthedocs.io/en/latest/code/pywinauto.findwindows.html#pywinauto.findwindows.find_elements

 

pywinauto.findwindows — pywinauto 0.6.8 documentation

© Copyright 2018, Mark Mc Mahon and Contributors Revision aea0429b.

pywinauto.readthedocs.io

 

 

findwindows 인자들

Possible values are:

  • class_name Elements with this window class
  • class_name_re Elements whose class matches this regular expression
  • parent Elements that are children of this
  • process Elements running in this process
  • title Elements with this text
  • title_re Elements whose text matches this regular expression
  • top_level_only Top level elements only (default=**True**)
  • visible_only Visible elements only (default=**True**)
  • enabled_only Enabled elements only (default=False)
  • best_match Elements with a title similar to this
  • handle The handle of the element to return
  • ctrl_index The index of the child element to return
  • found_index The index of the filtered out child element to return
  • predicate_func A user provided hook for a custom element validation
  • active_only Active elements only (default=False)
  • control_id Elements with this control id
  • control_type Elements with this control type (string; for UIAutomation elements)
  • auto_id Elements with this automation id (for UIAutomation elements)
  • framework_id Elements with this framework id (for UIAutomation elements)
  • backend Back-end name to use while searching (default=None means current active backend)

 

window 구분 사용 예시 :

 

같은 Control name중복 사용

 

1. Control ID를 지정해서 구분

 

같은 Control name이라도, 각 Control ID는 다름

 

2. Process ID로 구분

 

관련 프로그램내의 Control들은 같은 Process ID를 사용함

 

 

3. 정규식 이용해서 이름이 변경되는 타이틀 구분

예) 양쪽에 무슨 글자가 있던, 가운데가 Sublime Text로 써있는 타이틀 window찾기

p_sublime = app.window(title_re=".*Sublime Text.*")

 

 

4. 찾을 Control의 Parent 핸들을 지정해서 구분

상위 Parent window handle

 

 

5. child window 찾기 사용

 

  1. Using found_index=i in search criteria of child_window.

  2. Using children() but there is very limited number of filter criteria in 0.6.x (planned for future improvements): class_name, control_type, content_only, title.

  3. Using best_match search rules from Getting Started Guide -> How to know magic attribute names (previous chapters are recommended to read as well).

>>>app.Properties.print_control_identifiers()

Control Identifiers:

Dialog - 'Windows NT Properties'    (L688, T518, R1065, B1006)
[u'Windows NT PropertiesDialog', u'Dialog', u'Windows NT Properties']
child_window(title="Windows NT Properties", control_type="Window")
 
 | Edit - 'Contains:'    (L790, T747, R1036, B770)
 | [u'8', 'Edit6', u'Contains:Edit']
 | child_window(title="Contains:", auto_id="13087", control_type="Edit")
 
 
 >>>app.Properties.child_window(title="Contains:", auto_id="13087", control_type="Edit")

 

https://stackoverflow.com/questions/54310435/how-to-identify-ui-elements-when-multiple-ui-elements-have-same-ui-elements

 

How to identify UI elements when multiple UI elements have same UI elements

I am trying UI automation using PywinAuto Lib. When I am trying, Multiple UI elements are having same UI Attributes . Is there any way , we can alias and identify what we need. ControlType:

stackoverflow.com

 

6. 작업관리자의 동작 중인 백그라운드프로세스에 떠있는 같은 이름의 좀비 프로세스 없애기

 

어떤 어플리케이션은 실행할때마다 혹은, pywinauto로 connect할때마다 백그라운드 프로세스가 복사되어 남아버린다.

이러면, 같은 프로세스ID같은 Control ID를 사용하는 window들이 생겨서, 내가 찾는 현재 떠있는 window를 찾지 못한다. (2개이상 찾았다는 error발생)

그래서 pywinauto실행전에, 작업관리자에서 같은 이름의, 내가 실행할 어플리케이션들이 중복되어서 떠있는 것을 작업종료 시켜줘야한다.

 

예시)

같은 이름의 좀비 백그라운드 프로세스가 동작중

 

 

자동화 스크립트에서 자동으로 처리되게 하려면, 어플리케이션 connect전에 이미 동작중인 프로세스가 있는지 확인하고, 있으면 kill해주는 것이 필요하겠다.

 

pywinauto.application.Application의 프로세스 동작 확인, 죽이기 메소드

 

 

반응형