Python á áŹááźááˇáşáááŻááş â áááş desktop GUI application ááťáŹá¸ááᯠáĄáááŻáĄááťáąáŹááşááŻááşááąáŹááşáááşáĄáá˝ááş open source project áá áşááŻááźá áşáááşá WindowsááźáŽá¸áá˛áˇáááˇáş áážá áşáážá áşáĄáá˝ááşá¸á áááşá¸áááş áĄááá áĄááşášááŤáááşáĄáá áşááťáŹá¸ááᯠáááˇáşáá˝ááşá¸áá˛áˇáááş-
- MS UI Automation áááşá¸áááŹáĄáá˝ááş ááśáˇáááŻá¸áážáŻá interface áááş áĄáá°áá°áááşááźá áşááźáŽá¸ áááŻáĄá፠WinFormsá WPFá Qt5 áááŻáˇááᯠááśáˇáááŻá¸ááąá¸ááŤáááşá Windows Store (UWP) á áááşááźááˇáş - áá˝ááˇáşááŹá¸ááąáŹ áĄááŹáĄáŹá¸ááŻáśá¸ááŽá¸ááŤá¸ Windows.
- ááąáŹááşááśááťáŹá¸/ááááşáĄááşááťáŹá¸á á
áá
áş (áááşáážááá˝ááş áááşá¸áááŻáˇáá˛ááž áážá
áşááŻáážááááş- ááŻáśááą
"win32"áážááˇáşáĄáá áş"uia") áááŻáˇááąáŹááş ááťá˝ááşáŻááşáááŻáˇáááş cross-platform áááŻáˇ ááťáąáŹáá˝áąáˇá á˝áŹ áá˝áąáˇááťáŹá¸áááşá - ááąáŹááşá áşáážááˇáş ááŽá¸ááŻááşáĄáá˝ááş Win32 ááťáááşááťáŹá¸ (pyHook á á áááşááŹááşáážá hot keys)á
áááşá áşááąáŹáˇ áĄáááŻáĄááťáąáŹááşá áá áşáĄáá˝ááş (áĄááąá¸áĄáááş áážááŻááşá¸áážááşáááşááąáŹááşááźááşá¸áááźáŻáá˛) áá˝ááˇáşáááşá¸áááşá¸ááźá áşáá˝ááş ááááŻááşáááˇáşáĄááŹááťáŹá¸áĄááźáąáŹááşá¸ áĄáááŻááťáŻááşáááŻáááşá¸ ááąá¸ááŤáááşá
á¤ááąáŹááşá¸ááŤá¸áááş Minsk áážá SQA Days 20 ááŽááŹááśááž áĄá áŽáááşááśá áŹá áá áşá áááşáá áşáááŻááşá¸ áážááşáááşá¸áá áşááŻááźá áşáááşá и ) áá áşá áááşáá áşáááŻááşá¸ ááŻáážáŹá¸ááŹá¸áážááşá¸ pywinauto áĄáá˝ááşá
- áĄááźáąááśáááşá¸áááşá¸ááťáŹá¸
- áĄááźáąááś áááşá
áşááąáŹáˇ áĄááŻáśá¸ááźáŻáááŻááşáážáŻ áááşá¸áááŹááťáŹá¸
á¤á§ááááŹáážá open source á áĄááťááşá¸ááťáŻááşááźááˇáş á áááşááźááŤá ááŻáˇá áááşá áşááąáŹáˇ GUI áĄáááŽááąá¸áážááşá¸ááťáŹá¸áĄáá˝ááşá Selenium ááŤáážááááˇáş áááşáááş áĄááŹáĄáŹá¸ááŻáśá¸áááş áááŻáááŻáážáŻááşáá˝áąá¸ááŤáááşá á¤áááşáážáŹ áĄááá ááťááşá¸áááşáááşá¸ááťáŹá¸ááźá áşáááşá
áážááážááŻááşá¸áááşá¸áááşá¸
ááá
áşáĄáážááşááťáŹá¸ááᯠHardcodeá ááťá˝ááşáŻááşáááŻáˇáááş áĄáąáŹááşááźááşááąáŹ hits ááťáŹá¸ááᯠááťážáąáŹáşáááˇáşááŤáááşá
[+] Cross-platformá áĄááąáŹááşáĄáááşááąáŹáşáááşáá˝ááşáá°áááşá
[+] á
ááşá¸áááşáážáŻáážááşáááşá¸ááťáŹá¸ááᯠ"record-replay" ááŻááşáááş áá˝ááşáá°áááşá
[-] ááźáąáŹááşá¸áá˛ááąááąáŹ ááťááşáážáŹááźááş ááŻááşáá˝ááşá áĄááźááşáĄáááşá ááąáŹááˇáşááťáŹá¸á áááşá¸áááŻá¸áĄáá˝ááşáĄá
áŹá¸ á
áááşááźááˇáş ááźáąáŹááşá¸áá˛ááźááşá¸áĄáá˝ááş áĄáááşááźáááşááŻáśá¸á
[-] ááźáŽá¸ááŹá¸ááąáŹ ááśáˇáááŻá¸áá°ááŽáážáŻ ááźááŻá¸áááşá¸áážáŻááťáŹá¸ áááŻáĄááşáááşá áááşá¸áááş á
ááşá¸áááşáážáŻááťáŹá¸ááᯠáĄá
ááž ááźááşááŻááşáááş áááŻáˇáááŻááş áááŻááşáááŻááşá
ááşá¸áááşáááş áááźáŹáá áááŻáááŻáá˝ááşáá°áááşá
[-] ááŻááşááąáŹááşááťááşááťáŹá¸áááŻáᏠáĄáááŻáĄááťáąáŹááşááŻááşáááşá ááąááŹááᯠáĄáááşááźáŻááźááşá¸áážááˇáş ááźááşáááşááá°ááźááşá¸áĄáá˝ááş áĄááźáŹá¸áááşá¸áááşá¸ááťáŹá¸áážáááŤáááşá
ááááááŹááťáŹá¸ (ááááşááąáŹááşá¸ááźááşááťáąáŹáş): , , áážááˇáşáĄááźáŹá¸ááťáŹá¸á á˝áŹá ááŻáśáážááşáĄáŹá¸ááźááˇáşá áááŻáááŻáážáŻááşáá˝áąá¸ááąáŹ ááááááŹááťáŹá¸áá˝ááş á¤ááŻááşááąáŹááşááťááşááŤáááşáááş (áĄááźá˛áááşá¸ ááźááşááťáąáŹáşááźááşá¸áááŻááş)á
Coordinate method áááş áĄááźáŹá¸ááąáŹ ááťááşá¸áááşáážáŻááťáŹá¸ááᯠááźááˇáşá á˝ááşááąá¸áááŻááşáááşáᯠáááŻáááťááŻá¸áááşááŤáááşá áĽáááŹáĄáŹá¸ááźááˇáşá á áááşááźááŻááşááááşáá áşáĄáá˝ááşá áááşáááş áážááŻááşá¸áááźááŽááááşááťáŹá¸ (áááşá¸áááŻá¸/ááźááşá ááşá áááşáááşáĄááąáŤáşááąáŹááˇáşáážá á ááááşáá áşááŻááŻáśá¸áááŻááşáá˛) áááŻáážáááşáááŻááşáááş - áááşá¸áááş áĄááťáŹá¸áĄáŹá¸ááźááˇáş áĄáá˝ááşááŻáśááźááşá áááşááťááááşá áĄáá°á¸áááźááˇáş áááşáááş áĄáááŻááŤáĄááťáŹá¸/áĄááśááᯠáááˇáşáá˝ááşá¸á ááşá¸á áŹá¸ááŤáá ááźááşá ááşáá áşááŻááŻáśá¸ (áááŻáˇááąáŹááş ááá°ááŽááąáŹ ááťááşáážáŹááźááş ááŻááşáá˝ááşááťáŹá¸áááş áááááŻááşáááşáááŻááşááŤ)á
áĄááźáŹá¸áá˝áąá¸ááťááşá ááŹ- á ááşá¸áááşáážáŻáĄáá˝ááş áááşááźáááşááąáŹáááşáááşááťáŹá¸ááŤáážááááˇáş á ááşáá áşááŻáśá¸áááşá¸áááŻáᏠáá˝á˛ááąááťááŹá¸á፠(ááááşááąáŹááşá¸áááŻááşááąáŹáşáááşá¸ áĄááťááŻáˇááá ášá ááťáŹá¸áá˝ááş áááşá¸áááş ááąáŹááşá¸áá˝ááşáááş)á
áĄáááŻá¸áĄááŹá¸ ááŻááşááŻáśáĄáááĄáážááşááźáŻáážáŻ
[+] ááááşááąáŹááşá¸ ááźááşáááŻááşá¸
[+-] áĄááąáŹáşáĄáááşááŻáśááźááşá
áááşááťáááąáŹ (ááźááááááşáááşá¸áááşá¸áááş áááŻááąáŹááşá¸áááş)á áááŻáˇááąáŹáş áážááˇáşáá˝ááşáĄááťááŻáˇ áááŻáĄááşááąááąá¸áááşá
[-+] áážáąá¸ááąáŹááźáąáŹááˇáşá áĄáááĄáážááşááźáŻááźááşá¸áááŻááşáᏠáĄááşááááŻááŽáááşááťáŹá¸áĄáá˝ááş CPU áĄáááşá¸áĄááźá
áşááťáŹá¸ áááŻáĄááşáááşá
[-] á
ááşá¸ááťááşá¸áĄá á
áŹááŹá¸áĄáááĄáážááşááźáŻááźááşá¸ (OCR) áááş ááąá¸áá˝ááşá¸áááŻááşáᲠ=> á
áŹááŹá¸ááąááŹááᯠáááááŻááşááŤá ááťá˝ááşáŻááşáááááąáŹááşá áážáááźáŽá¸ááŹá¸ OCR ááźáąáážááşá¸ááťááşááťáŹá¸áááş á¤ááŻááşáááşá¸áĄááťááŻá¸áĄá
áŹá¸áĄáá˝ááş áĄáá˝ááşááŻáśááźááşá
áááşááťáááźááşá¸ááážááááˇáşáĄááźááş áá˝ááşáá˝ááşááťááşááťááş áĄááŻáśá¸áááźáŻá፠(áááşá¸ááá
ášá
áááŻááşááŤá áážááşááťááşááťáŹá¸áá˝ááş ááźááŻáááŻááŤáááş)á
áá°ááááŹ: , (Sikuli-compatible, pure Python)á .
ááŻáśá¸á á˝á˛áááŻááşáážáŻáááşá¸áááŹ
[+] áĄááŻáśááźááşáááŻáśá¸áááşá¸áááşá¸áááŻáˇááŤá á
áá
áş áááŻáˇáááŻááş áá°ááąáŹááşááźááˇáş áááşáááŻáˇááźááşáááŻáááşááźá
áşá
áą á
áŹááŹá¸ááźááˇáş áážáŹáá˝áąáááŻááşá
áąááŤáááşá
[+] á
áŹááŹá¸ááąáᏠ=> á
ááşá¸áááşáážáŻááááşááťáŹá¸ááᯠáĄáááşááźáŻáááş áááŻáááŻáá˝ááşáá°á
áąááŤáááşá
[+] á
ááşá¸áááşá¸áĄáááŻááşá¸ áĄááťááşááźááşááŻáśá¸áááŻáˇááŤá CPU áĄáááşá¸áĄááźá
áşááťáŹá¸ááᯠááŻáśá¸áááŽá¸ááŤá¸ á
áŹá¸ááŻáśá¸ááŤáááşá
[-] cross-platform tool áá
áşááŻááźáŻááŻááşáááş áááşáá˛ááŤáááş- open-source libraries áĄáŹá¸ááŻáśá¸áááş accessibility áááşá¸ááᏠáá
áşáᯠáááŻáˇáááŻááş áážá
áşááŻááᯠááśáˇáááŻá¸ááąá¸ááŤáááşá Windows/Linux/TestCompleteá UFT áááŻáˇáááŻááş Squish áá˛áˇáááŻáˇááąáŹ áĄáááźáąá¸áá˝áąááąá¸ááááˇáş ááąáŹáˇááşáá˛ááťáŹá¸áážáá˝á˛á MacOS ááᯠáááşáá°ááťáž áĄááźááˇáşáĄá ááśáˇáááŻá¸áááŹá¸ááŤá
[-] áááŻáááŻáˇááąáŹáááşá¸áááŹáááş áá°áĄá áĄááźá˛áááşá¸áááááŻááşááŤá áĽáááŹáĄáŹá¸ááźááˇáşá VirtualBox áĄáá˝ááşá¸áážá loading screen ááᯠá
ááşá¸áááşááźááşá¸ - ááŻááşááŻáśáĄáááĄáážááşááźáŻááźááşá¸ááážááᲠáááşá¸ááᯠááŻááşááąáŹááşáááááŤá áááŻáˇááąáŹáş ááášááááşááźáąáŹááşááťáŹá¸á
á˝áŹááąáŹááá
ášá
ááťáŹá¸áá˝ááşá áĄááťáŹá¸ááŻáśá¸á
á˝á˛áááŻááşáážáŻááťááşá¸áááşáážáŻáážáŹ áĄááŻáśá¸ááźáŻáááŻááşááąá¸áááşá ááŤááᯠáááşáááşáá˝áąá¸áá˝áąá¸áá˝áŹá¸áážáŹááźá
áşááŤáááşá
áá°ááááŹ: C# áá˝ááşá C# áá˝ááş (Selenium compatible)á C# áá˝ááş (Appium compatible)á , (LDTP áá˝á˛áááşáĄááŻáśá¸ááźáŻáááŻááşáááş) , ááášáááźáŹá¸á (Linux Desktop Testing Project) áážááˇáş áááşá¸á Windows ááŹá¸áážááşá¸ .
LDTP áááş ááŻáśá¸á á˝á˛áááŻááşáážáŻáááşá¸áááŹááťáŹá¸ááᯠáĄááźáąááśá áá áşááŻáááşá¸ááąáŹ cross-platform open-source tool (áĄáááĄááťáĄáŹá¸ááźááˇáşá á áŹááźááˇáşáááŻááşááťáŹá¸á ááááŹá¸á áŻ) ááźá áşááąáŹááşá¸ááźá áşáááŻááşáááşá ááŤááąáááˇáş ááááşááŹáááşááźáŽá¸ááŹááąáŹáˇ áááŻááşááŤáá°á¸á ááŤáááŻááşáááŻááşáááŻáśá¸áá°á¸ááąáááˇáş ááźááşáááşááŻáśá¸áááşááťááşáá˝áąáĄáááąáŹáˇ áá°áˇáá˛áˇ interface á áĄáááşááźáąááŻáśá¸áááŻááşááŤáá°á¸á áááˇáşáá˝ááş áĄááźáŻáááąáŹááąáŹááşááąáŹ áĄááźáśááźáŻááťááşáážáááŤá áááşá¸ááᯠáážááşááťááşááťáŹá¸áá˝ááş ááťážááąááŤá
Backdoor á ááşá¸áááşááźááşá¸ (áááŻáˇáááŻááş áááŻá¸ááŻáśááąááŻáśá ááşááŽá¸)
Cross-platform áĄáááŽááąá¸áážááşá¸ááťáŹá¸áĄáá˝ááşá developer ááťáŹá¸áááŻááşáááŻááş á ááşá¸áááşáááŻááşáážáŻááąááťáŹá áąáááş áĄáá˝ááşá¸áááŻááşá¸ááášáááŹá¸áá áşááŻááᯠáááşááŽá¸ááąáˇáážááááşá áĽáááŹáĄáŹá¸ááźááˇáşá áááşá¸áááŻáˇáááş áĄáááŽááąá¸áážááşá¸áá˝ááş áááşááąáŹááşáážáŻ TCP ááŹááŹáá áşááŻááᯠáááşááŽá¸ááźáŽá¸á á ááşá¸áááşáážáŻááťáŹá¸áážááˇáş ááťáááşáááşáᏠá áŹááŹá¸áĄááááˇáşááťáŹá¸ááąá¸áááŻáˇááźááşá¸- ááŹáááŻáážáááşááááşá ááąááŹááá°áááş ááąááŹá áááşááźááˇáşá ááŻáśááźááşáááŻááşááąáŹáşáááşá¸ universal áááŻááşááŤá
áĄááźáąááś áááşá áşááąáŹáˇ áĄááŻáśá¸ááźáŻáááŻááşáážáŻ áááşá¸áááŹááťáŹá¸
ááąáŹááşá¸ááąáŹ Win32 API áĄááąáŹááşá¸
áĄááťáŹá¸á áŻáážáŹ Windows WPF ááá˝ááşáááşáážááˇáş áá˝ááşááźáŽá¸ááąáŹááşáá˝ááş ááąá¸ááŹá¸áá˛áˇááąáŹ application ááťáŹá¸ Windows Store ááťáŹá¸ááᯠWin32 API áá˝ááş áá áşáááşá¸áááşá¸ááźááˇáş áááşááąáŹááşááŹá¸áááşá áááŻáááŻáááşáážáŹ MFCá WTLá C++ Builderá Delphiá VB6âá¤ááááááŹááťáŹá¸áĄáŹá¸ááŻáśá¸áááş Win32 API áááŻáĄááŻáśá¸ááźáŻáááşá Windows Form ááťáŹá¸áááş áĄááťáŹá¸áĄáŹá¸ááźááˇáş Win32 API áážááˇáş áá˝á˛áááşáĄááŻáśá¸ááźáŻáááŻááşááŤáááşá
áá°ááááŹ: (VB áážááˇáşáááşáá°áááş) áážááˇáş Python wrapper , (áááŻááşáááŻááşááŹááŹá ááŹá¸á IDispatch COM interface áá áşááŻááŤáážááááş) (á ááŤá¸áĄáŻáśá¸) (ááášáááźáŹá¸) (ááášáááźáŹá¸)á
Microsoft UI áĄáááŻáĄááťáąáŹááşá áá áş
áĄááááĄáŹá¸ááŹááťááş- MS UI Automation áááşá¸áááŹáááş GUI áĄáááŽááąá¸áážááşá¸áĄááťáŹá¸á áŻááᯠááśáˇáááŻá¸ááąá¸áááşá Windows áážáŹá¸áážáŹá¸ááŤá¸ááŤá¸ ááźá˝ááşá¸ááťááşáá˝áąááąáŹáˇ áážáááŤáááşá ááźáżááŹá Win32 API áááş áááşáá°ááᏠááááşááá˝ááşááŤáá°á¸á áááŻááşáááş áááşáá°ááž ááŽáĄáá˝ááş wrapper áá˝áą áááşááŽá¸áážáŹ áááŻááşááŤáá°á¸á
ááááşááąáŹáˇá ááŤá á
áááşááźááŻááş COM áĄááşááŹááąáˇá
áşáĄá
áŻáá
áşáᯠ(áĄááááĄáŹá¸ááźááˇáş UIAutomationCore.dll) áážááˇáş ááąáŹááşáá˝ááş .NET wrapper ááŤáážáááŤáááşá namespace System.Windows.Automation. á
ááŹá¸áá
ááşá áĄááťááŻáˇááąáŹ UI ááźááşá
ááşááťáŹá¸ áá˝á˛ááťáąáŹáşáá˝áŹá¸áááŻááşááąáŹááźáąáŹááˇáş áááşá¸áá˝ááş ááááşáááşááŹá¸ááąáŹ ááťááŻáˇáá˝ááşá¸ááťááşáá
áşááŻáážááááşá áááŻáˇááźáąáŹááˇáş UIAutomationCore.dll ááᯠáááŻááşáááŻááşáĄááŻáśá¸ááźáŻááźááşá¸áááş áááŻááąáŹááşá¸áááş (C# áá˝ááş UiaComWrapper áĄááźáąáŹááşá¸ ááźáŹá¸áááááŤáá áááşá¸áááş áááşá¸ááźá
áşáááş)á
COM áĄááşááŹááąáˇá áş áĄááťááŻá¸áĄá áŹá¸ááťáŹá¸
(á) áĄááźáąááś IU áá°ááááťáŹá¸áááş - "áááąáŹááşá¸áážáŻáĄáŹá¸ááŻáśá¸ááĄááźá
áş" á áĄááááˇáşááŻáśá¸áĄáááˇáşá áááşáááˇáşáĄááŤááťáž áĄááŻáśá¸ááźáŻááá˝ááşáá°áááşá
(á) IDispatch áážááˇáş áááşá¸áááşááŹáážáŻááťáŹá¸ (áĽááᏠExcel.Applicationwin32com.client áááşááąáˇááťáş (pyWin32 áážááˇáş ááŤáááşáááş) ááᯠáĄááŻáśá¸ááźáŻá Python áá˝ááşáĄááŻáśá¸ááźáŻáááŻááşááŤáááşá áĄáááşááźáąááŻáśá¸áážááˇáşáĄáážááŻáśá¸áá˝áąá¸ááťááşáážáŻá
(á) Third-party Python áááşááąáˇááşáťááźááˇáş áĄááŻááşááŻááşáááŻááşááąáŹ á
áááşááźááŻááşáĄááşááŹááąáˇá
áşááťáŹá¸ .
áá°ááááŹ: C# áá˝ááşá á + C# áá˝ááşá (UIAutomationCore.dll ááąáŤáşáážá C wrappers áĄáá˝ááş áááşá¸áááŻáˇá áĄáááşá¸áĄááźá áşááŻááşááᯠáááąáŹáşááźááŤ)á Ruby áá
AT-SPI
ááááŹá¸á áŻáá˛áˇ ááŻááááşáĄáŹá¸ááŻáśá¸ááŽá¸ááŤá¸ áážáááąááąáááˇáşáááşá¸ Linux X Window System (Fedora 25 áážáŹ "X" ááᯠWayland áá˛áˇ áĄá áŹá¸áááŻá¸áá˛áˇááŤáááş) ááąáŤáşáážáŹ áááşááąáŹááşááŹá¸áá˛áˇ "X" áᏠtop-level windows áá˝áąáá˛áˇ mouse/keyboard áá˝áąáááŻáᲠáááşáááşáá˝ááˇáşááźáŻááŤáááşá button áá˝áąá list box áá˝áą á ááŹáá˝áąááᯠáĄááąá¸á áááş analysis ááŻááşáááŻáˇáĄáá˝ááş AT-SPI áááşá¸áááŹáážáááŤáááşá áĄááŻáśá¸áĄááťáŹá¸ááŻáśá¸ window manager áá˝áąáážáŹ AT-SPI registry daemon áááŻáˇááąáŤáşáá˛áˇ software áá áşááŻáážáááźáŽá¸ application áá˝áąáĄáá˝ááş automated GUI áá áşáᯠ(áĄáááşá¸ááŻáśá¸ Qt áá˛áˇ GTK áá˝áąááᯠsupport ááŻááşááŤáááş) ááᯠááśáˇáááŻá¸ááąá¸ááŤáááş)á
áá°ááááŹ: .
ááťá˝ááşááąáŹáˇáşáĄááźááşáĄá pyatspi2 áá˝ááş PyGObject áá˛áˇáááŻáˇááąáŹ áážáŽáááŻáážáŻááťáŹá¸á
á˝áŹááŤáážááááşá áááşá¸áááŹáááŻááşáááŻááşá ááŻáśáážááşááźáąáŹááşá¸áá˛ááąááąáŹ á
áŹááźááˇáşáááŻááşáá
áşááŻáĄááźá
áş ááážááááŻááşáááşá libatspi.so. áá
áşááŻáážáááŤáááşá pywinauto library áĄáá˝ááşá ááťá˝ááşáŻááşáááŻáˇáááş AT-SPI ááśáˇáááŻá¸áážáŻááᯠá¤áááşá¸ááźááˇáş áĄááąáŹááşáĄáááşááąáŹáşáááş á
áŽá
ááşááŹá¸áááş- libatspi.so áážááˇáş ctypes module ááᯠáááşááźááşá¸ááźááˇáşááźá
áşáááşá áá
áşááŻáááşá¸ááąáŹ áĄááąá¸áĄáá˝á˛ááźáżááŹáážáŹ GTK+ áážááˇáş Qt application ááťáŹá¸áĄáá˝ááş áĄáááşá¸áááşáá˝á˛ááźáŹá¸ááąáŹááźáąáŹááˇáş áážááşáááşááąáŹ version ááᯠáĄááŻáśá¸ááźáŻááźááşá¸áááşááźá
áşáááşá pywinauto 0.7.0 á ááźá
áşáááŻááşááźáąáážáááąáŹ áá˝ááşáážááážáŻáá˝ááş áĄááźááˇáşáĄá ááśáˇáááŻá¸áážáŻ ááŤáááşáááşááźá
áşáááşá Linux áááá ááŻáážá
áş ááááážá
áşáááşáá˝ááş ááźáŽá¸á
áŽá¸áááşáᯠááťážáąáŹáşáááˇáşááááşá
Apple Accessibility API
MacOS áá˝ááş áááşá¸ááááŻááşáááŻááş áĄáááŻáĄááťáąáŹááşá áá áşááŻáśá¸ááŹááŹá ááŹá¸ AppleScript áážááááşá Python áá˝ááşá¤áá˛áˇáááŻáˇááąáŹáĄááŹáá áşááŻááŻáááŻáĄááąáŹááşáĄáááşááąáŹáşáááşá áááş ObjectiveC áážááŻááşááąáŹááşááťááşááťáŹá¸áááŻáĄááŻáśá¸ááźáŻáááşáááŻáĄááşáááşá áĄá áá˝ááşá MacOS 10.6 ááźááˇáş pyobjc áááşááąáˇááťáşááᯠááźááŻáááşáááˇáşáá˝ááşá¸ááŹá¸áááˇáş Python áá˝ááş áááˇáşáá˝ááşá¸ááŹá¸áááşá áááşá¸áááş pywinauto áá˝ááş áĄááŹáááşááśáˇáááŻá¸áážáŻááťáŹá¸áĄáá˝ááş áážáŽáááŻáážáŻá áŹáááşá¸ááźáŻá áŻáááşáááşá¸ áááŻáááŻáá˝ááşáá°á áąáááşááźá áşáááşá
ááááááŹááťáŹá¸- Apple Script ááŹááŹá
ááŹá¸áĄááźááşá áááşá¸ááᯠáĄáŹááŻáśá
ááŻááşáááˇáşáááşá , aka pyatom á áááşá¸áááş LDTP áážááˇáşááááŹááážáááąáŹáĄááşááŹááąáˇá
áşááźá
áşáááşá áááŻáˇááąáŹáşááŽá¸áááˇáşá
áŹááźááˇáşáááŻááşáá
áşááŻáááşá¸ááźá
áşáááşá áĄá˛ááŤáážááááşá ááŤáˇááťáąáŹááşá¸ááŹá¸áááąá¸áááşá áá°ááááťáŹá¸ááąáŹááźáżááŹáá
áşááŻáážááááş- ááźáąáŹááşá¸áá˝ááşááźááşáá˝ááşáĄááťáááşááťáŹá¸áĄááŻááşáááŻááşá፠(áááşá¸áááşá¸ááťáŹá¸ waitFor*) ááŤááąáááˇáş ááźáŻáśááŻáśááźááˇáşáááşááąáŹáˇ áááąáŹááşá¸ááŤáá°á¸á
pywinauto áá˛áˇ á áááşáááşá¸
ááááĄáááˇáşáááş GUI áĄááŹááášááŻá á áşááąá¸ááąá¸áĄááŹáážá (Spy tool ááŻááąáŤáşáááş) ááźááˇáş áááˇáşáááŻááşáááş áááşáááşáááşáááşáááşááźá áşáááşá áááşá¸áááş áááˇáşáĄáŹá¸ áĄáááŽááąá¸áážááşá¸áĄáá˝ááşá¸ááž ááąáˇááŹáááş áá°ááŽááąá¸ááááˇáşáááş- ááźááşá ááşááťáŹá¸á áĄáááşáĄáąáŹááşáá˝á˛áˇá ááşá¸ááŻáśá áááşáááŻáˇááąáŹ ááŻááşááášááááťáŹá¸ áážááááŻááşáááşáááşá¸á áĄááťáąáŹáşááźáŹá¸ááŻáśá¸áááŻááşá á áşááąá¸ááąá¸áážá°á¸ááťáŹá¸-
- áá°ááťážááŻ++ - Express áááŻáˇáááŻááş Community Edition áĄááŤáĄáááş Visual Studio áážááˇáş ááŤáááşáááşá Win32 API áááŻáĄááŻáśá¸ááźáŻáááşá áá°áˇáááŻááşáá˝áŹá¸áááŻáˇáááşá¸ ááááźááŤáááşá AutoIt Window áĄááťááşáĄáááş.
- Inspect.exe áááŻá
á
áşááąá¸ááŤá â áá˝ááş ááŤáááşáááş Windows SDKá áááşáááˇáşáá˝ááşá¸ááźáŽá¸ááŤá áááşá¸áááş 64-bit áá˝ááşáážáááąááŤáááşá Windows áááŻááŤáá˛áážáŹ áážáŹáááŻáˇáááŤáááş
C:Program Files (x86)Windows Kits<winver>binx64. á á áşááąá¸ááąá¸áážá°á¸áááŻááşáááŻááşá áááşáááş ááŻááşáá áşááŻááᯠáá˝áąá¸ááťááşáááş áááŻáĄááşáááşá UI áĄáááŻáĄááťáąáŹááşá áá áş MS AA áĄá áŹá¸ (Active Accessibilityá UI Automation á áááŻá¸ááąá¸)á
áĄáááŽááąá¸áážááşá¸ááᯠááźááşá á á áşááąá¸ááźáŽá¸ááąáŹááşá ááťá˝ááşáŻááşáááŻáˇ áĄááŻáśá¸ááźáŻáááˇáş ááąáŹááşááśááᯠáá˝áąá¸ááťááşááŤá Application object áááŻáááşááŽá¸ááąáŹáĄá፠backend ááĄáááşáááŻáááşáážááşáááşááŻáśááąáŹááşáááşá
- backend=âwin32âł â áá°áááşá¸áĄáááŻááşá¸áĄááŻáśá¸ááźáŻááąá ááşá MFCá WTLá VB6 áážááˇáş áĄááźáŹá¸ááąáŹ áĄáá˝áąáĄáážá áşáĄáááŽááąá¸áážááşá¸ááťáŹá¸áážááˇáş ááąáŹááşá¸á á˝áŹáĄááŻááşááŻááşáááşá
- backend=âuiaâ â MS UI Automation áĄáá˝ááş backend áĄáá
áş- WPF áážááˇáş WinForms áááŻáˇáážááˇáş ááźáŽá¸ááźááˇáşá
áŻáśá
á˝áŹ áĄááŻááşááŻááşáááşá Delphi áážááˇáşáááşá¸ ááąáŹááşá¸áá˝ááşáááşá Windows áĄááşááşááťáŹá¸ááᯠááááşá¸áááşá¸ááŤá Qt5 áážááˇáş Java áĄáááŽááąá¸áážááşá¸áĄááťááŻáˇáážááˇáş áĄááŻááşááŻááşááŤáááşá ááąááŻááťáĄáŹá¸ááźááˇáş Inspect.exe áááş element ááťáŹá¸áážááˇáş áááşá¸áááŻáˇá properties ááťáŹá¸ááᯠááźááşááŤá ᤠbackend áááş áááˇáşááťáąáŹáşááŤáááşá áĄááźáąááśáĄáŹá¸ááźááˇáş browser áĄááťáŹá¸á
áŻáááş UI Automation áááŻáááşá¸ ááśáˇáááŻá¸ááąá¸ááŤáááş (default áĄáŹá¸ááźááˇáş Mozilla ááźá
áşááźáŽá¸ Chrome áááş á
áááşáááŻááşáááşáážááˇáş command-line switch áááŻáĄááşáááş)á
--force-renderer-accessibilityInspect.exe áážá á áŹááťááşáážáŹááťáŹá¸áážá áĄá áááşáĄáááŻááşá¸ááťáŹá¸ááᯠááźááˇáşáááş)á ááŻááşááŤáááşá ááŽáááşáááşáážáŹ Selenium áá˛áˇ ááźááŻááşáááŻááşáážáŻá áááźá áşáááŻááşáááąáŹááşááŤáá˛á áááąáŹááşááŹáážááˇáşáĄááŻááşááŻááşáááş áĄááźáŹá¸áááşá¸áááşá¸áá áşááŻááŹááźá áşáááş (ááŻááşááŻááşááźááşááťáąáŹáşáážáŻáĄááźáąáĄááąáĄáá˝ááş áĄááŻáśá¸áááşáááŻááşáááş)á
áĄáááŻáĄááťáąáŹááşá áá áşáĄáá˝ááş áááşáá˝ááˇáşáĄáážááşááťáŹá¸
áĄáááŽááąá¸áážááşá¸ááᯠáĄááťááşááááˇáş ááŻááąááááźáŻááŹá¸ááŤáááşá áĄáááŽááąá¸áážááşá¸áĄááŹááášááŻáá
áşááŻáááŻáááşááŽá¸ááźáŽá¸ áááşá¸áááŻáááşáááşáááş áááŻáˇáááŻááş ááŻááşááąáŹááşááąááźáŽá¸ááŹá¸áá
áşááŻáááŻáˇ áá°á¸áá˝á˛áááş áĄááťáááşááťááąáŹááşááźáŽááźá
áşáááşá áááşá¸áááş á
áśáĄáááşá¸áá
áşááŻá áá˝áąá¸ááŻááşááźááşá¸ááťážáᏠáááŻááşááŤá subprocess.PopenáááŻáááŻáááşáážáŹ áááˇáşááŻááşááąáŹááşáážáŻááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠááŻááşáááşá¸á
ááşá áááşááááááşááťáŹá¸áá˝ááş áááˇáşáááşááŹá¸áááˇáş áááˇáşáá˝ááşá¸áááˇáşáĄááŹááášááŻáá
áşááŻááźá
áşáááşá áĄáááŽááąá¸áážááşá¸á ááŹááááťáŹá¸á
á˝áŹááᯠááŻááşááąáŹááşááąááŤá áááşá¸áááş áĄáá˝ááşáĄááŻáśá¸áááşááąáŹáşáááşá¸ ááťááşáĄááŹááťáŹá¸ááᯠáááşáááááťááşááŤá
from pywinauto.application import Application
app = Application(backend="uia").start('notepad.exe')
# ĐпиŃоП ОкнО, кОŃĐžŃОо Ń
ĐžŃиП наКŃи в ĐżŃĐžŃĐľŃŃĐľ Notepad.exe
dlg_spec = app.UntitledNotepad
# МдоП пОка ОкнО ŃоаНŃнО пОŃвиŃŃŃ
actionable_dlg = dlg_spec.wait('visible')áĄáááşá áááşáááş áĄáááŽááąá¸áážááşá¸ááťáŹá¸á
á˝áŹááᯠáá
áşááźááŻááşáááş á
áŽááśáááˇáşáá˝á˛áááŻááŤáá á¤áĄáááşá¸áááş áááˇáşáĄáŹá¸ áá°ááŽááąá¸ááŤáááşá Desktop. áĽáááŹáĄáŹá¸ááźááˇáşá Win10 áážá ááááşá¸ááąáŤááşá¸á
ááşáá
áşááŻáá˝ááşá ááŻááşáááşá¸á
ááşáĄááťáŹá¸áĄááźáŹá¸áá˝ááş ááźááşá
ááşááťáŹá¸á áĄáááşáááşá¸áĄáááˇáşááᯠááźááˇáşááźááşááŹá¸áááş (ááŹááá calc.exe) ááŤááźáąáŹááˇáş áĄááŹááášáᯠááážááá°á¸á Desktop áááŻáśááąáŹááşá
from subprocess import Popen
from pywinauto import Desktop
Popen('calc.exe', shell=True)
dlg = Desktop(backend="uia").Calculator
dlg.wait('visible')áĄááźá
áşáĄááŹááášáᯠ(Application áááŻáˇáááŻááş Desktop) áááş backend áááŻáááşáážááşáááşáááŻáĄááşáááˇáşáá
áşááŻáááşá¸ááąáŹááąááŹááźá
áşáááşá áĄááźáŹá¸áĄááŹáĄáŹá¸ááŻáśá¸áááş âáááşáážááşááťááş->ááŻááşáááŻá¸ááźááşá¸â áááąáŹáááŹá¸áá˝ááş áá˝ááˇáşáááşá¸ááźááşááŹá
á˝áŹ ááťááąáŹááşááąááźáŽá¸á ááąáŹááşáááŻááşá¸áá˝ááş áá˝áąá¸áá˝áąá¸áá˝áŹá¸ááŤáááşá
Window/Element Specifications
á¤áááşáážáŹ pywinauto áĄááşááŹááąáˇá áşáááŻáááşááąáŹááşááŹá¸áááˇáş áĄááááááąáŹáááŹá¸ááźá áşáááşá áááşá¸áááŻá¸/ááźááşá ááşáá áşááŻáĄáŹá¸ áĄááźááşá¸ááťááşá¸ áááŻáˇáááŻááş áááŻáááŻáĄááąá¸á áááşááąáŹáşááźáááŻááşááąáŹáşáááşá¸ áááşá¸áááş ááááşáážáááąá¸ áááŻáˇáááŻááş ááááşááŹá¸ááźáŽá¸ááźá áşáááşá Window specification (áĄááŹááášáᯠWindow Specification) á á áşáážááşááąáŹ áááşá¸áááŻá¸ áááŻáˇáááŻááş ááźááşá ááşááᯠáážáŹáá˝áąááááˇáş á áśáážáŻááşá¸ááťáŹá¸ááᯠááááşá¸áááşá¸ááŹá¸áááşá
áĄááąá¸á áááş áááşá¸áááŻá¸áááşáážááşááťááş áĽáááŹ-
>>> dlg_spec = app.window(title='Untitled - Notepad')
>>> dlg_spec
<pywinauto.application.WindowSpecification object at 0x0568B790>
>>> dlg_spec.wrapper_object()
<pywinauto.controls.win32_controls.DialogWrapper object at 0x05639B70>áááşá¸áááşá¸ááᯠááąáŤáşáááŻááźááşá¸ááźááˇáş áááşá¸áááŻá¸áážáŹáá˝áąáážáŻ áááŻááşáááŻááş ááźá
áşááąáŤáşáááşá .wrapper_object(). áááşá¸áááş ááááˇáşááźáááşá¸ááąáŤááş/ááźááşá
ááş áááŻáˇáááŻááş áá
áşááźááşá¸áĄáá˝ááş áĄááťááŻáˇááąáŹ âááŻááşáááŻá¸ááźááşá¸â ááᯠááźááşááąá¸áááşá ElementNotFoundError (áá
áşááŤáá
áşááśáá˝ááş ElementAmbiguousErrorááźááşá
ááşááťáŹá¸á
á˝áŹááᯠáá˝áąáˇáážáááŤáá áážáŹáá˝áąáážáŻá
áśáážáŻááşá¸ááᯠáážááşá¸áááşá¸áááş áááŻáĄááşáááşá ᤠ"wrapper" áááş ááźááşá
ááşáá
áşááŻáážááˇáş ááŻááşááąáŹááşááťááşáĄááťááŻáˇááᯠáááşáááŻáˇááŻááşááąáŹááşááááşááᯠááááźáŽá¸ááźá
áşáááş áááŻáˇáááŻááş áááşá¸áážááąááŹááᯠáááşááśááážááááşááźá
áşáááşá
Python áááş ááąáŤáşáááŻáážáŻááᯠááťáąáŹááşáááŻááşáááşá .wrapper_object()áááŻáˇááźáąáŹááˇáş ááąáŹááşááŻáśá¸ááŻááşáááş áááŻáááŻááŹáááşá áĄáážáŹá¸áážáŹááźááşááźááşá¸áĄáá˝ááşáᏠáĄááŻáśá¸ááźáŻáááş áĄááźáśááźáŻáĄááşááŤáááşá ááąáŹááşáááŻááşá¸áážá
áşááźáąáŹááşá¸á áĄáá°áá°ááŤáá˛-
dlg_spec.wrapper_object().minimize() # debugging
dlg_spec.minimize() # productionáááşá¸áááŻá¸áááşáážááşááťááşáĄáá˝ááş áážáŹáá˝áąáážáŻá áśáážáŻááşá¸ááťáŹá¸á á˝áŹáážááááşá á¤áááşáážáŹ áĽáááŹáĄáááşá¸áááşááŹááźá áşáááşá
# ПОгŃŃ Đ¸ĐźĐľŃŃ Đ˝ĐľŃкОНŃкО ŃŃОвноК
app.window(title_re='.* - Notepad$').window(class_name='Edit')
# ПОМнО кОПйиниŃОваŃŃ ĐşŃиŃĐľŃии (как AND) и но ОгŃаниŃиваŃŃŃŃ ĐžĐ´Đ˝Đ¸Đź ĐżŃĐžŃĐľŃŃОП ĐżŃиНОМониŃ
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')ááźá áşáááŻááşááťáąáážáááąáŹ áááşáážááşááťááşááťáŹá¸á áŹáááşá¸áááş function docs áá˝ááşáážááááşá .
attribute áážááˇáş key ááźááˇáşáááşááąáŹááşááźááşá¸ááážáąáŹáş
Python áááş window specification ááťáŹá¸áááŻáááşááŽá¸áááşáážááˇáş object attribute ááťáŹá¸ááᯠdynamically áĄáááĄáážááşááźáŻáááşáá˝ááşáá°á
áąáááşá __getattribute__) ááŻááşááŤáááşá áá°ááŽááąáŹáááˇáşáááşááťááşááťáŹá¸áááş áááşáááˇáş variable ááĄáááşáá˝ááşáááᯠattribute name áá˝ááşáááˇáşáá˝ááşá¸ááŹá¸ááŤáááş (ááąááŹáá˝ááşááťáŹá¸á ááąáŹáşááŹááťáŹá¸á áááŻáˇáááŻááş áĄááźáŹá¸áĄáá°á¸áĄáášáááŹááťáŹá¸áááˇáşáááááŤ)á ááśááąáŹááşá¸ááąáŹááşáá
á˝áŹá pywinauto áááş typos áážááˇáş ááąá¸áááşááąáŹáá˝á˛ááźáŹá¸áážáŻááťáŹá¸áááŻááśáááŻááşáááşáážáááąáŹ "áĄááąáŹááşá¸ááŻáśá¸áááŻááşááŽáážáŻ" áážáŹáá˝áąáážáŻáĄááşááááŻááŽáááşáááŻáĄááŻáśá¸ááźáŻáááşá
app.UntitledNotepad
# ŃĐž Мо ŃаПОо, ŃŃĐž
app.window(best_match='UntitledNotepad')áĄáááşá áááşáááş áá°ááŽááŻááşá áŹááźáąáŹááşá¸ááťáŹá¸ (áĽáááŹá ááŻáážáŹá¸ááŹááŹá ááŹá¸áĄáá˝ááş)á spaces á áááşáááŻáˇááᯠáááŻáĄááşááąááąá¸ááŤáá áááşáááş (ááŻáśáážááşáĄááááŹááşáá˛áˇáááŻáˇ) ááąáŹáˇááźááˇáş áááşááąáŹááşáááŻááşáááş-
app['Untitled - Notepad']
# ŃĐž Мо ŃаПОо, ŃŃĐž
app.window(best_match='Untitled - Notepad')áážáąáŹáşáĄáááşááťáŹá¸áĄáá˝ááş á ááşá¸ááťááşá¸ááŤá¸ááŻ
á áśáážáąáŹáşáĄáááşááťáŹá¸ááᯠáááşáááŻáˇáážáŹáá˝áąááááşáááşá¸á ááážáŹáá˝áąáᎠááźááşá ááşáááŻáˇ ááŹáááşááąá¸ááŹá¸áááˇáşáĄááŹááťáŹá¸á áĄáááşá áááşáááş á áśáážáŻááşá¸áážááˇáş ááŻáśááąáŹááşááąáŹ áá°ááŽááąáŹ áĄáááşáá áşááŻááᯠáááşáážááşááŤáá áĄá áááşáĄáááŻááşá¸ááᯠáá˝áąáˇááááˇáşáááşá
- ááąáŤááşá¸á
ááş (á
áŹááŹá¸á áĄáááşáĄáŹá¸ááźááˇáş)
app.Properties.OK.click() - á
áŹááŹá¸áážááˇáş ááźááşá
ááşáĄááťááŻá¸áĄá
áŹá¸áĄáŹá¸ááźááˇáş-
app.Properties.OKButton.click() - áĄááťááŻá¸áĄá
áŹá¸áážááˇáş ááśááŤááşáĄáááŻááş-
app.Properties.Button3.click()(áĄáááşááťáŹá¸Button0иButton1áááááźááşáážááˇáş ááťááşáážáąáŹááşááŹá¸áááşááᯠáá˝áąáˇááááşáButton2- ááŻáááá ááźáŽá¸ááž áĄá ááşáááŻááş - ááŤá ááááŻááşá¸áážáŹ ááźá áşááťááşáá˛áˇááŹááŤ) - áĄááźáááşá
áŹááŹá¸ (áááşáááş áááŻáˇáááŻááş áĄááąáŤáş) áážááˇáş áĄááťááŻá¸áĄá
áŹá¸áĄáŹá¸ááźááˇáş-
app.OpenDialog.FileNameEdit.set_text("")(ááźáąáŹááşá¸áá˛ááąááąáŹ á áŹááŹá¸ááŤááąáŹ ááźááşá ááşááťáŹá¸áĄáá˝ááş áĄááŻáśá¸áááşáááş) - áĄááťááŻá¸áĄá
áŹá¸áĄáááŻááşá áĄáá˝ááşá¸ááž á
áŹááŹá¸ááźááˇáş-
app.Properties.TabControlSharing.select("General")
áĄááťáŹá¸áĄáŹá¸ááźááˇáş á ááşá¸ááťááşá¸ áážá áşáᯠáááŻáˇáááŻááş ááŻáśá¸ááŻááᯠáá áşááťáááşáááşá¸áá˝ááş ááťááˇáşááŻáśá¸ááąáˇáážáááźáŽá¸ áááşá¸ááŤá¸ááŤáááşá ááźááşá ááşáá áşááŻá áŽáĄáá˝ááş áááşáááˇáşáĄáááşááťáŹá¸ááážááááŻááşáááşááᯠá á áşááąá¸áááşá áááşáááşá¸áááşá¸ááᯠáĄááŻáśá¸ááźáŻáááŻááşáááşá print_control_identifiers(). áááşá¸áááş áááşááŹá¸ááźááşáážááˇáş áááŻááşáá áşááŻáááŻáˇ ááźááşá ááşáá áşáá áşáááşááᯠááááˇáşááŻááşáááŻááşáááşá ááźááşá ááşáá áşááŻá áŽáĄáá˝ááşá áááşá¸á á áśáážáąáŹáşáĄáááşááťáŹá¸ááᯠáááŻááşáážáááşááŹá¸áááşá áááąá¸ááźááşá ááşááťáŹá¸á áĄááąá¸á áááşáĄááťááşáĄáááşááťáŹá¸ááᯠáááŻááąááŹááž áá°á¸áá°ááźáŽá¸ áá°á¸áááˇáşáááŻááşáááşá ááŹááşáá˝ážááşá¸áážáááááşáááş á¤áá˛áˇáááŻáˇááźá áşááááˇáşáááş-
app.Properties.child_window(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' title="Type:", auto_id="13080", control_type="Text")
|
| Edit - 'Type:' (L790, T643, R1036, B666)
| [u'4', 'Edit2', u'Type:Edit']
| child_window(data-gt-translate-attributes='["title"]' title="Type:", auto_id="13059", control_type="Edit")
|
| Static - 'Location:' (L717, T669, R780, B684)
| [u'Location:Static', u'Location:', u'Static2']
| child_window(data-gt-translate-attributes='["title"]' title="Location:", auto_id="13089", control_type="Text")
|
| Edit - 'Location:' (L790, T669, R1036, B692)
| ['Edit3', u'Location:Edit', u'5']
| child_window(data-gt-translate-attributes='["title"]' title="Location:", auto_id="13065", control_type="Edit")
|
| Static - 'Size:' (L717, T695, R780, B710)
| [u'Size:Static', u'Size:', u'Static3']
| child_window(data-gt-translate-attributes='["title"]' title="Size:", auto_id="13081", control_type="Text")
|
| Edit - 'Size:' (L790, T695, R1036, B718)
| ['Edit4', u'6', u'Size:Edit']
| child_window(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13088", control_type="Text")
|
| Edit - 'Contains:' (L790, T747, R1036, B770)
| [u'8', 'Edit6', u'Contains:Edit']
| child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13087", control_type="Edit")
|
| Image - 'Contains:' (L717, T773, R1035, B775)
| [u'Contains:Image', 'Image3', u'Contains:2']
| child_window(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13092", control_type="Text")
|
| Edit - 'Created:' (L790, T786, R1036, B809)
| [u'Created:Edit', 'Edit7', u'9']
| child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13072", control_type="Edit")
|
| Image - 'Created:' (L717, T812, R1035, B814)
| [u'Created:Image', 'Image4', u'Created:2']
| child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13097", control_type="Image")
|
| Static - 'Attributes:' (L717, T825, R780, B840)
| [u'Attributes:Static', u'Static7', u'Attributes:']
| child_window(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' title="Advanced...", auto_id="13154", control_type="Button")
|
| Button - 'OK' (L814, T968, R889, B991)
| ['Button2', u'OK', u'OKButton']
| child_window(data-gt-translate-attributes='["title"]' title="OK", auto_id="1", control_type="Button")
|
| Button - 'Cancel' (L895, T968, R970, B991)
| ['Button3', u'CancelButton', u'Cancel']
| child_window(data-gt-translate-attributes='["title"]' title="Cancel", auto_id="2", control_type="Button")
|
| Button - 'Apply' (L976, T968, R1051, B991)
| ['Button4', u'ApplyButton', u'Apply']
| child_window(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' title="General", control_type="TabItem")
| |
| | TabItem - 'Sharing' (L753, T558, R801, B576)
| | [u'Sharing', u'SharingTabItem', 'TabItem2']
| | child_window(data-gt-translate-attributes='["title"]' title="Sharing", control_type="TabItem")
| |
| | TabItem - 'Security' (L801, T558, R851, B576)
| | [u'Security', 'TabItem3', u'SecurityTabItem']
| | child_window(data-gt-translate-attributes='["title"]' title="Security", control_type="TabItem")
| |
| | TabItem - 'Previous Versions' (L851, T558, R947, B576)
| | [u'Previous VersionsTabItem', u'Previous Versions', 'TabItem4']
| | child_window(data-gt-translate-attributes='["title"]' title="Previous Versions", control_type="TabItem")
| |
| | TabItem - 'Customize' (L947, T558, R1007, B576)
| | [u'CustomizeTabItem', 'TabItem5', u'Customize']
| | child_window(data-gt-translate-attributes='["title"]' 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(data-gt-translate-attributes='["title"]' title="System", auto_id="MenuBar", control_type="MenuBar")
| | |
| | | MenuItem - 'System' (L696, T526, R718, B548)
| | | [u'System2', u'MenuItem', u'SystemMenuItem']
| | | child_window(data-gt-translate-attributes='["title"]' title="System", control_type="MenuItem")
| |
| | Button - 'Close' (L1024, T519, R1058, B549)
| | [u'CloseButton', u'Close', 'Button5']
| | child_window(data-gt-translate-attributes='["title"]' title="Close", control_type="Button")áĄááťááŻáˇááá
ášá
ááťáŹá¸áá˝ááşá áá
áşáááşáá
áşááŻááŻáśá¸ááᯠááŻáśáážáááşááźááşá¸áážáŹ áážáąá¸áá˝áąá¸áááŻááşáááş (áĽáááŹá iTunes áá˝ááş áááşááşáá
áşááŻáá˝ááş ááźááşá
ááşááąáŤááşá¸ ááŻáśá¸ááąáŹááşáĄáá áážááááş)á áááŻáˇááąáŹáş áááşáá˝áąá¸ááťááşáááŻááşáááş depth (áĄááááşáĄáááş) depth=1 - ááźááşáááşáááşá depth=2 - áááşáááşá¸áááąá¸áá˝áąáᲠááźá
áşáá˝áŹá¸ááźáŽá áááşááŽá¸ááŹáá˝ááşáááşá¸ áááşáážááşááťááşááťáŹá¸á áááşáážááşáááŻááşáááşá child_window.
áĽáááŹ
ááťá˝ááşáŻááşáááŻáˇáááş áĄáááşáááźááş ááźááˇáşáááşá¸ááąá¸ááąááŤáááşá . áááźáŹááąá¸ááŽááĄááŹááťáŹá¸áá˛áá˝ááş WireShark áá˝ááşáááşáá˝á˛ááźááşá¸á
áááşááźáŹáá°ááĄáááŻáĄááťáąáŹááşááŻááşááąáŹááşáážáŻáááŻáááááźáŻáááˇáşáááş (áááşá¸áááş Qt5 áĄáááŽááąá¸áážááşá¸áá
áşááŻáááąáŹááşá¸ááąáŹáĽáááŹáá
áşááŻááźá
áşáááşá á¤ááŹáááşááᯠGUI áááŤáá˛ááźáąáážááşá¸áááŻááşááąáŹáşáááşá¸á ááźá
áşááąáŹááźáąáŹááˇáşá scapy.Sniffer Python áĄááŻááşááž ) áááşá¸á Ribbon toolbar ááźááˇáş MS Paint áĄáááŻáĄááťáąáŹááşááŻááşááąáŹááşááźááşá¸á áĽáááŹáá
áşááŻáááşá¸ áážáááŤáááşá
ááťá˝ááşáŻááşá ááťáąáŹááşá¸ááŹá¸áá áşáŚá¸ ááąá¸ááąáŹ ááąáŹááşáááş áĽáááŹááąáŹááşá¸áá áşááŻá (áĄáááşá¸áááşáĄááźáŹáá˝ááş main repository áááŻáˇ áá˝ážáąáˇááŤáááşá)
áááŻáˇáĄááźááşá ááŽá¸ááŻááş (hot keys) áážááˇáş mouse ááźá
áşáááşááťáŹá¸ááᯠá
áŹáááşá¸áá˝ááşá¸ááźááşá¸á áĽáááŹáá
áşááŻá
.
ááťáąá¸áá°á¸áááşáá˝ážáŹ
áááąáŹááťááşááᯠá
ááşáááşáááźááş áá°ááŽááśáˇáááŻá¸ááąá¸áá°ááťáŹá¸ááᯠáĄáá°á¸áááş ááťáąá¸áá°á¸áááşáážáááŤáááşá ááŤáˇáĄáá˝ááşáá˛áˇ ááŤá áĄááźá˛áááşá¸ ááŤáááŹááŤá UNN ááž ááťá˝ááşáŻááşá ááťáąáŹááşá¸ááŹá¸ áážá
áşáŚá¸áááş á¤áĄááźáąáŹááşá¸áĄááŹáážááˇáş áááşáááşá áááşá¸áááŻáˇá áá˝á˛áˇááŽáááŽááťáŹá¸ááᯠáááźáŹááąá¸ááŽá ááŻááśááŹáá˝ááşáá˛áˇáááşá MS UI Automation áĄáá˝ááş ááśáˇáááŻá¸áá°ááŽáááş ááźáŽá¸ááŹá¸ááąáŹ ááśáˇáááŻá¸áá°ááŽáážáŻáá
áşááŻááᯠááźáŻááŻááşáá˛áˇááźáŽá¸ áááźáŹááąá¸ááŽá á
áŹááŹá¸ááŻááşááášááááťáŹá¸ááᯠáĄááźáąááśá "áážááşáááşá¸-ááźááşáá˝ááˇáşááźááşá¸" ááááŹáááᯠáĄááźáąááśá áĄáááŻáĄááťáąáŹááşááŻááşááŻááşááąá¸ááźááşá¸ (áááşá¸áááş áĄáážáŻááşáá˝áąá¸ááŻáśá¸áĄááşášááŤáááşááźá
áşáááş)á áááŻáĄááťáááşáĄáá "uia" ááąáŹááşááśáĄáá˝ááşáᏠááźá
áşáááşá backend áĄáá
áşáá
áşááŻááᯠááŽáá˝ááşááąááŤáááş Linux AT-SPI (ááąáŹáşááťá°á¸ááťáŹá¸) ááᯠáĄááźáąááśá mouse и keyboard áĄááźáąááś - 0.6.x) áá˝ááşáážáááźáŽá¸ááźá
áşáááşá
ááťá˝ááşáŻááşáááş Python áá˝ááş áĄáááŻáĄááťáąáŹááşá áá áşáááŻááşáᏠáĄáá°á¸áááşáááşá¸ááᯠáĄááťáááşáĄááąáŹáşááźáŹ áááşááźáŹá¸ááąá¸ááąááąáŹááźáąáŹááˇáş áĄááťááŻáˇááąáŹ ááŹá ááŹááťáąáŹááşá¸ááŹá¸ááťáŹá¸áááş áĄáááşá áŹááŻááşáᏠáĄááşášááŤáááşáááşááťáŹá¸ áááŻáˇáááŻááş áĄáááŻáĄááťáąáŹááşá áá áşá ááá°ááŹááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşááźáááşá ááŻááąáááĄáááˇáşáážá áĄááááĄááťááşáĄááťááŻáˇáááŻáááşá¸ ááťáąáŹááşá¸ááŹá¸ááťáŹá¸á áá áşááťáááşá áážáŹáá˝áąáá˝áąáˇáážááá˛áˇáááşá áá áşááŤáá áşááśáá˝ááş áááşáááş ááŻááşá áĄáááşáĄáá˝áąá¸ááᯠáááşá¸áááşá¸ááťááşááťááş á áąáŹááˇáşááźááˇáşáááş áááŻáĄááşááąáŹáşáááşá¸á ááŻááşáá˝ážááşá¸ááźáŻáśáážáŻ 95% áááşá¸ááťááşáážáááąáŹ áááşááźáááşááąáŹáá˝á˛ááźááşá¸á áááşááźáŹáá°ááťáŹá¸ (QuantifiedCodeá Codacy áážááˇáş Landscape) áážááˇáş cloud áážá áĄáááŻáĄááťáąáŹááşá ááşá¸áááşáážáŻááťáŹá¸ (AppVeyor áááşááąáŹááşáážáŻ) áááş áááşá¸áĄáá˝ááş ááťáŹá¸á á˝áŹáĄááąáŹááşáĄáá°ááźáŻááŤáááşá
ááŻáśá¸áááşááťááşááťáŹá¸ááᯠááťááşááŹá¸áá˛áˇáᏠáĄáážáŹá¸áĄáá˝ááşá¸ááťáŹá¸ááᯠááąáŹáşááŻááşáᏠáá˝á˛áá°ááąáŹááşá¸áááŻáážáŻááťáŹá¸ááᯠááąá¸áááŻáˇááźáá°áááŻááşá¸áááŻáááşá¸ ááťáąá¸áá°á¸áááşááŤáááşá
áááşááąáŹááşá¸áĄáááşá¸áĄááźá áşááťáŹá¸
ááťá˝ááşáŻááşáááŻáˇáááş ááąá¸áá˝ááşá¸ááťáŹá¸ááᯠáááŻááşááŹáááşá (áááźáŹááąá¸ááŽáááąáŤáşááŹáááşá ) áážááşáˇ á áážááááş .
ááťá˝ááşáŻááşáááŻáˇáááş áá ááş update ááŻááşááŤáááşá . GitHub áá˝ááşááźááşáá˝ááˇáşáĄááąáĄáá˝ááşáĄáá Autohotkey ááŹááťážááş (áá°áááŻáˇáá˝ááşáĄáá˝ááşááźáŽá¸ááŹá¸ááąáŹáĄáááŻááşá¸áĄáááŻááşá¸áážááˇáşáážááşááťáŹá¸ááąáŹááááŻááşá¸ááźáąáŹááşá¸áážááááş) áážááˇáş PyAutoGUI áááşáááŻáááŻááźááşáááşááŹáááş (áááşá¸áá áŹááąá¸ááᏠAl Sweigart áá áŹáĄáŻááşááťáŹá¸áááąáááşá¸á áŹá¸áážáŻááźáąáŹááˇáşáĄááááĄáŹá¸ááźááˇáş - "ááźáŽá¸áá˝áąáˇá ááŹááťáŹá¸áááŻáĄáááŻáĄááťáąáŹááşááŻááşááŤá Pythonâ áážááˇáş áĄááźáŹá¸)á
source: www.habr.com
