แแแแแแแก แแแแแแแแแแ โ ััะพ open source ะฟัะพะตะบั ะฟะพ ะฐะฒัะพะผะฐัะธะทะฐัะธะธ ะดะตัะบัะพะฟะฝัั GUI ะฟัะธะปะพะถะตะฝะธะน ะฝะฐ Windows. ะะฐ ะฟะพัะปะตะดะฝะธะต ะดะฒะฐ ะณะพะดะฐ ะฒ ะฝะตะน ะฟะพัะฒะธะปะธัั ะฝะพะฒัะต ะบััะฟะฝัะต ัะธัะธ:
- ะะพะดะดะตัะถะบะฐ ัะตั ะฝะพะปะพะณะธะธ MS UI Automation. ะะฝัะตััะตะนั ะฟัะตะถะฝะธะน, ะธ ัะตะฟะตัั ะฟะพะดะดะตัะถะธะฒะฐัััั: WinForms, WPF, Qt5, Windows Store (UWP) ะธ ัะฐะบ ะดะฐะปะตะต โ ะฟะพััะธ ะฒัะต, ััะพ ะตััั ะฝะฐ Windows.
- backends/plugins-แแก แกแแกแขแแแ (แแแแแแแ แแ แแก แแ แ แแแแแแแ แฅแฃแแแก แฅแแแจ: แแแแฃแแแกแฎแแแแ
"win32"แแ แแฎแแแ"uia"). แจแแแแแ แจแแฃแคแแ แฎแแแแแ แแแแแแแแ แ แแ แแก-แแแแขแคแแ แแแแ. - Win32 แแแแแแแ แแแฃแกแแกแ แแ แแแแแแแขแฃแ แแกแแแแก (แชแฎแแแ แแแแแแจแแแ pyHook-แแก แกแฃแแแกแแแแแแแแ).
แฉแแแ แแกแแแ แแแแชแแแ แแแแแ แแแแแฎแแแแแก, แแฃ แ แ แแ แแก แฎแแแแแกแแฌแแแแแ แแแกแแขแแแแก แแแขแแแแขแแแแชแแแกแแแแก แฆแแ แฌแงแแ แแจแ (แกแแ แแแแฃแแ แจแแแแ แแแแก แแแ แแจแ).
แแก แกแขแแขแแ แแ แแก แแแฎแกแแแแแแก แแแฌแแแแแ แแแ แฉแแแแฌแแ แ แแแแกแแจแ SQA Days 20 แแแแคแแ แแแชแแแแแ ( ะธ ), แแแฌแแแแแ แแ แ แฃแกแฃแแ แแแ แกแแ แแแแแแแแขแแกแแแแก.
- แซแแ แแแแแ แแแแแแแแแ
- แแแกแแขแแแแก แฎแแแแแกแแฌแแแแแแแแก แซแแ แแแแแ แขแแฅแแแแแแแแแ
แแแแแฌแงแแ แแ แกแคแแ แแจแ แฆแแ แฌแงแแ แแก แแแแแ แแแแแฎแแแแแ. แแแกแแขแแแแก GUI แแแแแแแชแแแแแกแแแแก, แงแแแแแคแแ แ แแแ แแแแฃแแฌแแแแ แฃแคแ แ แ แแฃแแแ, แแแแ แ แแแแแ, แ แแแแแกแแช แแฅแแก แกแแแแแ. แแฅ แแ แแก แซแแ แแแแแ แแแแแแแแแ:
แแแแ แแแแแชแแแก แแแแแแ
แแแฌแแแแฃแแแแแก แฅแฃแแแแแก แแงแแ แ แแแแแ แแแ, แฉแแแ แแแแแ แแแแฅแแก, แ แแ แฌแแ แแแขแแแฃแแ แแฅแแแแ.
[+] แฏแแแ แแแแแ แแแแขแคแแ แแ, แแแ แขแแแ แแแแฎแแ แชแแแแแแ.
[+] แกแแขแแกแขแ แฉแแแแฌแแ แแแแก โแฉแแฌแแ แ-แแแแแแ แแแโ แแแ แขแแแแ.
[-] แงแแแแแแ แแ แแกแขแแแแแฃแ แแ แแแ แแแแก แแแ แฉแแแแแแแแก, แแแแแก, แจแ แแคแขแแแแก, แคแแแฏแ แแแแก แแแแแก แแ แ.แจ.
[-] แกแแญแแ แแ แฃแแแ แแแแแ แ แแฎแแ แแแญแแ แแก แซแแแแกแฎแแแแ; แฎแจแแ แแ แฃแคแ แ แแแแแแแ แขแแกแขแแแแก แ แแแแแแ แแชแแ แแฃแแแแแ แแ แฎแแแแ แขแแกแขแแ แแแ.
[-] แแฎแแแแก แแฎแแแแ แแแฅแแแแแแแแแก แแแขแแแแขแแแแ แแแแก; แแ แกแแแแแก แแแแแชแแแแแแก แแแแแแแฌแแแแแกแ แแ แแฆแแแแแแก แกแฎแแ แแแแแแแแ.
แแแกแขแ แฃแแแแขแแแ (แฏแแแ แแแแแ แแแแขแคแแ แแ): , , แแ แแ แแแแแ แกแฎแแ. แ แแแแ แช แฌแแกแ, แฃแคแ แ แ แแฃแแ แฎแแแกแแฌแงแแแแ แแแแชแแแก แแ แคแฃแแฅแชแแแแแ แแแแก (แงแแแแแแแแก แแ แแ แแก แฏแแแ แแแแแ แแแแขแคแแ แแ).
แแฆแกแแแแจแแแแแ, แ แแ แแแแ แแแแแขแแ แแแแแแก แจแแฃแซแแแ แจแแแแกแแก แกแฎแแ แแแแแแแแแ. แแแแแแแแแ, แแแ แแแแฃแแ แแ แแคแแแแกแแแแก, แจแแแแซแแแแ แแแแฌแแแแฃแแแ แจแแแแ แแแแ แแแแ แแแแแขแแแแ (แคแแแฏแ แแก/แแแแแแแขแแก แแแแ แแแ แชแฎแแแ แแฃแแฎแแแแ แแ แแ แ แแแแ แแแ แแแแ) - แแก แฉแแแฃแแแแ แแ แกแแแแแแ แกแแแแแแแ, แแแแกแแแฃแแ แแแแ แแฃ แแแแแแแแแแกแฌแแแแแ แกแแแ แซแแก/แกแแแแแแก. แแแแแ แแแแแแแขแ (แแแจแแ แแแ แแแแก แกแฎแแแแแกแฎแแ แแแ แฉแแแแแแแ แแ แแแแแแ แแแแแก).
แแแแแ แแ แแ แแแ แแแแขแ: แแแแแงแแแแ แแฎแแแแ แแ แแ แแแแฅแแแ แกแขแแแแแฃแ แ แแแ แแแแขแ แแแแ แขแแกแขแแ แแแแกแแแแก (แแ แ แฏแแแ แแแแแ แแแแขแคแแ แแ, แแแแ แแ แแแแแแ แ แจแแแแฎแแแแแจแ แแก แแแ แแแ).
แกแแชแแแแแ แ แกแฃแ แแแแก แแแแชแแแแ
[+] แฏแแแ แแแแแ แแแแขแคแแ แแ[+-] แจแแแแ แแแแ แกแแแแแแ (แฃแแแแแกแ แแแแ แ แแแแ แแแแแขแแ แแแแแแ), แแแแ แแ แแแแแช แแแแแฎแแแก แแแ แแแแฃแ แฎแ แแแแแก.
[-+] แจแแแแ แแแแ แแแแ, แแแแขแแ แแแแแฎแแแก CPU แ แแกแฃแ แกแแแก แแแแชแแแแแก แแแแแ แแแแแแแกแแแแก.
[-] แขแแฅแกแขแแก แแแแชแแแแ (OCR), แ แแแแ แช แฌแแกแ, แแแแแ แแชแฎแฃแแแ => แขแแฅแกแขแแก แแแแแชแแแแแแก แแแฆแแแ แจแแฃแซแแแแแแแ. แ แแแแแแแแแช แแ แแแชแ, แแ แกแแแฃแแ OCR แแแแแฌแงแแแขแแแแแแแ แแ แแ แแก แซแแแแแ แกแแแแ แแ แขแแแแก แแแแชแแแแแแกแแแแก แแ แแ แแ แแก แคแแ แแแ แแแแแงแแแแแฃแแ (แแแแแกแแแแแแแ แแแแแแขแแ แแแจแ, แแฃ แแก แฃแแแ แแกแ แแ แแ แแก).
แแแกแขแ แฃแแแแขแแแ: , (Sikuli-แแแแกแแแแแ, แกแฃแคแแ แแแแแแ), .
แฎแแแแแกแแฌแแแแแแแแก แขแแฅแแแแแแแ
[+] แงแแแแแแ แกแแแแแแ แแแแแแ, แ แแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแซแแแแแ แขแแฅแกแขแแก แแแฎแแแแแ, แแแฃแฎแแแแแแ แแแแกแ, แแฃ แ แแแแ แแ แแก แแแ แแแแแแชแแแฃแแ แกแแกแขแแแแก แแ แฉแแ แฉแแก แแแแ .[+] แแแซแแแแ แกแแจแฃแแแแแแก แแแแแฆแแ แขแแฅแกแขแฃแ แ แแแแแชแแแแแ => แฃแคแ แ แแแแแแแ แขแแกแขแแก แจแแแแแแแแก แแแแแแแฌแแแแ.
[+] แ แแแแ แช แฌแแกแ, แงแแแแแแ แกแฌแ แแคแ, แแแแขแแ แแแแฅแแแก แแ แแแแฎแแแ แก CPU แ แแกแฃแ แกแแแก.
[-] ะขัะถะตะปะพ ัะดะตะปะฐัั ะบัะพัั-ะฟะปะฐััะพัะผะตะฝะฝัะน ะธะฝััััะผะตะฝั: ะฐะฑัะพะปััะฝะพ ะฒัะต open-source ะฑะธะฑะปะธะพัะตะบะธ ะฟะพะดะดะตัะถะธะฒะฐัั ะพะดะฝั-ะดะฒะต accessibility ัะตั ะฝะพะปะพะณะธะธ. Windows/Linux/MacOS ัะตะปะธะบะพะผ ะฝะต ะฟะพะดะดะตัะถะธะฒะฐะตั ะฝะธะบัะพ, ะบัะพะผะต ะฟะปะฐัะฝัั ัะธะฟะฐ TestComplete, UFT ะธะปะธ Squish.
[-] แแกแแแ แขแแฅแแแแแแแ แแ แแแชแแแจแ แงแแแแแแแแก แแ แแ แแก แฎแแแแแกแแฌแแแแแ. แแแแแแแแแ, แฉแแขแแแ แแแแก แแแ แแแแก แขแแกแขแแ แแแ VirtualBox-แจแ - แแก แจแแฃแซแแแแแแแ แแแแแกแแฎแฃแแแแแก แแแแชแแแแแก แแแ แแจแ. แแแแ แแ แแแแ แแแแกแแแฃแ แจแแแแฎแแแแแจแ, แฎแแแแแกแแฌแแแแแแแแก แแแแแแแ แแแแแ แแแแแแงแแแแแ. แแก แจแแแแแแแจแ แแฅแแแแ แแแแฎแแแฃแแ.
แแแกแขแ แฃแแแแขแแแ: C#-แจแ, C#-แจแ (แกแแแแแ แแแแกแแแแแ), C#-แจแ (Appium แแแแกแแแแแ), , (LDTP แแแแกแแแแแ) , แ แฃแแแจแ, (Linux Desktop Testing Project) ะธ ะตะณะพ Windows แแแ แกแแ .
LDTP แแ แแก แแแแแ แแ แแแแแ แแ แแแแขแคแแ แแ แฆแแ แฌแงแแ แแก แแแกแขแ แฃแแแแขแ (แฃแคแ แ แแฃแกแขแแ, แแแแแแแแแแแแแก แแฏแแฎแ), แ แแแแแแช แแแคแฃแซแแแแฃแแแ แฎแแแแแกแแฌแแแแแแแแก แขแแฅแแแแแแแแแแ. แแฃแแชแ, แแก แแ แช แแฃ แแกแ แแแแฃแแแ แฃแแแ. แแ แแแแแแ แแ แแแแแแแงแแแแแแ, แแแแ แแ แแแแแฎแแแแแแแก แแแฎแแแแแ, แแแกแ แแแขแแ แคแแแกแ แแ แแ แแก แงแแแแแแ แแแกแแฎแแ แฎแแแแแ. แแฃ แแฅแแแ แแแฅแแ แแแแแแแแ แแแแแฎแแแฃแ แแแ, แแแฎแแแ แแแแแแแ แแ แแแ แแแแแแขแแ แแแจแ.
แกแแขแแกแขแ แฃแแแแ แแแ แ (แแแฃ แจแแแ แแแแแกแแแแแ)
แแ แแก-แแแแขแคแแ แแฃแแ แแแแแแแชแแแแแกแแแแก, แแแแแ แแแแแแแแแ แแแ แฎแจแแ แแ แฅแแแแแ แจแแแ แแแฅแแแแแแก แขแแกแขแแ แแแแก แฃแแ แฃแแแแแกแแงแแคแแ. แแแแแแแแแ, แแแแแแแชแแแจแ แฅแแแแแ แกแแ แแแกแแก TCP แกแแ แแแ แก, แฃแแแแจแแ แแแแแแ แแแก แขแแกแขแแแ แแ แฃแแแแแแแแ แขแแฅแกแขแฃแ แแ แซแแแแแแแก: แ แแแ แแแแฌแแแแฃแแแ, แกแแ แแแแฆแแ แแแแแชแแแแแ แแ แ.แจ. แกแแแแแแ, แแแแ แแ แแ แ แฃแแแแแ แกแแแฃแ แ.
แแแกแแขแแแแก แฎแแแแแกแแฌแแแแแแแแก แซแแ แแแแแ แขแแฅแแแแแแแแแ
แซแแแแ แแแ แแ Win32 API
แงแแแแแแ Windows ะฟัะธะปะพะถะตะฝะธะน, ะฝะฐะฟะธัะฐะฝะฝัั ะดะพ ะฒัั ะพะดะฐ WPF ะธ ะทะฐัะตะผ Windows Store, ะฟะพัััะพะตะฝั ัะฐะบ ะธะปะธ ะธะฝะฐัะต ะฝะฐ Win32 API. ะ ะธะผะตะฝะฝะพ, MFC, WTL, C++ Builder, Delphi, VB6 โ ะฒัะต ััะธ ะธะฝััััะผะตะฝัั ะธัะฟะพะปัะทััั Win32 API. ะะฐะถะต Windows Forms โ ะฒ ะทะฝะฐัะธัะตะปัะฝะพะน ััะตะฟะตะฝะธ Win32 API ัะพะฒะผะตััะธะผัะต.
แแแกแขแ แฃแแแแขแแแ: (แแกแแแแกแ VB) แแ Python wrapper , (แกแแแฃแแแ แ แแแ, แแ แแก IDispatch COM แแแขแแ แคแแแกแ), (แแแแแแ) (แ แฃแแ) (แ แฃแแ).
Microsoft UI แแแขแแแแขแแแแชแแ
ะะปะฐะฒะฝัะน ะฟะปัั: ัะตั ะฝะพะปะพะณะธั MS UI Automation ะฟะพะดะดะตัะถะธะฒะฐะตั ะฟะพะดะฐะฒะปัััะตะต ะฑะพะปััะธะฝััะฒะพ GUI ะฟัะธะปะพะถะตะฝะธะน ะฝะฐ Windows ะทะฐ ัะตะดะบะธะผะธ ะธัะบะปััะตะฝะธัะผะธ. ะัะพะฑะปะตะผะฐ: ะพะฝะฐ ะฝะต ัะธะปัะฝะพ ะปะตะณัะต ะฒ ะธะทััะตะฝะธะธ, ัะตะผ Win32 API. ะะฝะฐัะต ะฝะธะบัะพ ะฑั ะฝะต ะดะตะปะฐะป ะพะฑะตััะพะบ ะฝะฐะด ะฝะตะน.
แกแแแแแแแแแแจแ, แแก แแ แแก แแแ แกแแแแแฃแ แ COM แแแขแแ แคแแแกแแแแก แแแแ แแแ (แซแแ แแแแแแ UIAutomationCore.dll), แแ แแกแแแ แแฅแแก .NET wrapper แคแแ แแแจแ namespace System.Windows.Automation. แกแฎแแแแ แจแแ แแก, แแแก แแฅแแก แแแแแ แแแแ แจแแชแแแแ, แ แแก แแแแแช แแแแแแ แแ UI แแแแแแแขแ แจแแแซแแแแ แแแแแขแแแแ. แแแแขแแ, แฃแแฏแแแแกแแ แแแแแแงแแแแ UIAutomationCore.dll แแแ แแแแแ (แแฃ แแกแแแแแแ UiaComWrapper-แแก แจแแกแแฎแแ C#-แจแ, แแแจแแ แแก แแ แแก).
COM แแแขแแ แคแแแกแแก แขแแแแแ:
(1) แซแแ แแแแแ IUแชแแแแแแ - โแงแแแแแ แแแ แแขแแแแก แคแแกแแโ. แงแแแแแแ แแแแแแ แแแแ, แแ แแกแแแแก แแแกแแฎแแ แฎแแแแแ.
(2) IDispatch แแ แฌแแ แแแแแฃแแแแ (แแแ Excel.Application), แ แแแแแก แแแแแงแแแแแ แจแแกแแซแแแแแแแ Python-แจแ win32com.client แแแแแขแแก แแแแแงแแแแแแ (แแแงแแแแ pyWin32). แงแแแแแแ แแแกแแฎแแ แฎแแแแแ แแ แแแแแแ แแแ แแแแขแ.
(3) แแแ แแแแฃแแ แแแขแแ แคแแแกแแแ, แ แแแแแแแแแแช แจแแฃแซแแแ แแฃแจแแแแ แแแกแแแ แแฎแแ แแก Python-แแก แแแแแขแก .
แแแกแขแ แฃแแแแขแแแ: C#-แจแ, 0.6.0+, C#-แจแ, (แแแแ แฌแงแแ แแก แแแแ C แจแแคแฃแแแแแแกแแแแก UIAutomationCore.dll-แแ แแ แแ แแก แแแแแฆแแแแแแฃแแ), แ แฃแแแจแ.
AT-SPI
ะะตัะผะพััั ะฝะฐ ัะพ, ััะพ ะฟะพััะธ ะฒัะต ะพัะธ ัะตะผะตะนััะฒะฐ Linux ะฟะพัััะพะตะฝั ะฝะฐ X Window System (ะฒ Fedora 25 ยซะธะบััยป ะฟะพะผะตะฝัะปะธ ะฝะฐ Wayland), ยซะธะบััยป ะฟะพะทะฒะพะปััั ะพะฟะตัะธัะพะฒะฐัั ัะพะปัะบะพ ะพะบะฝะฐะผะธ ะฒะตัั ะฝะตะณะพ ััะพะฒะฝั ะธ ะผัััั/ะบะปะฐะฒะธะฐัััะพะน. ะะปั ะดะตัะฐะปัะฝะพะณะพ ัะฐะทะฑะพัะฐ ะฟะพ ะบะฝะพะฟะบะฐะผ, ะปะธัั ะฑะพะบัะฐะผ ะธ ัะฐะบ ะดะฐะปะตะต โ ัััะตััะฒัะตั ัะตั ะฝะพะปะพะณะธั AT-SPI. ะฃ ัะฐะผัั ะฟะพะฟัะปััะฝัั ะพะบะพะฝะฝัั ะผะตะฝะตะดะถะตัะพะฒ ะตััั ัะฐะบ ะฝะฐะทัะฒะฐะตะผัะน AT-SPI registry ะดะตะผะพะฝ, ะบะพัะพััะน ะธ ะพะฑะตัะฟะตัะธะฒะฐะตั ะดะปั ะฟัะธะปะพะถะตะฝะธะน ะฐะฒัะพะผะฐัะธะทะธััะตะผัะน GUI (ะบะฐะบ ะผะธะฝะธะผัะผ ะฟะพะดะดะตัะถะธะฒะฐัััั Qt ะธ GTK).
แแแกแขแ แฃแแแแขแแแ: .
pyatspi2, แฉแแแ แแแ แแ, แจแแแชแแแก แซแแแแแ แแแแ แแแแแแแแแแฃแแแแแก, แ แแแแ แแชแแ PyGObject. แแแแแ แขแแฅแแแแแแแ แฎแแแแแกแแฌแแแแแแ แ แแแแ แช แฉแแแฃแแแแ แแแ แแแแแแแฃแ แ แแแแแแแแแแ libatspi.so. แฒแฅ แแ แแก . ะะปั ะฑะธะฑะปะธะพัะตะบะธ pywinauto ะฟะปะฐะฝะธััะตะผ ัะตะฐะปะธะทะพะฒะฐัั ะฟะพะดะดะตัะถะบั AT-SPI ะธะผะตะตะฝะพ ัะฐะบ: ัะตัะตะท ะทะฐะณััะทะบั libatspi.so ะธ ะผะพะดัะปั ctypes. ะััั ะฝะตะฑะพะปััะฐั ะฟัะพะฑะปะตะผะฐ ัะพะปัะบะพ ะฒ ะธัะฟะพะปัะทะพะฒะฐะฝะธะธ ะฝัะถะฝะพะน ะฒะตััะธะธ, ะฒะตะดั ะดะปั GTK+ ะธ Qt ะฟัะธะปะพะถะตะฝะธะน ะพะฝะธ ะฝะตะผะฝะพะณะพ ัะฐะทะฝัะต. ะะตัะพััะฝัะน ะฒัะฟััะบ pywinauto 0.7.0 ั ะฟะพะปะฝะพัะตะฝะฝะพะน ะฟะพะดะดะตัะถะบะพะน Linux ะผะพะถะฝะพ ะพะถะธะดะฐัั ะฒ ะฟะตัะฒะพะน ะฟะพะปะพะฒะธะฝะต 2018-ะณะพ.
Apple Accessibility API
MacOS-แก แแฅแแก แกแแแฃแแแ แ แแแขแแแแขแแแแชแแแก แแแ, AppleScript. Python-แจแ แแกแแแแกแ แ แแแแก แแแแกแแฎแแ แชแแแแแแแแ, แ แ แแฅแแ แฃแแแ, แแฅแแแ แฃแแแ แแแแแแงแแแแ แคแฃแแฅแชแแแแ ObjectiveC-แแแ. แ แแแแ แช แฉแแแก, MacOS 10.6-แแ แแแฌแงแแแฃแแ, pyobjc แแแแแขแ แจแแแแก แฌแแแแกแฌแแ แแแแแกแขแแแแ แแแฃแ Python-แจแ. แแก แแกแแแ แแแแแแแแแแแก แแแแแแแแแแฃแแแแแแแก แฉแแแแแแแแก pywinauto-แจแ แแแแแแแแ แแฎแแ แแแญแแ แแกแแแแก.
แแแกแขแ แฃแแแแขแแแ: แแแ แแ Apple Script แแแแกแ, แฆแแ แก แงแฃแ แแแฆแแแแก แแแฅแชแแแ , แแแแแ แแแแขแแแ. แแก แแ แแก LDTP-แแแ แแแแกแแแแแ แแแขแแ แคแแแกแ, แแแแ แแ แแกแแแ แแ แแก แแแแแฃแแแแแแแแ แแแแแแแแแแ. แฒแแก แแฅแแก แฉแแแ แกแขแฃแแแแขแแก แแแแ แแแฌแแ แแแ. แชแแแแแแแ แแ แแแแแแ: แแแฅแแแแ แแแแแแ แแ แแฃแจแแแแก (แแแแแแแแ waitFor*). แแแแ แแ แแแแแแแแแแจแ แชแฃแแ แแ แแ แแก.
แ แแแแ แแแแแฌแงแแ pywinauto
แแแ แแแแ แแแแแฏแ แแ แแก แจแแแแ แแฆแแแ GUI แแแแแฅแขแแก แแแกแแแฅแขแแ แแ (แ แแกแแช แฐแฅแแแ Spy tool). แแก แแแแแฎแแแ แแแแ แจแแแกแฌแแแแแ แแแแแแแชแแ แจแแแแแแแ: แ แแแแ แแ แแก แกแขแ แฃแฅแขแฃแ แแ แแแฃแแ แแแแแแแขแแแแก แแแ แแ แฅแแ, แ แ แแแแกแแแแแแ แฎแแแแแกแแฌแแแแแ. แกแแแขแแก แงแแแแแแ แชแแแแแแ แแแกแแแฅแขแแ แแแ:
- Spy++ - แจแแแแก Visual Studio-แจแ, Express แแ Community Edition-แแก แฉแแแแแแ. แแงแแแแแก Win32 API-แก. แชแแแแแแแ แแแกแ แแแแแแช AutoIt แคแแแฏแ แแก แแแคแแ แแแชแแ.
- Inspect.exe โ ะฒั
ะพะดะธั ะฒ Windows SDK. ะัะปะธ ะพะฝ ั ะฒะฐั ัััะฐะฝะพะฒะปะตะฝ, ัะพ ะฝะฐ 64-ะฑะธัะฝะพะน Windows ะผะพะถะฝะพ ะฝะฐะนัะธ ะตะณะพ ะฒ ะฟะฐะฟะบะต
C:Program Files (x86)Windows Kits<winver>binx64. แแแแแ แแแกแแแฅแขแแ แจแ แแฅแแแ แฃแแแ แแแ แฉแแแ แ แแแแแ UI แแแขแแแแขแแแแชแแ MS AA-แแก แแแชแแแแ (Active Accessibility, UI Automation-แแก แฌแแแแแแ แ).
แแแแแชแฎแแแแก แแแแแแแแแ แแแแก แจแแแแแ, แฉแแแ แแแ แฉแแแ แแแฅแแแแก, แ แแแแแกแแช แแแแแแแงแแแแแ. Application แแแแแฅแขแแก แจแแฅแแแแกแแก แกแแแแแ แแกแแ backend-แแก แกแแฎแแแแก แแแแแแแแ.
- backend=โwin32โณ - แแแแฃแแแกแฎแแแแแ แแแแแงแแแแแแกแแก, แแแ แแแ แแฃแจแแแแก MFC, WTL, VB6 แแ แกแฎแแ แซแแแแ แแแแแแแชแแแแแ.
- backend=โuiaโ โ ะฝะพะฒัะน ะฑัะบะตะฝะด ะดะปั MS UI Automation: ะธะดะตะฐะปัะฝะพ ัะฐะฑะพัะฐะตั ั WPF ะธ WinForms; ัะฐะบะถะต ั
ะพัะพั ะดะปั Delphi ะธ Windows Store ะฟัะธะปะพะถะตะฝะธะน; ัะฐะฑะพัะฐะตั ั Qt5 ะธ ะฝะตะบะพัะพััะผะธ Java ะฟัะธะปะพะถะตะฝะธัะผะธ. ะ ะฒะพะพะฑัะต, ะตัะปะธ Inspect.exe ะฒะธะดะธั ัะปะตะผะตะฝัั ะธ ะธั
ัะฒะพะนััะฒะฐ, ะทะฝะฐัะธั ััะพั ะฑัะบะตะฝะด ะฟะพะดั
ะพะดะธั. ะ ะฟัะธะฝัะธะฟะต, ะฑะพะปััะธะฝััะฒะพ ะฑัะฐัะทะตัะพะฒ ัะพะถะต ะฟะพะดะดะตัะถะธะฒะฐะตั UI Automation (Mozilla ะฟะพ ัะผะพะปัะฐะฝะธั, ะฐ ะฅัะพะผั ะฟัะธ ะทะฐะฟััะบะต ะฝัะถะฝะพ ัะบะพัะผะธัั ะบะปัั ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ
--force-renderer-accessibilityแแแแแแแขแแแแก แกแแแแฎแแแแ แแแแ แแแแแ Inspect.exe). แ แ แแฅแแ แฃแแแ, แกแแแแแแแ แแแแแฃแ แแแชแแ แแ แกแคแแ แแจแ แซแแแแแ แจแแกแแซแแแแแแแ. แแ แแฃแแแ แแแ แแฃแจแแแแแก แแแแแ แแ แแ แแแ (แจแแแซแแแแ แกแแกแแ แแแแแ แแงแแก แฏแแแ แแแแแ แแ แแแฃแฅแขแแก แกแชแแแแ แแกแแแแก).
แจแแกแแแแก แแฃแแฅแขแแแ แแแขแแแแขแแแแชแแแกแแแแก
แแแแแแแชแแ แคแแ แแแ แแฅแแ แแแแแแแแแฃแแ. แแ แแ แจแแฅแแแแ Application แแแแแฅแขแ แแ แแแฃแจแแแ แแแ แแ แแแแแแแ แแ แฃแแแ แแแจแแแแฃแแก. แแก แแ แแ แแก แแฎแแแแ แกแขแแแแแ แขแฃแแ แแแแกแแก แแแแแ 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. แงแแแแแคแแ แ แแแแแ แฉแแแ แแแแญแแแ แแแแแ แฎแแแแแ โแกแแแชแแคแแแแชแแ->แจแแคแฃแแแโ แแแแชแแคแชแแแจแ, แ แแแแแแช แแแแแแแแแแแ แแฅแแแแ แแแแฎแแแฃแแ.
แคแแแฏแ แแก/แแแแแแแขแแก แกแแแชแแคแแแแชแแแแ
แแก แแ แแก แซแแ แแแแแ แแแแชแแคแชแแ, แ แแแแแแแแแช แแแแแฃแแแ pywinauto แแแขแแ แคแแแกแ. แแฅแแแ แจแแแแซแแแแ แแฆแฌแแ แแ แคแแแฏแแ แ/แแแแแแแขแ แฃแฎแแจแแ แแ แฃแคแ แ แแแขแแแฃแ แแ, แแแจแแแแช แแ, แแฃ แแก แฏแแ แแ แแ แกแแแแแก แแ แฃแแแ แแแฎแฃแ แฃแแแ. แคแแแฏแ แแก แกแแแชแแคแแแแชแแ (แแแแแฅแขแ แคแแแฏแ แแก แกแแแชแแคแแแแชแแ) แแแแฎแแแก แแ แแขแแ แแฃแแแแก, แ แแแแแแแช แฃแแแ แแแซแแแแแ แ แแแแฃแ แ แคแแแฏแแ แ แแ แแแแแแแขแ.
แคแแแฏแ แแก แแแขแแแฃแ แ แกแแแชแแคแแแแชแแแก แแแแแแแแ:
>>> 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_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')แงแแแแ แจแแกแแซแแ แแ แแขแแ แแฃแแแก แกแแ แแแชแแแฃแแแ แคแฃแแฅแชแแแก แแแแฃแแแแขแแแจแ .
แแขแ แแแฃแขแแกแ แแ แแแกแแฆแแแแ แฌแแแแแแก แแแแแ
แแแแแแ แแแแแแแแแก แคแแแฏแ แแก แกแแแชแแคแแแแชแแแแแก แจแแฅแแแแก แแ แแแแแฅแขแแก แแขแ แแแฃแขแแแแก แแแแแแแฃแ แแ แแแแชแแแแแก (แจแแแแแแแแ, แแแแแแ แฃแแฃแแแแแแงแแคแแแแ __getattribute__). แ แ แแฅแแ แฃแแแ, แแแแแ แจแแแฆแฃแแแแแแ แแแฌแแกแแแฃแแ แแขแ แแแฃแขแแก แกแแฎแแแแ, แ แแช แแแแแกแแแแ แ แชแแแแแแก แกแแฎแแแแ (แแแ แฉแแกแแแ แแแขแแ แแแแ, แแซแแแแแแ แแ แกแฎแแ แกแแแชแแแแฃแ แ แกแแแแแแแแแ). แกแแแแแแแแ แแ, pywinauto แแงแแแแแก แแแ แแ แฌแแแแแฃแ โแกแแฃแแแแแกแ แจแแกแแขแงแแแกโ แกแแซแแแแ แแแแแ แแแแก, แ แแแแแแช แแแแ แแแแ แแแญแแแแแ แจแแชแแแแแแแกแ แแ แแชแแ แ แแแ แแแชแแแแแก แแแแแ แ.
app.UntitledNotepad
# ัะพ ะถะต ัะฐะผะพะต, ััะพ
app.window(best_match='UntitledNotepad')แแฃ แฏแแ แแแแแ แแญแแ แแแแแ แฃแแแแแแแก แกแขแ แแฅแแแแแ (แแแแแแแแแ, แ แฃแกแฃแแ แแแแกแแแแก), แแแขแแ แแแแ แแ แ.แจ., แจแแแแซแแแแ แจแแฎแแแแแ แฆแแแแแแ (แแแแฅแแก แแก แฉแแแฃแแแแ แแแ แแแฅแกแแแแแ แแงแแก):
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 แแแแแแแก แแแแแขแแแแ ). แแกแแแ แแ แกแแแแแก MS Paint แแแขแแแแขแแแแชแแแก แแแแแแแแ แแแกแ Ribbon แแแกแขแ แฃแแแแขแแ แแแแแแแ.
แแแแแ แแ แแ แจแแกแแแแจแแแแ แแแแแแแแ แแแฌแแ แแแ แฉแแแ แกแขแฃแแแแขแแก แแแแ : (แแก แแแแแแ แแแแแแ แกแแชแแแจแ แชแแขแ แแแแแแแแแแแ).
แแ, แ แ แแฅแแ แฃแแแ, แแแแแแแขแฃแ แแก (แชแฎแแแ แแแแแแจแแแแก) แแ แแแฃแกแแก แฆแแแแกแซแแแแแแแ แแแแแฌแแ แแก แแแแแแแแ:
.
แแแแแแแ
แแแแกแแแฃแแ แแแฃแแ แแแแแแแ แแแ, แแแแช แแฃแแแแแแ แแฎแแแ แแแ แแ แแแฅแขแแก แแแแแแแแ แแแแก. แฉแแแแแแก แแ แแก แแฃแแแแแ แฐแแแแ. แฉแแแแ แแ แแ แกแขแฃแแแแขแแ UNN-แแแ แแฎแแแฎแแ แแแแชแแ แแแแแแแแ แแก แฎแแ แแกแฎแ แแ แแแแแแ. แแแแ แฌแแแแแ แจแแแขแแแ MS UI Automation-แแก แแฎแแ แแแญแแ แแจแ แแ แแฎแแแฎแแ แแแแฌแงแ แแแขแแแแขแฃแ แ แแแแแก แแแแแ แแขแแ แแก แจแแฅแแแ, แ แแแแแแช แแแคแฃแซแแแแฃแแแ "แฉแแแแฌแแ แแก แแแแแ แแก" แแ แแแชแแแแ แแแคแฃแซแแแแฃแแ แขแแฅแกแขแแก แแแแกแแแแแแ (แแก แแ แแก แงแแแแแแ แ แแฃแแ แคแฃแแฅแชแแ), แฏแแ แฏแแ แแแแ แแฎแแแแ "uia" backend-แแกแแแแก. ัะฐะทัะฐะฑะฐััะฒะฐะตั ะฝะพะฒัะน ะฑัะบะตะฝะด ะฟะพะด Linux ะฝะฐ ะพัะฝะพะฒะต AT-SPI (ะผะพะดัะปะธ mouse ะธ keyboard แแแคแฃแซแแแแฃแแ - แฃแแแ แแแแแจแแแแแแจแ 0.6.x).
แแแก แจแแแแแ, แ แแช แแ แกแแแแแแ แแแแ แฎแแแแ แแแกแฌแแแแ แแแแแแจแ แแแขแแแแขแแแแชแแแก แกแแแชแแแแฃแ แแฃแ แกแก, แแแแแแ แแ แแแแแกแขแ แแก แกแขแฃแแแแขแ แแแแแแแก แกแแจแแแแ แแแแแแแแแก, แแฎแแ แชแแแแแแก แแชแแ แ แคแฃแแฅแชแแแแก แแ แแแขแแแแขแแแแชแแแก แแแแแแแแแแก. แแแแแแ แแ แซแแ แแแแแ แ แแ แแแแแแแก แแขแแแแ แแกแแแ แแ แแฎแแ แแฆแแแแฉแแแแก แกแขแฃแแแแขแแแแก แแแแ . แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแแแฏแแ แแแแชแ แแ แฃแแแ แแแแแขแ แแแแ แแแแแก แฎแแ แแกแฎแ. แกแขแแขแแแฃแ แ แแแแแแแแขแแ แแแ (QuantifiedCode, Codacy แแ Landscape) แแ แแแขแแแแขแฃแ แ แขแแกแขแแแ แฆแ แฃแแแแจแ (AppVeyor แกแแ แแแกแ) แแแแแก แแแแฎแแแแแแ 95% แแแคแแ แแแ แแแแ แก แแฎแแแ แแแ แแแแจแ.
แแกแแแ แแแแแแแ แงแแแแแก, แแแแช แขแแแแแก แแแแแฎแแแแแแก, แแฉแแแก แจแแชแแแแแแก แแ แแแแแแแแก แแแแฎแแแแแแก!
แฒแแแแขแแแแแ แ แแกแฃแ แกแแแ
แฉแแแ แแแแงแแแแแ แแแแฎแแแแก (แชแแขแ แฎแแแก แฌแแ แแแแแฉแแแ ) แแ . แแ แกแแแแแก .
แแแแฎแแแแ แงแแแแแแแแฃแ แแ . GitHub-แแ แแแ แกแแแแแแแแแก แ แแแแแแแแแก แแแแแกแแแ แแกแแ, แแฎแแแแ Autohotkey (แแแ แแฅแแ แซแแแแแ แแแแ แกแแแแแแแแแแ แแ แแแแ แแกแขแแ แแ) แแ PyAutoGUI แฃแคแ แ แกแฌแ แแคแแ แแแ แแแแ (แซแแ แแแแแแ แแแกแ แแแขแแ แแก แแ แกแแแแแแ แขแแก แฌแแแแแแแก แแแแฃแแแ แแแแก แแแแ: โAutomate the Boring Stuff with แแแแแแโ แแ แกแฎแแ).
แฌแงแแ แ: www.habr.com
