Pywinauto 공식 사이트 내용을 번역한 것입니다.
Attribute Resolution Magic
속성 해석 매직
Python simplifies creating window specification by resolving object attributes dynamically.
파이썬은 오브젝트 속성들을 다이나믹하게 사용하면서, window specification을 생성하는 것을 단순화한다.
But an attibute name has the same limitations as any variable name: no spaces, commas and other special symbols.
그러나 한 속성이름은 변수이름과 같은 제한을 갖는다. 공간, 콤마나 다른 특별한 심볼 없게 하기.
But fortunately pywinauto uses “best match” algorithm to make a lookup resistant to typos and small variations.
그러나 운좋게도 pywinauto는 best match 알고리즘을 사용해서 작은 오차나 오타에 강하다.
app.UntitledNotepad
# is equivalent to
app.window(best_match='UntitledNotepad')
Unicode characters and special symbols usage is possible through an item access in a dictionary like manner.
유니코드 캐릭터와 특별한 심볼 사용은 아래와 같은 dictionary방법으로 가능하다.
app['Untitled - Notepad']
# is the same as
app.window(best_match='Untitled - Notepad')
How to know magic attribute names
매직 속성 이름 아는 법
There are several principles how “best match” gold names are attached to the controls. So if a window specification is close to one of these names you will have a successful name matching.
어떻게 best match되는 이름들이 컨트롤과 연결될 수 있는지에 대한, 여러가지 원리들이 있다. 그래서 한 window specification이 이 이름들 중 하나와 가까우면, 너는 성공적인 이름 매칭을 갖을 것이다.
- By title (window text, name) 타이틀에 의한 : app.Properties.OK.click()
- By title and control type 타이틀과 컨트롤 타입에 의한: app.Properties.OKButton.click()
- By control type and number 컨트롤타입과 숫자에 의한: app.Properties.Button3.click() (Note: Button0 and Button1 match the same button, Button2 is the next etc.)
- By top-left label and control type 라벨과 컨트롤타입에 의한: app.OpenDialog.FileNameEdit.set_text("")
- By control type and item text 컨트롤타입과 아이템 텍스트에 의한 : app.Properties.TabControlSharing.select("General")
Often not all of these matching names are available simultaneously.
자주 이런 모든 이름 매칭이 동시에 가능한 것은 아니다.
To check these names for specified dialog you can use print_control_identifiers() method. Possible “best_match” names are displayed as a Python list for every control in a tree.
특정한 다이얼로그를 위한 이 이름들을 체크하기 위해서, 너는 print_control_identifiers() 메소드를 사용할 수 있다.
가능한 best match 이름들이 파이썬 리스트에 보여진다. 트리안에 모든 컨트롤들이 있다.
More detailed window specification can also be just copied from the method output.
더 상세한 window specification은 또한 그냥 위 메소드의 해당 컨트롤의 아웃풋 내용을 카피해서 사용할 수 있다.
아래 처럼,
Say app.Properties.child_window(title="Contains:", auto_id="13087", control_type="Edit").
예시:
>>> 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")
|
| Image - '' (L717, T589, R749, B622)
| [u'', u'0', u'Image1', u'Image0', 'Image', u'1']
| child_window(auto_id="13057", control_type="Image")
|
| Image - '' (L717, T630, R1035, B632)
| ['Image2', u'2']
| child_window(auto_id="13095", control_type="Image")
|
| Edit - 'Folder name:' (L790, T596, R1036, B619)
| [u'3', 'Edit', u'Edit1', u'Edit0']
| child_window(title="Folder name:", auto_id="13156", control_type="Edit")
|
| Static - 'Type:' (L717, T643, R780, B658)
| [u'Type:Static', u'Static', u'Static1', u'Static0', u'Type:']
| child_window(title="Type:", auto_id="13080", control_type="Text")
|
| Edit - 'Type:' (L790, T643, R1036, B666)
| [u'4', 'Edit2', u'Type:Edit']
| child_window(title="Type:", auto_id="13059", control_type="Edit")
|
| Static - 'Location:' (L717, T669, R780, B684)
| [u'Location:Static', u'Location:', u'Static2']
| child_window(title="Location:", auto_id="13089", control_type="Text")
|
| Edit - 'Location:' (L790, T669, R1036, B692)
| ['Edit3', u'Location:Edit', u'5']
| child_window(title="Location:", auto_id="13065", control_type="Edit")
|
| Static - 'Size:' (L717, T695, R780, B710)
| [u'Size:Static', u'Size:', u'Static3']
| child_window(title="Size:", auto_id="13081", control_type="Text")
|
| Edit - 'Size:' (L790, T695, R1036, B718)
| ['Edit4', u'6', u'Size:Edit']
| child_window(title="Size:", auto_id="13064", control_type="Edit")
|
| Static - 'Size on disk:' (L717, T721, R780, B736)
| [u'Size on disk:', u'Size on disk:Static', u'Static4']
| child_window(title="Size on disk:", auto_id="13107", control_type="Text")
|
| Edit - 'Size on disk:' (L790, T721, R1036, B744)
| ['Edit5', u'7', u'Size on disk:Edit']
| child_window(title="Size on disk:", auto_id="13106", control_type="Edit")
|
| Static - 'Contains:' (L717, T747, R780, B762)
| [u'Contains:1', u'Contains:0', u'Contains:Static', u'Static5', u'Contains:']
| child_window(title="Contains:", auto_id="13088", control_type="Text")
|
| Edit - 'Contains:' (L790, T747, R1036, B770)
| [u'8', 'Edit6', u'Contains:Edit']
| child_window(title="Contains:", auto_id="13087", control_type="Edit")
|
| Image - 'Contains:' (L717, T773, R1035, B775)
| [u'Contains:Image', 'Image3', u'Contains:2']
| child_window(title="Contains:", auto_id="13096", control_type="Image")
|
| Static - 'Created:' (L717, T786, R780, B801)
| [u'Created:', u'Created:Static', u'Static6', u'Created:1', u'Created:0']
| child_window(title="Created:", auto_id="13092", control_type="Text")
|
| Edit - 'Created:' (L790, T786, R1036, B809)
| [u'Created:Edit', 'Edit7', u'9']
| child_window(title="Created:", auto_id="13072", control_type="Edit")
|
| Image - 'Created:' (L717, T812, R1035, B814)
| [u'Created:Image', 'Image4', u'Created:2']
| child_window(title="Created:", auto_id="13097", control_type="Image")
|
| Static - 'Attributes:' (L717, T825, R780, B840)
| [u'Attributes:Static', u'Static7', u'Attributes:']
| child_window(title="Attributes:", auto_id="13091", control_type="Text")
|
| CheckBox - 'Read-only (Only applies to files in folder)' (L790, T825, R1035, B841)
| [u'CheckBox0', u'CheckBox1', 'CheckBox', u'Read-only (Only applies to files in folder)CheckBox', u'Read-only (Only applies to files in folder)']
| child_window(title="Read-only (Only applies to files in folder)", auto_id="13075", control_type="CheckBox")
|
| CheckBox - 'Hidden' (L790, T848, R865, B864)
| ['CheckBox2', u'HiddenCheckBox', u'Hidden']
| child_window(title="Hidden", auto_id="13076", control_type="CheckBox")
|
| Button - 'Advanced...' (L930, T845, R1035, B868)
| [u'Advanced...', u'Advanced...Button', 'Button', u'Button1', u'Button0']
| child_window(title="Advanced...", auto_id="13154", control_type="Button")
|
| Button - 'OK' (L814, T968, R889, B991)
| ['Button2', u'OK', u'OKButton']
| child_window(title="OK", auto_id="1", control_type="Button")
|
| Button - 'Cancel' (L895, T968, R970, B991)
| ['Button3', u'CancelButton', u'Cancel']
| child_window(title="Cancel", auto_id="2", control_type="Button")
|
| Button - 'Apply' (L976, T968, R1051, B991)
| ['Button4', u'ApplyButton', u'Apply']
| child_window(title="Apply", auto_id="12321", control_type="Button")
|
| TabControl - '' (L702, T556, R1051, B962)
| [u'10', u'TabControlSharing', u'TabControlPrevious Versions', u'TabControlSecurity', u'TabControl', u'TabControlCustomize']
| child_window(auto_id="12320", control_type="Tab")
| |
| | TabItem - 'General' (L704, T558, R753, B576)
| | [u'GeneralTabItem', 'TabItem', u'General', u'TabItem0', u'TabItem1']
| | child_window(title="General", control_type="TabItem")
| |
| | TabItem - 'Sharing' (L753, T558, R801, B576)
| | [u'Sharing', u'SharingTabItem', 'TabItem2']
| | child_window(title="Sharing", control_type="TabItem")
| |
| | TabItem - 'Security' (L801, T558, R851, B576)
| | [u'Security', 'TabItem3', u'SecurityTabItem']
| | child_window(title="Security", control_type="TabItem")
| |
| | TabItem - 'Previous Versions' (L851, T558, R947, B576)
| | [u'Previous VersionsTabItem', u'Previous Versions', 'TabItem4']
| | child_window(title="Previous Versions", control_type="TabItem")
| |
| | TabItem - 'Customize' (L947, T558, R1007, B576)
| | [u'CustomizeTabItem', 'TabItem5', u'Customize']
| | child_window(title="Customize", control_type="TabItem")
|
| TitleBar - 'None' (L712, T521, R1057, B549)
| ['TitleBar', u'11']
| |
| | Menu - 'System' (L696, T526, R718, B548)
| | [u'System0', u'System', u'System1', u'Menu', u'SystemMenu']
| | child_window(title="System", auto_id="MenuBar", control_type="MenuBar")
| | |
| | | MenuItem - 'System' (L696, T526, R718, B548)
| | | [u'System2', u'MenuItem', u'SystemMenuItem']
| | | child_window(title="System", control_type="MenuItem")
| |
| | Button - 'Close' (L1024, T519, R1058, B549)
| | [u'CloseButton', u'Close', 'Button5']
| | child_window(title="Close", control_type="Button")
How to disable magic attribute names
매직 속성 이름 비활성화 방법
In some cases, you might prefer disable the magic lookup system, so that Pywinauto immediately raises if you access an attribute which exists neither on the WindowSpecification object, nor on the underlying element-wrapper object.
어떤 경우에서는, 너는 매직 룩업 시스템을 비활성화하는 것이 더 좋을 수 있다. 그러면 pywinauto는 즉시 너가 WindowSpecification나 element-wrapper 오브젝트로 존재하지 않는 속성을 접근하면, 에러를 발생시킬 수 있다.
Indeed, by default, Pywinauto will add your attribute name to the search system, and will only fail on a subsequent attribute access or method call.
정말로, 디폴트로, pywinauto는 너의 속성 이름을 검색 시스템에 추가하고, 후속 속성 엑세스나 메소드 콜에 실패할 것이다.
In this case, turn off the allow_magic_lookup argument of your Desktop or Application instance:
이 경우에, 너의 Desktop 이나 Application 인스턴스의 allow_magic_lookup 을 꺼라.
desktop = Desktop(backend='win32', allow_magic_lookup=False)
or:
app = Application(allow_magic_lookup=False)
This flag will automatically be propagated to generated WindowSpecification objects.
이 플래그는 자동적으로 생성된 window specification 오브젝트들에게 전파되어 적용될 것이다.
'Software coding skill(python, web등)' 카테고리의 다른 글
pywinauto 7 - 안정적인 자동화 (0) | 2020.02.11 |
---|---|
pywinauto 6 - listview 내 text 읽기/쓰기 (0) | 2020.02.11 |
pywinauto 5 - 32bit / 64bit app 종류별 환경 설정 (0) | 2020.02.11 |
pywinauto 4 - list select / click (0) | 2020.02.11 |
Pywinauto 2 - Window Specification (0) | 2020.02.10 |
Pywinauto 1 - Entry Points for Automation (0) | 2020.02.10 |
color script 사용 - code 첨부 글쓰기 (0) | 2020.02.07 |
pywinauto 예제 - 메모장 저장 (0) | 2020.02.07 |