ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Python β ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° Π½Π°ΡΡΠΎΠ»Π½ΠΈ GUI ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Windows. ΠΡΠ΅Π· ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈΡ Π° Π½ΠΎΠ²ΠΈ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° MS UI Automation. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡΡ ΠΎΡΡΠ°Π²Π° ΡΡΡΠΈΡΡ, ΠΈ ΡΠ΅Π³Π° ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ: WinForms, WPF, Qt5, Windows Store (UWP) ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ β ΠΏΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π² Windows.
- Π‘ΠΈΡΡΠ΅ΠΌΠ° Π·Π° Π±Π΅ΠΊΠ΅Π½Π΄ΠΈ/ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ (Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ° Π΄Π²Π°: ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅
"win32"ΠΈ Π½ΠΎΠ²ΠΈΡ"uia"). ΠΠ»Π°Π²Π½ΠΎ ΡΠ΅ Π½Π°ΡΠΎΡΠ²Π°ΠΌΠ΅ ΠΊΡΠΌ ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½ΠΎΡΡ. - Win32 Ρ ΡΠΊΠΎΠ²Π΅ Π·Π° ΠΌΠΈΡΠΊΠ° ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ° (Π³ΠΎΡΠ΅ΡΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ Π² Π΄ΡΡ Π° Π½Π° pyHook).
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΊΡΠ°ΡΡΠΊ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΎΠΏΡΠΈΠΈΡΠ΅ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π·Π° Π½Π°ΡΡΠΎΠΉΡΠΈΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ (Π±Π΅Π· ΠΏΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅).
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ Π΅ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΡΡΠ»ΠΊΡΠ²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΊΠ»Π°Π΄ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΡΡΠ° SQA Days 20 Π² ΠΠΈΠ½ΡΠΊ ( ΠΈ ), ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π±ΡΠ»Π³Π°ΡΡΠΊΠ° Π²Π΅ΡΡΠΈΡ Π·Π° pywinauto.
- ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈ
- ΠΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° Π½Π°ΡΡΠΎΠ»Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΊΡΠ°ΡΡΠΊ ΠΏΡΠ΅Π³Π»Π΅Π΄ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π² ΡΠ°Π·ΠΈ ΠΎΠ±Π»Π°ΡΡ. ΠΠ° Π½Π°ΡΡΠΎΠ»Π½ΠΈ GUI ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π·Π° ΡΠ΅Π±, ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ° Selenium. ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈ:
ΠΠ΅ΡΠΎΠ΄ Π½Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΡΠ΅
Π₯Π°ΡΠ΄ΠΊΠΎΠ΄ΠΈΠΌ ΡΠΎΡΠΊΠΈ Π½Π° ΠΊΠ»ΠΈΠΊΠ²Π°Π½Π΅, ΡΠ΅ Π½Π°Π΄ΡΠ²Π°ΠΌΠ΅ Π½Π° ΡΡΠΏΠ΅Ρ
.
[+] ΠΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½, Π»Π΅ΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ.
[+] ΠΠ΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ "record-replay" Π·Π°ΠΏΠΈΡ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅.
[-] ΠΠ°ΠΉ-Π½Π΅ΡΡΠ°Π±ΠΈΠ»Π΅Π½ ΠΊΡΠΌ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠ΅Π·ΠΎΠ»ΡΡΠΈΡΡΠ° Π½Π° Π΅ΠΊrana, ΡΠ΅ΠΌΠΈ, ΡΡΠΈΡΡΠΎΠ²Π΅, ΡΠ°Π·ΠΌΠ΅ΡΠΈ Π½Π° ΠΏΡΠΎΠ·ΠΎΡΡΠΈ ΠΈ Ρ.Π½.
[-] ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈ ΡΠ° ΠΎΠ³ΡΠΎΠΌΠ½ΠΈ ΡΡΠΈΠ»ΠΈΡ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°, ΡΠ΅ΡΡΠΎ Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π½ΡΠ»Π°ΡΠ° ΠΈΠ»ΠΈ Π΄Π° ΡΠ΅ ΡΠ΅ΡΡΠ²Π°Ρ ΡΡΡΠ½ΠΎ.
[-] ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ° ΡΠ°ΠΌΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π·Π° Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈΠΌΠ° Π΄ΡΡΠ³ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ (ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½ΠΈ): , , ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ (Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½ΠΈ).
Π‘ΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ΅ ΠΊΠ°ΠΆΠ΅, ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΡΡ Π½Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΠΏΡΠ»Π²Π° ΠΎΡΡΠ°Π½Π°Π»ΠΈΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° Π³ΡΠ°ΡΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΡΠ΅ Π½Π° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈ (ΠΎΡ Π»Π΅Π²ΠΈΡ Π³ΠΎΡΠ΅Π½ ΡΠ³ΡΠ» Π½Π° ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ°/Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, Π° Π½Π΅ Π½Π° ΡΠ΅Π»ΠΈΡ Π΅ΠΊΡΠ°Π½) β ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π°ΠΊΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΏΡΠ΅Π΄Π²ΠΈΠ΄ Π΄ΡΠ»ΠΆΠΈΠ½Π°ΡΠ°/ΡΠΈΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ΅Π»ΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ (ΡΠΎΠ³Π°Π²Π° ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½Π°ΡΠ° ΡΠ΅Π·ΠΎΠ»ΡΡΠΈΡ Π½Π° Π΅ΠΊΡΠ°Π½Π° Π½Π΅ Π±ΠΈ ΠΏΠΎΠΏΡΠ΅ΡΠΈΠ»Π°).
ΠΡΡΠ³ Π²Π°ΡΠΈΠ°Π½Ρ: Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅ΡΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Π·Π° ΡΠ΅ΡΡΠΎΠ²Π΅ ΡΡΡ ΡΡΠ°Π±ΠΈΠ»Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ (Π½Π΅ ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½, Π½ΠΎ Π² Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΡΠ°Π²Π°).
Π Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
[+] ΠΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½
[+-] ΠΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ (ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΎΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄), Π½ΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΠΈΠ·ΠΈΡΠΊΠ²Π° Ρ
ΠΈΡΡΠΎΡΡΠΈ.
[-+] ΠΡΠ½ΠΎΡΠΈΡΠ΅Π»Π½ΠΎ Π±Π°Π²Π΅Π½, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° CPU Π·Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ Π·Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅.
[-] ΠΠ° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡ (OCR), ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½ΡΠΌΠ° Π³ΠΎΠ²ΠΎΡ => Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ. ΠΠΎΠΊΠΎΠ»ΠΊΠΎΡΠΎ ΠΌΠΈ Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ OCR ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠ° ΠΎΡΠΎΠ±Π΅Π½ΠΎ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ Π·Π° ΡΠΎΠ·ΠΈ ΡΠΈΠΏ Π·Π°Π΄Π°ΡΠΈ ΠΈ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠΈΡΠΎΠΊΠΎ (Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΈ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅, Π°ΠΊΠΎ ΡΠΎΠ²Π° Π²Π΅ΡΠ΅ Π½Π΅ Π΅ ΡΠ°ΠΊΠ°).
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: , (ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Sikuli, Π½Π° ΡΠΈΡΡ Python), .
Π’Π΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ
[+] ΠΠ°ΠΉ-Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΡΡΠ΅Π½Π΅ ΠΏΠΎ ΡΠ΅ΠΊΡΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΅ Π½Π°ΡΠΈΡΡΠ²Π°Π½ ΠΎΡ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΈΠ»ΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°.
[+] ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ => ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π²Π΅ΡΠΈΡΠΈΡΠΈΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅.
[+] ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ Π½Π°ΠΉ-Π±ΡΡΠ·ΠΈΡΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎΡΡΠΈ Π½Π΅ ΠΈΠ·ΡΠ°Π·Ρ
ΠΎΠ΄Π²Π° ΡΠ΅ΡΡΡΡΠΈ Π½Π° CPU.
[-] Π’ΡΡΠ΄Π½ΠΎ Π΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ: Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π²ΡΠΈΡΠΊΠΈ open-source Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ Π΅Π΄Π½Π°-Π΄Π²Π΅ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ. Windows/Linux/MacOS Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΎΡ Π½ΠΈΠΊΠΎΠ³ΠΎ, ΠΎΡΠ²Π΅Π½ ΠΎΡ ΠΏΠ»Π°ΡΠ΅Π½ΠΈ ΠΊΠ°ΡΠΎ TestComplete, UFT ΠΈΠ»ΠΈ Squish.
[-] ΠΠ΅ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ°ΠΊΠ°Π²Π° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π΅ Π½Π°Π»ΠΈΡΠ½Π° ΠΈΠ·ΠΎΠ±ΡΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°ΡΠΈΡ Π΅ΠΊΡΠ°Π½ Π²ΡΡΡΠ΅ Π² VirtualBox β ΡΡΠΊ Π±Π΅Π· ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΌΠΈΠ½Π΅. ΠΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ»ΡΡΠ°ΠΈ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ Π·Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ. Π ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠ°ΡΡ ΡΠ΅ ΡΡΠ°Π½Π΅ Π²ΡΠΏΡΠΎΡ Π·Π° Π½Π΅Π³ΠΎ.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: Π½Π° C#, Π½Π° C# (ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ ΡΡΡ Selenium), Π½Π° C# (ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Appium), , (ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ LDTP), , Π½Π° Ruby, (Linux Desktop Testing Project) ΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° Windows Π²Π΅ΡΡΠΈΡ .
LDTP β Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½ open-source ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ (ΠΏΠΎ-ΡΠΊΠΎΡΠΎ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΠΎΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ) Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΡΠΎΠΉ Π½Π΅ Π΅ ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½. ΠΠ· ΡΠ°ΠΌΠΈΡΡ Π½Π΅ ΡΡΠΌ Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π», Π½ΠΎ ΠΏΠΎ ΠΎΡΠ·ΠΈΠ²ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡΡ ΠΌΡ Π½Π΅ Π΅ Π½Π°ΠΉ-ΡΠ΄ΠΎΠ±Π½ΠΈΡΡ. ΠΠΊΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ·ΠΈΡΠΈΠ²Π½ΠΈ ΠΎΡΠ·ΠΈΠ²ΠΈ, ΠΌΠΎΠ»Ρ, ΡΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
Π’Π΅ΡΡΠΎΠ² backdoor (Π°.ΠΊ.Π°. Π²ΡΡΡΠ΅ΡΠ΅Π½ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄)
ΠΠ° ΠΊΡΠΎΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ ΡΠ΅ΡΡΠΎ ΡΡΠ·Π΄Π°Π²Π°Ρ Π²ΡΡΡΠ΅ΡΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° testability. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ·Π΄Π°Π²Π°Ρ ΡΠ»ΡΠΆΠ΅Π±Π΅Π½ TCP ΡΡΡΠ²ΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ ΠΊΡΠΌ Π½Π΅Π³ΠΎ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ: ΠΊΠ°ΠΊΠ²ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠΈΡΠ½Π΅, ΠΎΡΠΊΡΠ΄Π΅ Π΄Π° ΡΠ΅ Π²Π·Π΅ΠΌΠ°Ρ Π΄Π°Π½Π½ΠΈ ΠΈ Ρ.Π½. ΠΠ°Π΄Π΅ΠΆΠ΄Π½ΠΎ, Π½ΠΎ Π½Π΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π½ΠΎ.
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° Π½Π°ΡΡΠΎΠ»Π½Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡ
Π‘ΡΠ°ΡΠΈΡΡ Π΄ΠΎΠ±ΡΡ Win32 API
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ Windows ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ ΠΏΡΠ΅Π΄ΠΈ WPF ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Windows Store, ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π½Π°ΡΠΈΠ½ Π½Π° Win32 API. Π ΠΈΠΌΠ΅Π½Π½ΠΎ, MFC, WTL, C++ Builder, Delphi, VB6 β Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Win32 API. ΠΠΎΡΠΈ Windows Forms β Π² Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΡΡΠ΅ΠΏΠ΅Π½ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΈ Ρ Win32 API.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: (ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° VB) ΠΈ Python ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° , (ΡΠΎΠ±ΡΡΠ²Π΅Π½ Π΅Π·ΠΈΠΊ, ΠΈΠΌΠ° IDispatch COM ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ), (Python), (Ruby), (Ruby).
Microsoft UI Automation
ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ: ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° MS UI Automation ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΡΠΎ ΠΌΠ½ΠΎΠ·ΠΈΠ½ΡΡΠ²ΠΎ ΠΎΡ GUI ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Windows Ρ ΡΠ΅Π΄ΠΊΠΈ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ: ΡΡ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π»Π΅ΡΠ½Π° Π·Π° ΠΈΠ·ΡΡΠ°Π²Π°Π½Π΅ ΠΎΡ Win32 API. Π ΠΏΡΠΎΡΠΈΠ²Π΅Π½ ΡΠ»ΡΡΠ°ΠΉ Π½ΠΈΠΊΠΎΠΉ Π½ΡΠΌΠ°ΡΠ΅ Π΄Π° ΠΏΡΠ°Π²ΠΈ ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π½Π°Π΄ Π½Π΅Ρ.
ΠΡΡΡΠ½ΠΎΡΡ, ΡΠΎΠ²Π° Π΅ Π½Π°Π±ΠΎΡ ΠΎΡ custom COM ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ (ΠΏΡΠ΅Π΄ΠΈΠΌΠ½ΠΎ, UIAutomationCore.dll), Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈΠΌΠ° .NET ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° namespace System.Windows.Automation. ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, ΡΡ ΠΈΠΌΠ° Π²Π½Π΅ΡΠ΅Π½ Π±ΡΠ³, ΠΏΠΎΡΠ°Π΄ΠΈ ΠΊΠΎΠΉΡΠΎ Π½ΡΠΊΠΎΠΈ UI Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΠΏΡΡΠ½Π°ΡΠΈ. ΠΠ°ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° UIAutomationCore.dll Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ (Π°ΠΊΠΎ ΡΡΠ΅ ΡΡΠ²Π°Π»ΠΈ Π·Π° UiaComWrapper Π½Π° C#, ΡΠΎΠ²Π° Π΅ ΡΠΎ).
ΠΠΈΠ΄ΠΎΠ²Π΅ COM ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ:
(1) ΠΡΠ½ΠΎΠ²Π΅Π½ IUknown β βΠΊΠΎΡΠ΅Π½ΡΡ Π½Π° Π·Π»ΠΎΡΠΎβ. ΠΠ°ΠΉ-Π½ΠΈΡΠΊΠΎΡΠΎ Π½ΠΈΠ²ΠΎ, Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ user-friendly.
(2) IDispatch ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Excel.Application), ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² Python Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ° win32com.client (Π²ΠΊΠ»ΡΡΠ΅Π½ Π² pyWin32). ΠΠ°ΠΉ-ΡΠ΄ΠΎΠ±Π½ΠΈΡΡ ΠΈ ΠΊΡΠ°ΡΠΈΠ² Π²Π°ΡΠΈΠ°Π½Ρ.
(3) Custom ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ, Ρ ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π²ΡΠ½ΡΠ΅Π½ Python ΠΏΠ°ΠΊΠ΅Ρ .
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: Π½Π° C#, 0.6.0+, Π½Π° C#, (ΡΡΡ Π½ΠΈΡΡ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π½Π° C ΠΎΠ±Π²ΠΈΠ²ΠΊΠΈ Π½Π°Π΄ UIAutomationCore.dll Π½Π΅ Π΅ ΡΠ°Π·ΠΊΡΠΈΡ), Π½Π° Ruby.
AT-SPI
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠΈ ΠΎΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎΡΠΎ Π½Π° Linux ΡΠ° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈ Π²ΡΡΡ Ρ X Window System (Π² Fedora 25 βΠΈΠΊΡΠΈΡΠ΅β Π±ΡΡ Π° Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΈ Ρ Wayland), βΠΈΠΊΡΠΈΡΠ΅β ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ ΡΠ°Π±ΠΎΡΠ° ΡΠ°ΠΌΠΎ Ρ ΠΏΡΠΎΠ·ΠΎΡΡΠΈ Π½Π° Π²ΡΡΡ ΠΎΠ²ΠΎ Π½ΠΈΠ²ΠΎ ΠΈ ΠΌΠΈΡΠΊΠ°/ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°. ΠΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π΅Π½ Π°Π½Π°Π»ΠΈΠ· ΠΏΠΎ Π±ΡΡΠΎΠ½ΠΈ, ΡΠΏΠΈΡΡΡΠ½ΠΈ ΠΊΡΡΠΈΠΈ ΠΈ Ρ.Π½. β ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ AT-SPI. ΠΠ°ΠΉ-ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ½ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠΈ ΠΈΠΌΠ°Ρ ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡ AT-SPI ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² Π΄Π΅ΠΌΠΎΠ½, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΠΌ 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, Π² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Python ΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π° ΠΏΠ°ΠΊΠ΅ΡΡΡ pyobjc. Π’ΠΎΠ²Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΎΠΏΡΠΎΡΡΠΈ ΡΠΏΠΈΡΡΠΊΠ° Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π·Π° Π±ΡΠ΄Π΅ΡΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π² pywinauto.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: ΠΡΠ²Π΅Π½ Π΅Π·ΠΈΠΊΠ° Apple Script, ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° , ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΎΡΠ΅ ΠΊΠ°ΡΠΎ pyatom. Π’ΠΎΠΉ Π΅ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌ ΠΏΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Ρ LDTP, Π½ΠΎ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°. ΠΠΌΠ° , Π½Π°ΠΏΠΈΡΠ°Π½ ΠΎΡ ΠΌΠΎΡ ΡΡΡΠ΄Π΅Π½Ρ. ΠΠΌΠ° ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΏΡΠΎΠ±Π»Π΅ΠΌ: Π½Π΅ ΡΠ°Π±ΠΎΡΡΡ Π³ΡΠ²ΠΊΠ°Π²ΠΈΡΠ΅ ΡΠ°ΠΉΠΌΠΈΠ½Π³ΠΈ (ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ waitFor*). ΠΠΎ, ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ, Π΅ Π½Π΅ΠΏΠ»ΠΎΡ
Π° ΡΠ°Π±ΠΎΡΠ°.
ΠΠ°ΠΊ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ° Ρ pywinauto
ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π΅ Π΄ΠΎΠ±ΡΠ΅ Π΄Π° ΡΠ΅ Π΅ΠΊΠΈΠΏΠΈΡΠ°ΡΠ΅ Ρ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡΠ° Π½Π° GUI ΠΎΠ±Π΅ΠΊΡΠΈ (ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π½Π°ΡΠΈΡΠ°Ρ Spy tool). Π’ΠΎΠΉ ΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡΠ²ΡΡΡΠ΅: ΠΊΠ°ΠΊ Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½Π° ΠΉΠ΅ΡΠ°ΡΡ ΠΈΡΡΠ° Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅, ΠΊΠ°ΠΊΠ²ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ° Π½Π°Π»ΠΈΡΠ½ΠΈ. ΠΠ°ΠΉ-ΠΈΠ·Π²Π΅ΡΡΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡΠΈ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ ΡΠ°:
- Spy++ β ΡΠ°ΡΡ ΠΎΡ Visual Studio, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Express ΠΈΠ»ΠΈ Community Edition. ΠΠ·ΠΏΠΎΠ»Π·Π²Π° Win32 API. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΊΠ»ΠΎΠ½ΡΡ ΠΌΡ AutoIt Window Info.
- Inspect.exe β ΡΠ°ΡΡ ΠΎΡ Windows SDK. ΠΠΊΠΎ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π° 64-Π±ΠΈΡΠΎΠ²Π° Windows Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ°
C:Program Files (x86)Windows Kits<winver>binx64. Π ΡΠ°ΠΌΠΈΡ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌ UI Automation Π²ΠΌΠ΅ΡΡΠΎ MS AA (Active Accessibility, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²Π΅Π½ΠΈΠΊ Π½Π° UI Automation).
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΈΠ·Π±ΠΈΡΠ°ΡΠ΅ Π±Π΅ΠΊΠ΅Π½Π΄Π°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅. ΠΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΅ Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ Application.
- backend=Β»win32β³ β Π²ΡΠ΅ ΠΎΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π΄ΠΎΠ±ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Ρ MFC, WTL, VB6 ΠΈ Π΄ΡΡΠ³ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- backend=Β»uiaΒ» β Π½ΠΎΠ² Π±Π΅ΠΊΠ΅Π½Π΄ Π·Π° MS UI Automation: ΠΈΠ΄Π΅Π°Π»Π½ΠΎ ΡΠ°Π±ΠΎΡΠΈ Ρ WPF ΠΈ WinForms; ΡΡΡΠΎ Π΅ Π΄ΠΎΠ±ΡΡ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Delphi ΠΈ Windows Store; ΡΠ°Π±ΠΎΡΠΈ Ρ Qt5 ΠΈ Π½ΡΠΊΠΎΠΈ Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ, Π°ΠΊΠΎ Inspect.exe Π²ΠΈΠΆΠ΄Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ ΠΈ ΡΠ΅Ρ
Π½ΠΈΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, Π·Π½Π°ΡΠΈ ΡΠΎΠ·ΠΈ Π±Π΅ΠΊΠ΅Π½Π΄ Π΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡ. ΠΡΡΡΠ½ΠΎΡΡ, ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π±ΡΠ°ΡΠ·ΡΡΠΈ ΡΡΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ UI Automation (Mozilla ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π° Π·Π° Chrome ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΠΌΡ ΠΏΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ ΠΊΠ»ΡΡ
--force-renderer-accessibility, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠΈΡΠ΅ Π² Inspect.exe). Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠΈΡΡΠ° Ρ Selenium Π² ΡΠ°Π·ΠΈ ΠΎΠ±Π»Π°ΡΡ Π΅Π΄Π²Π° Π»ΠΈ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½Π°. ΠΡΠΎΡΡΠΎ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π±ΡΠ°ΡΠ·ΡΡ (ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π·Π° ΠΊΡΠΎΡ-ΠΏΡΠΎΠ΄ΡΠΊΡΠΎΠ²ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΈ).
Π’ΠΎΡΠΊΠΈ Π·Π° Π²Ρ ΠΎΠ΄ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ΅Π½ΠΎ. ΠΡΠ΅ΠΌΠ΅ Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΎΠ±Π΅ΠΊΡ 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')ΠΠΊΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠ»Π°ΡΡΡ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π Π°Π±ΠΎΡΠ΅Π½ ΠΏΠ»ΠΎΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΠΊΠ°Π»ΠΊΡΠ»Π°ΡΠΎΡΠ° Π½Π° Win10 ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΡΡΠ° Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ Π΅ ΡΠ°Π·ΠΏΡΠ½Π°ΡΠ° ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΠ° (Π½Π΅ ΡΠ°ΠΌΠΎ calc.exe). Π’Π°ΠΊΠ° ΡΠ΅ Π±Π΅Π· ΠΎΠ±Π΅ΠΊΡ Π Π°Π±ΠΎΡΠ΅Π½ ΠΏΠ»ΠΎΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΌΠΈΠ½Π΅ΡΠ΅.
from subprocess import Popen
from pywinauto import Desktop
Popen('calc.exe', shell=True)
dlg = Desktop(backend="uia").Calculator
dlg.wait('visible')ΠΠΎΡΠ΅Π½ΠΎΠ²ΠΈΡΡ ΠΎΠ±Π΅ΠΊΡ (ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π Π°Π±ΠΎΡΠ΅Π½ ΠΏΠ»ΠΎΡ) Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΠΌΡΡΡΠΎ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΡΠ΅ Π±Π΅ΠΊΠ΅Π½Π΄Π°. ΠΡΠΈΡΠΊΠΎ ΠΎΡΡΠ°Π½Π°Π»ΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ ΡΠ΅ Π²ΠΏΠΈΡΠ²Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡΠ° "ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ->ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°", Π·Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΠ°Π½Π΅ Π²ΡΠΏΡΠΎΡ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ.
Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° ΠΏΡΠΎΠ·ΠΎΡΡΠΈ/Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ
Π’ΠΎΠ²Π° Π΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, Π½Π° ΠΊΠΎΡΡΠΎ ΡΠ΅ Π±Π°Π·ΠΈΡΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡΡ Π½Π° pywinauto. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ/Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, Π΄ΠΎΡΠΈ Π°ΠΊΠΎ ΡΠΎΠΉ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΈΠ»ΠΈ Π²Π΅ΡΠ΅ Π΅ Π·Π°ΡΠ²ΠΎΡΠ΅Π½. Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ° (ΠΎΠ±Π΅ΠΊΡ WindowSpecification) ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΠΊΡΠΈΡΠ΅ΡΠΈΠΈΡΠ΅, ΠΏΠΎ ΠΊΠΎΠΈΡΠΎ Π΄Π° ΡΠ΅ ΡΡΡΡΠΈ ΡΠ΅Π°Π»Π΅Π½ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ ΠΈΠ»ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π΄Π΅ΡΠ°ΠΉΠ»Π½Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π½Π° ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ°:
>>> dlg_spec = app.window(title='Untitled - Notepad')
>>> dlg_spec
>>> dlg_spec.wrapper_object()Π‘Π°ΠΌΠΎΡΠΎ ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠ΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° .wrapper_object(). Π’ΠΎΠΉ Π²ΡΡΡΠ° Π½ΡΠΊΠ°ΠΊΡΠ² "ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°" Π·Π° ΡΠ΅Π°Π»Π½ΠΈΡ ΠΏΡΠΎΠ·ΠΎΡΠ΅Ρ/Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ Ρ
Π²ΡΡΠ»Ρ ElementNotFoundError (ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ElementAmbiguousError, Π°ΠΊΠΎ ΡΠ° Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, Ρ.Π΅. Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΅ Π΄Π° ΡΠ΅ ΡΡΠΎΡΠ½ΡΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈΡΠ΅ Π·Π° ΡΡΡΡΠ΅Π½Π΅). Π’Π°Π·ΠΈ "ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°" Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈΠ»ΠΈ Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ Π½Π΅Π³ΠΎ.
Python ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠΊΡΠΈΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΊΡΠ°ΠΉΠ½ΠΈΡΡ ΠΊΠΎΠ΄ Π΄Π° ΡΡΠ°Π½Π΅ ΠΏΠΎ-ΠΊΡΠ°ΡΡΠΊ. ΠΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°ΠΌΠΎ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. Π‘Π»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π΄Π²Π΅ ΡΠ΅Π΄Π° ΠΏΡΠ°Π²ΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π΅Π΄Π½ΠΎ ΠΈ ΡΡΡΠΎ: .wrapper_object()dlg_spec.wrapper_object().minimize() # ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ dlg_spec.minimize() # ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ
ΠΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π·Π° ΡΡΡΡΠ΅Π½Π΅ Π·Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ·ΠΎΡΠ΅ΡΠ°. ΠΡΠΎ ΡΠ°ΠΌΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:Π‘ΠΏΠΈΡΡΠΊ Π½Π° Π²ΡΠΈΡΠΊΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°
# ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ²Π½Π΅ΠΉ
app.window(title_re='.* - Notepad$').window(class_name='Edit')
# ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ (ΠΊΠ°ΠΊ AND) ΠΈ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')pywinauto.findwindows.find_elements(β¦) .
ΠΠ°Π³ΠΈΡ Π½Π° Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎ Π°ΡΡΠΈΠ±ΡΡ ΠΈ ΠΊΠ»ΡΡ
__getattribute__ __getattribute__). Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π°ΡΡΠΈΠ±ΡΡΠ° ΠΏΠΎΠ΄Π»Π΅ΠΆΠΈ Π½Π° ΡΡΡΠΈΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° (Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΌΡΠΊΠ²Π°ΡΠ΅ ΠΏΡΠΎΠ±Π΅Π»ΠΈ, Π·Π°ΠΏΠ΅ΡΠ°ΠΉΠΊΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈ). ΠΠ° ΡΠ°ΡΡΠΈΠ΅, pywinauto ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ Π·Π° βΠ½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎ ΡΡΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅β, ΠΊΠΎΠΉΡΠΎ Π΅ ΡΡΡΠΎΠΉΡΠΈΠ² Π½Π° ΠΏΠ΅ΡΠ°ΡΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΌΠ°Π»ΠΊΠΈ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ.
app.UntitledNotepad
# ΡΡΡΠΎΡΠΎ ΠΊΠ°ΡΠΎ
app.window(best_match='UntitledNotepad')ΠΠΊΠΎ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Unicode ΡΡΡΠΎΠΊΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΡΡΠΊΠΈ Π΅Π·ΠΈΠΊ), ΠΏΡΠΎΠ±Π΅Π»ΠΈΡΠ΅ ΠΈ Ρ.Π½., ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΏΠΎ ΠΊΠ»ΡΡ (ΠΊΠ°ΡΠΎ ΡΠ΅ Π»ΠΈ Π΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ ΡΠ΅ΡΠ½ΠΈΠΊ):
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(title="Contains:", auto_id="13087", control_type="Edit")Π‘Π°ΠΌΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ΅ β ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΄ΠΎΡΡΠ° Π³ΠΎΠ»ΡΠΌΠ° ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ°.
>>> app.Properties.print_control_identifiers()
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»:
ΠΠΈΠ°Π»ΠΎΠ³ - '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")
|
| ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ - '' (L717, T589, R749, B622)
| [u'', u'0', u'Image1', u'Image0', 'Image', u'1']
| child_window(auto_id="13057", control_type="Image")
|
| ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ - '' (L717, T630, R1035, B632)
| ['Image2', u'2']
| child_window(auto_id="13095", control_type="Image")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'ΠΠΌΠ΅ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ°:' (L790, T596, R1036, B619)
| [u'3', 'Edit', u'Edit1', u'Edit0']
| child_window(title="Folder name:", auto_id="13156", control_type="Edit")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'Π’ΠΈΠΏ:' (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")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'Π’ΠΈΠΏ:' (L790, T643, R1036, B666)
| [u'4', 'Edit2', u'Type:Edit']
| child_window(title="Type:", auto_id="13059", control_type="Edit")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'ΠΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:' (L717, T669, R780, B684)
| [u'Location:Static', u'Location:', u'Static2']
| child_window(title="Location:", auto_id="13089", control_type="Text")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'ΠΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:' (L790, T669, R1036, B692)
| ['Edit3', u'Location:Edit', u'5']
| child_window(title="Location:", auto_id="13065", control_type="Edit")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'Π Π°Π·ΠΌΠ΅Ρ:' (L717, T695, R780, B710)
| [u'Size:Static', u'Size:', u'Static3']
| child_window(title="Size:", auto_id="13081", control_type="Text")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'Π Π°Π·ΠΌΠ΅Ρ:' (L790, T695, R1036, B718)
| ['Edit4', u'6', u'Size:Edit']
| child_window(title="Size:", auto_id="13064", control_type="Edit")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'Π Π°Π·ΠΌΠ΅Ρ Π½Π° Π΄ΠΈΡΠΊΠ°:' (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")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'Π Π°Π·ΠΌΠ΅Ρ Π½Π° Π΄ΠΈΡΠΊΠ°:' (L790, T721, R1036, B744)
| ['Edit5', u'7', u'Size on disk:Edit']
| child_window(title="Size on disk:", auto_id="13106", control_type="Edit")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'Π‘ΡΠ΄ΡΡΠΆΠ°:' (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")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'Π‘ΡΠ΄ΡΡΠΆΠ°:' (L790, T747, R1036, B770)
| [u'8', 'Edit6', u'Contains:Edit']
| child_window(title="Contains:", auto_id="13087", control_type="Edit")
|
| ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ - 'Π‘ΡΠ΄ΡΡΠΆΠ°:' (L717, T773, R1035, B775)
| [u'Contains:Image', 'Image3', u'Contains:2']
| child_window(title="Contains:", auto_id="13096", control_type="Image")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'Π‘ΡΠ·Π΄Π°Π΄Π΅Π½:' (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")
|
| Π Π΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ - 'Π‘ΡΠ·Π΄Π°Π΄Π΅Π½:' (L790, T786, R1036, B809)
| [u'Created:Edit', 'Edit7', u'9']
| child_window(title="Created:", auto_id="13072", control_type="Edit")
|
| ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ - 'Π‘ΡΠ·Π΄Π°Π΄Π΅Π½:' (L717, T812, R1035, B814)
| [u'Created:Image', 'Image4', u'Created:2']
| child_window(title="Created:", auto_id="13097", control_type="Image")
|
| Π‘ΡΠ°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΊΡΡ - 'ΠΡΡΠΈΠ±ΡΡΠΈ:' (L717, T825, R780, B840)
| [u'Attributes:Static', u'Static7', u'Attributes:']
| child_window(title="Attributes:", auto_id="13091", control_type="Text")
|
| Π§Π΅ΠΊΠ±ΠΎΠΊΡ - 'Π‘Π°ΠΌΠΎ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ (ΠΡΠΈΠ»ΠΎΠΆΠΈΠΌΠΎ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ°)' (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")
|
| Π§Π΅ΠΊΠ±ΠΎΠΊΡ - 'Π‘ΠΊΡΠΈΡ' (L790, T848, R865, B864)
| ['CheckBox2', u'HiddenCheckBox', u'Hidden']
| child_window(title="Hidden", auto_id="13076", control_type="CheckBox")
|
| ΠΡΡΠΎΠ½ - 'Π Π°Π·ΡΠΈΡΠ΅Π½ΠΈ...' (L930, T845, R1035, B868)
| [u'Advanced...', u'Advanced...Button', 'Button', u'Button1', u'Button0']
| child_window(title="Advanced...", auto_id="13154", control_type="Button")
|
| ΠΡΡΠΎΠ½ - 'ΠΠ' (L814, T968, R889, B991)
| ['Button2', u'OK', u'OKButton']
| child_window(title="OK", auto_id="1", control_type="Button")
|
| ΠΡΡΠΎΠ½ - 'ΠΡΠΌΡΠ½Π°' (L895, T968, R970, B991)
| ['Button3', u'CancelButton', u'Cancel']
| child_window(title="Cancel", auto_id="2", control_type="Button")
|
| ΠΡΡΠΎΠ½ - 'ΠΡΠΈΠ»Π°Π³Π°Π½Π΅' (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 - 'ΠΠ±ΡΠΈ' (L704, T558, R753, B576)
| | [u'GeneralTabItem', 'TabItem', u'General', u'TabItem0', u'TabItem1']
| | child_window(title="General", control_type="TabItem")
| |
| | TabItem - 'Π‘ΠΏΠΎΠ΄Π΅Π»ΡΠ½Π΅' (L753, T558, R801, B576)
| | [u'Sharing', u'SharingTabItem', 'TabItem2']
| | child_window(title="Sharing", control_type="TabItem")
| |
| | TabItem - 'Π‘ΠΈΠ³ΡΡΠ½ΠΎΡΡ' (L801, T558, R851, B576)
| | [u'Security', 'TabItem3', u'SecurityTabItem']
| | child_window(title="Security", control_type="TabItem")
| |
| | TabItem - 'ΠΡΠ΅Π΄ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ' (L851, T558, R947, B576)
| | [u'Previous VersionsTabItem', u'Previous Versions', 'TabItem4']
| | child_window(title="Previous Versions", control_type="TabItem")
| |
| | TabItem - 'ΠΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅' (L947, T558, R1007, B576)
| | [u'CustomizeTabItem', 'TabItem5', u'Customize']
| | child_window(title="Customize", control_type="TabItem")
|
| TitleBar - 'ΠΡΠΌΠ°' (L712, T521, R1057, B549)
| ['TitleBar', u'11']
| |
| | ΠΠ΅Π½Ρ - 'Π‘ΠΈΡΡΠ΅ΠΌΠ°' (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 - 'Π‘ΠΈΡΡΠ΅ΠΌΠ°' (L696, T526, R718, B548)
| | | [u'System2', u'MenuItem', u'SystemMenuItem']
| | | child_window(title="System", control_type="MenuItem")
| |
| | ΠΡΡΠΎΠ½ - 'ΠΠ°ΡΠ²ΠΎΡΠΈ' (L1024, T519, R1058, B549)
| | [u'CloseButton', u'Close', 'Button5']
| | child_window(title="Close", control_type="Button")Π Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΏΠ΅ΡΠ°ΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ»ΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π±Π°Π²ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² iTunes Π½Π° Π΅Π΄Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ° Ρ ΡΠ΅Π»ΠΈ ΡΡΠΈ Ρ
ΠΈΠ»ΡΠ΄ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°!), Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΡΡ depth (Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π°): depth=1 β ΡΠ°ΠΌΠΈΡΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ, depth=2 β ΡΠ°ΠΌΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½ΠΈΡΠ΅ Π΄Π΅ΡΠ° ΠΈ ΡΠ°ΠΊΠ° Π½Π°ΡΠ°ΡΡΠΊ. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π²Π° ΠΈ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° child_window.
ΠΡΠΈΠΌΠ΅ΡΠΈ
ΠΠΎΡΡΠΎΡΠ½Π½ΠΎ Π΄ΠΎΠΏΡΠ»Π²Π°ΠΌΠ΅ . ΠΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΏΠΎΠΌΠ΅Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ WireShark (ΡΠΎΠ²Π° Π΅ Π΄ΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Qt5; Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Π²Π° ΠΈ Π±Π΅Π· Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ° scapy.Sniffer ΠΎΡ Python ΠΏΠ°ΠΊΠ΅ΡΠ° ). ΠΠΌΠ° ΠΈ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° MS Paint Ρ Π½Π΅Π³ΠΎΠ²ΠΈΡ Ribbon ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌ.
ΠΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΎΡΠ»ΠΈΡΠ΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΏΠΈΡΠ°Π½ ΠΎΡ ΠΌΠΎΡ ΡΡΡΠ΄Π΅Π½Ρ: (ΡΠΎΠΉ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ).
Π, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ Π·Π° ΡΡΠ±ΠΈΡΠΈΡ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ° (Π³ΠΎΡΠ΅ΡΠΈ ΠΊΠ»Π°Π²ΠΈΡΠΈ) ΠΈ ΠΌΠΈΡΠΊΠ°ΡΠ°:
.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΡΠ΄Π΅Π»Π½ΠΎ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΠΌΠ°Π³Π°Ρ Π·Π° ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ° ΠΌΠ΅Π½ ΠΈ ΡΠΎΠ²Π° Π΅ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Ρ
ΠΎΠ±ΠΈ. ΠΠ²Π°ΠΌΠ° ΠΎΡ ΠΌΠΎΠΈΡΠ΅ ΡΡΡΠ΄Π΅Π½ΡΠΈ ΠΎΡ ΠΠΠΠ£ Π½Π°ΡΠΊΠΎΡΠΎ Π·Π°ΡΠΈΡΠΈΡ
Π° Π±Π°ΠΊΠ°Π»Π°Π²ΡΡΡΠΊΠΈΡΠ΅ ΡΠΈ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΏΠΎ ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ°. Π½Π°ΠΏΡΠ°Π²ΠΈ Π³ΠΎΠ»ΡΠΌ ΠΏΡΠΈΠ½ΠΎΡ Π² ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° MS UI Automation ΠΈ Π½Π°ΡΠΊΠΎΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅Π½ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΠ΄ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° βΠ·Π°ΠΏΠΈΡ-Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅β Π½Π° ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° (ΡΠΎΠ²Π° Π΅ Π½Π°ΠΉ-ΡΠ»ΠΎΠΆΠ½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ), Π·Π°ΡΠ΅Π³Π° ΡΠ°ΠΌΠΎ Π·Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° βuiaβ. ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π° Π½ΠΎΠ² Π±Π΅ΠΊΠ΅Π½Π΄ ΠΏΠΎΠ΄ Linux Π½Π° ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° AT-SPI (ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ mouse ΠΈ keyboard Π½Π° Π±Π°Π·Π° β Π²Π΅ΡΠ΅ ΡΠ° Π² Π²Π΅ΡΡΠΈΠΈ 0.6.x).
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΎΡ Π΄ΠΎΡΡΠ° Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΠΌ ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΊΡΡΡ ΠΏΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π½Π° Python, ΡΠ°ΡΡ ΠΎΡ ΠΌΠ°Π³ΠΈΡΡΡΡΡΠΊΠΈΡΠ΅ ΡΡΡΠ΄Π΅Π½ΡΠΈ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π΄ΠΎΠΌΠ°ΡΠ½ΠΈ Π·Π°Π΄Π°Π½ΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΠΊΠΈ ΠΌΠ°Π»ΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ. ΠΡΠΊΠΎΠΈ ΠΊΠ»ΡΡΠΎΠ²ΠΈ Π½Π΅ΡΠ° Π² Π΅ΡΠ°ΠΏΠ° Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½ΠΈΡ ΡΡΡΠΎ Π±ΡΡ Π° ΠΎΡΠΊΡΠΈΡΠΈ ΠΎΡ ΡΡΡΠ΄Π΅Π½ΡΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ»Π΅Π΄Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°. ΠΠ° ΡΠΎΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠ°Π³Π°Ρ ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠΈ (QuantifiedCode, Codacy ΠΈ Landscape) ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π΅ Π² ΠΎΠ±Π»Π°ΠΊΠ° (ΡΡΠ»ΡΠ³Π°ΡΠ° AppVeyor) Ρ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄Π° ΠΎΠΊΠΎΠ»ΠΎ 95%.
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΎΡΡΠ°Π²ΡΡ ΠΎΡΠ·ΠΈΠ²ΠΈ, ΡΡΠ·Π΄Π°Π²Π°Ρ Π±ΡΠ³ΠΎΠ²Π΅ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΏΡΠ» ΡΠ΅ΠΊΠ²Π΅ΡΡΠΈ!
ΠΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅ΡΡΡΡΠΈ
ΠΠ° Π²ΡΠΏΡΠΎΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΠΈΠΌ ΠΏΠΎ (Π½Π΅ΠΎΡΠ΄Π°Π²Π½Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ ) ΠΈ . ΠΠΌΠ° .
ΠΡΠ΅ΠΊΠΈ ΠΌΠ΅ΡΠ΅Ρ ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ . ΠΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π²Π΅Π·Π΄ΠΈ Π² GitHub, ΡΠ°ΠΌΠΎΡΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ ΠΈΠΌ ΡΠ°ΡΡΠ°Ρ ΡΠ°ΠΌΠΎ Autohotkey (ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΠΎΠ»ΡΠΌΠ° ΠΎΠ±ΡΠ½ΠΎΡΡ ΠΈ Π΄ΡΠ»Π³Π° ΠΈΡΡΠΎΡΠΈΡ) ΠΈ PyAutoGUI (Π² Π·Π½Π°ΡΠΈΡΠ΅Π»Π½Π° ΡΡΠ΅ΠΏΠ΅Π½ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ½ΠΈΠ³ΠΈΡΠ΅ Π½Π° Π½Π΅ΠΉΠ½ΠΈΡ Π°Π²ΡΠΎΡ Al Sweigart: Β«Automate the Boring Stuff with PythonΒ» ΠΈ Π΄ΡΡΠ³ΠΈ).
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
