Python Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ MS UI Automation. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΉ, ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ: WinForms, WPF, Qt5, Windows Store (UWP) ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅ β ΠΏΠΎΡΡΠΈ Π²ΡΠ΅, ΡΡΠΎ Π΅ΡΡΡ Π½Π° Windows.
- Π‘ΠΈΡΡΠ΅ΠΌΠ° Π±ΡΠΊΠ΅Π½Π΄ΠΎΠ²/ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² (ΡΠ΅ΠΉΡΠ°Ρ ΠΈΡ
Π΄Π²ΠΎΠ΅ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ: Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠΉ
"win32"
ΠΈ Π½ΠΎΠ²ΡΠΉ"uia"
). ΠΠ°Π»ΡΡΠ΅ ΠΏΠ»Π°Π²Π½ΠΎ Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π² ΡΡΠΎΡΠΎΠ½Ρ ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΠΎΡΡΠΈ. - Win32 Ρ ΡΠΊΠΈ Π΄Π»Ρ ΠΌΡΡΠΈ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ (hot keys Π² Π΄ΡΡ Π΅ pyHook).
Π’Π°ΠΊΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠ±Π·ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π΅ΡΡΡ Π² open source Π΄Π»Ρ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΠΎΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ (Π±Π΅Π· ΠΏΡΠ΅ΡΠ΅Π½Π·ΠΈΠΉ Π½Π° ΡΠ΅ΡΡΠ΅Π·Π½ΠΎΠ΅ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅).
ΠΡΠ° ΡΡΠ°ΡΡΡ β ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΡΠ°ΡΡΠΈΡΡΠΎΠ²ΠΊΠ° Π΄ΠΎΠΊΠ»Π°Π΄Π° Ρ ΠΊΠΎΠ½ΡΠ΅ΡΠ΅Π½ΡΠΈΠΈ SQA Days 20 Π² ΠΠΈΠ½ΡΠΊΠ΅ (
- ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ
- ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΡΠ΅ accessibility ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
ΠΠ°ΠΊ Π½Π°ΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ pywinauto
ΠΠ°ΡΠ½ΡΠΌ Ρ ΠΊΡΠ°ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π·ΠΎΡΠ° ΠΎΠΏΠ΅Π½ ΡΠΎΡΡΠ° Π² ΡΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ. ΠΠ»Ρ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΡΡ GUI ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ Π΄Π»Ρ Π²Π΅Π±Π°, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΅ΡΡΡ Selenium. ΠΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ:
ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄
Π₯Π°ΡΠ΄ΠΊΠΎΠ΄ΠΈΠΌ ΡΠΎΡΠΊΠΈ ΠΊΠ»ΠΈΠΊΠΎΠ², Π½Π°Π΄Π΅Π΅ΠΌΡΡ Π½Π° ΡΠ΄Π°ΡΠ½ΡΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ.
[+] ΠΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠΉ, Π»Π΅Π³ΠΊΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΡΠΉ.
[+] ΠΠ΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°ΡΡ «record-replay» Π·Π°ΠΏΠΈΡΡ ΡΠ΅ΡΡΠΎΠ².
[-] Π‘Π°ΠΌΡΠΉ Π½Π΅ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΉ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΊΡΠ°Π½Π°, ΡΠ΅ΠΌΡ, ΡΡΠΈΡΡΠΎΠ², ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠΊΠΎΠ½ ΠΈ Ρ.ΠΏ.
[-] ΠΡΠΆΠ½Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡ Π½Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ, ΡΠ°ΡΡΠΎ ΠΏΡΠΎΡΠ΅ ΠΏΠ΅ΡΠ΅Π³Π΅Π½Π΅ΡΠΈΡΡ ΡΠ΅ΡΡΡ Ρ Π½ΡΠ»Ρ ΠΈΠ»ΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡΡΠ½ΡΡ.
[-] ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π΄Π»Ρ Π²Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
Π΅ΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ (ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠ΅):
Π‘ΡΠΎΠΈΡ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΉ Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»ΠΈΠΊΠ°ΡΡ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌ (ΠΎΡ Π»Π΅Π²ΠΎΠ³ΠΎ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΠ³Π»Π° ΠΎΠΊΠ½Π°/ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, Π° Π½Π΅ Π²ΡΠ΅Π³ΠΎ ΡΠΊΡΠ°Π½Π°) β ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΡΡΠΈΡΡΠ²Π°ΡΡ Π΄Π»ΠΈΠ½Ρ/ΡΠΈΡΠΈΠ½Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (ΡΠΎΠ³Π΄Π° ΠΈ ΡΠ°Π·Π½ΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΡΠ°Π½Π° Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ).
ΠΡΡΠ³ΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ: Π²ΡΠ΄Π΅Π»ΡΡΡ Π΄Π»Ρ ΡΠ΅ΡΡΠΎΠ² ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΠΌΠ°ΡΠΈΠ½Ρ ΡΠΎ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΡΠΌΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ (Π½Π΅ ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ Π² ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ ΡΠ»ΡΡΠ°ΡΡ Π³ΠΎΠ΄ΠΈΡΡΡ).
Π Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ ΡΡΠ°Π»ΠΎΠ½Π½ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
[+] ΠΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠΉ[+-] ΠΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ (Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄), Π½ΠΎ Π²ΡΡ ΠΆΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ Ρ ΠΈΡΡΠΎΡΡΠ΅ΠΉ.
[-+] ΠΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ, Ρ.ΠΊ. ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΠΎΠ² CPU Π΄Π»Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ.
[-] Π ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠΈ ΡΠ΅ΠΊΡΡΠ° (OCR), ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠ΅ΡΠΈ Π½Π΅ ΠΈΠ΄ΡΡ => Π½Π΅Π»ΡΠ·Ρ Π΄ΠΎΡΡΠ°ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ, ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ OCR ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π½Π°Π΄Π΅ΠΆΠ½Ρ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π·Π°Π΄Π°Ρ, ΠΈ ΡΠΈΡΠΎΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅ΡΡ (welcome Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΡΠΆΠ΅ Π½Π΅ ΡΠ°ΠΊ).
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ:
Accessibility ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
[+] Π‘Π°ΠΌΡΠΉ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, Ρ.ΠΊ. ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΊΠ°ΡΡ ΠΏΠΎ ΡΠ΅ΠΊΡΡΡ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ ΠΎΡΡΠΈΡΠΎΠ²Π°Π½ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΈΠ»ΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΎΠΌ.[+] ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ => ΠΏΡΠΎΡΠ΅ Π²Π΅ΡΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠΎΠ².
[+] ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠ°ΠΌΡΠΉ Π±ΡΡΡΡΡΠΉ, Ρ.ΠΊ. ΠΏΠΎΡΡΠΈ Π½Π΅ ΡΠ°ΡΡ ΠΎΠ΄ΡΠ΅Ρ ΡΠ΅ΡΡΡΡΡ CPU.
[-] Π’ΡΠΆΠ΅Π»ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ: Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π²ΡΠ΅ open-source Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ-Π΄Π²Π΅ accessibility ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ. Windows/Linux/MacOS ΡΠ΅Π»ΠΈΠΊΠΎΠΌ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½ΠΈΠΊΡΠΎ, ΠΊΡΠΎΠΌΠ΅ ΠΏΠ»Π°ΡΠ½ΡΡ ΡΠΈΠΏΠ° TestComplete, UFT ΠΈΠ»ΠΈ Squish.
[-] ΠΠ΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ°ΠΊΠ°Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ Π΄ΠΎΡΡΡΠΏΠ½Π°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³ΡΡΠ·ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΊΡΠ°Π½Π° Π²Π½ΡΡΡΠΈ VirtualBox’Π° β ΡΡΡ Π±Π΅Π· ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ. ΠΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ accessibility ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ. Π Π½Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅ ΠΈ ΠΏΠΎΠΉΠ΄Π΅Ρ ΡΠ΅ΡΡ.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ:
LDTP β ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΠΉ open-source ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ (ΡΠΎΡΠ½Π΅Π΅ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ) Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ accessibility ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΏΠΎΠΏΡΠ»ΡΡΠ΅Π½. Π‘Π°ΠΌ Π½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ΠΈΠΌ, Π½ΠΎ ΠΏΠΎ ΠΎΡΠ·ΡΠ²Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ Π½Π΅Π³ΠΎ Π½Π΅ ΡΠ°ΠΌΡΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ. ΠΡΠ»ΠΈ Π΅ΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠ²Π½ΡΠ΅ ΠΎΡΠ·ΡΠ²Ρ, ΠΏΡΠΎΡΡ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°Ρ .
Π’Π΅ΡΡΠΎΠ²ΡΠΉ backdoor (a.k.a. Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄)
ΠΠ»Ρ ΠΊΡΠΎΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅Π½Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ°ΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ°ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ testability. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠΉ TCP ΡΠ΅ΡΠ²Π΅Ρ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΠ΅ΡΡΡ ΠΊ Π½Π΅ΠΌΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΈ ΠΏΠΎΡΡΠ»Π°ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ: Π½Π° ΡΡΠΎ Π½Π°ΠΆΠ°ΡΡ, ΠΎΡΠΊΡΠ΄Π° Π²Π·ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Ρ.ΠΏ. ΠΠ°Π΄Π΅ΠΆΠ½ΠΎ, Π½ΠΎ Π½Π΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎ.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π΄Π΅ΡΠΊΡΠΎΠΏΠ½ΡΠ΅ accessibility ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ
Π‘ΡΠ°ΡΡΠΉ Π΄ΠΎΠ±ΡΡΠΉ Win32 API
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Windows ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΡ Π΄ΠΎ Π²ΡΡ ΠΎΠ΄Π° WPF ΠΈ Π·Π°ΡΠ΅ΠΌ Windows Store, ΠΏΠΎΡΡΡΠΎΠ΅Π½Ρ ΡΠ°ΠΊ ΠΈΠ»ΠΈ ΠΈΠ½Π°ΡΠ΅ Π½Π° Win32 API. Π ΠΈΠΌΠ΅Π½Π½ΠΎ, MFC, WTL, C++ Builder, Delphi, VB6 β Π²ΡΠ΅ ΡΡΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Win32 API. ΠΠ°ΠΆΠ΅ Windows Forms β Π² Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ Win32 API ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ:
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 β «the root of all evil». Π‘Π°ΠΌΡΠΉ Π½ΠΈΠ·ΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΠΉ, Π½ΠΈ ΡΠ°Π·Ρ Π½Π΅ user-friendly.
(2) IDispatch ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Excel.Application
), ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² Python Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ° win32com.client (Π²Ρ
ΠΎΠ΄ΠΈΡ Π² pyWin32). Π‘Π°ΠΌΡΠΉ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈ ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ.
(3) Custom ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ, Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΡΠΌΠ΅Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΉ Python ΠΏΠ°ΠΊΠ΅Ρ
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ:
AT-SPI
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΏΠΎΡΡΠΈ Π²ΡΠ΅ ΠΎΡΠΈ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²Π° Linux ΠΏΠΎΡΡΡΠΎΠ΅Π½Ρ Π½Π° X Window System (Π² Fedora 25 «ΠΈΠΊΡΡ» ΠΏΠΎΠΌΠ΅Π½ΡΠ»ΠΈ Π½Π° Wayland), «ΠΈΠΊΡΡ» ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΠΏΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΊΠ½Π°ΠΌΠΈ Π²Π΅ΡΡ Π½Π΅Π³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΈ ΠΌΡΡΡΡ/ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠΎΠΉ. ΠΠ»Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ° ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌ, Π»ΠΈΡΡ Π±ΠΎΠΊΡΠ°ΠΌ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅ β ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ AT-SPI. Π£ ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΠΎΠΊΠΎΠ½Π½ΡΡ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠΎΠ² Π΅ΡΡΡ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ AT-SPI registry Π΄Π΅ΠΌΠΎΠ½, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΉ GUI (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Qt ΠΈ GTK).
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ:
pyatspi2, Π½Π° ΠΌΠΎΠΉ Π²Π·Π³Π»ΡΠ΄, ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠΈΠΏΠ° ΡΠΎΠ³ΠΎ ΠΆΠ΅ PyGObject. Π‘Π°ΠΌΠ° ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΡΠ½ΠΎΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ libatspi.so
. Π Π½Π΅ΠΉ ΠΈΠΌΠ΅Π΅ΡΡΡ
Apple Accessibility API
ΠΠ° MacOS Π΅ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠ·ΡΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ AppleScript. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅Π³ΠΎ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π½Π° Python, ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ObjectiveC. ΠΠ°ΡΠΈΠ½Π°Ρ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π΅ΡΠ΅ Ρ MacOS 10.6 Π² ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΏΠΈΡΠΎΠ½ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΠ°ΠΊΠ΅Ρ pyobjc. ΠΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π΅Π³ΡΠΈΡ ΡΠΏΠΈΡΠΎΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π΄Π»Ρ Π±ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π² pywinauto.
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ: ΠΡΠΎΠΌΠ΅ ΡΠ·ΡΠΊΠ° Apple Script, ΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° 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 ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ legacy ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
- backend=»uia» β Π½ΠΎΠ²ΡΠΉ Π±ΡΠΊΠ΅Π½Π΄ Π΄Π»Ρ MS UI Automation: ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ WPF ΠΈ WinForms; ΡΠ°ΠΊΠΆΠ΅ Ρ
ΠΎΡΠΎΡ Π΄Π»Ρ Delphi ΠΈ Windows Store ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ; ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ Qt5 ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ Java ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ. Π Π²ΠΎΠΎΠ±ΡΠ΅, Π΅ΡΠ»ΠΈ Inspect.exe Π²ΠΈΠ΄ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈ ΠΈΡ
ΡΠ²ΠΎΠΉΡΡΠ²Π°, Π·Π½Π°ΡΠΈΡ ΡΡΠΎΡ Π±ΡΠΊΠ΅Π½Π΄ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ. Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠ² ΡΠΎΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ UI Automation (Mozilla ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π° Π₯ΡΠΎΠΌΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠΎΡΠΌΠΈΡΡ ΠΊΠ»ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
--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')
ΠΡΠ»ΠΈ Ρ
ΠΎΡΠ΅ΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΡΠ°Π·Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ, Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΠΊΠ»Π°ΡΡ 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
) β ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ, Π³Π΄Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π±ΡΠΊΠ΅Π½Π΄. ΠΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ Π»ΠΎΠΆΠΈΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ «ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ->Π²ΡΠ°ΠΏΠΏΠ΅Ρ», ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π΄Π°Π»ΡΡΠ΅.
Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠΊΠΎΠ½/ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²
ΠΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΡΠΎΠΈΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ pywinauto. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΡΡ ΠΎΠΊΠ½ΠΎ/ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½Π½ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈΠ»ΠΈ ΡΠΆΠ΅ Π·Π°ΠΊΡΡΡΠΎ. Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΠΊΠ½Π° (ΠΎΠ±ΡΠ΅ΠΊΡ WindowSpecification) Ρ ΡΠ°Π½ΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ.
ΠΡΠΈΠΌΠ΅Ρ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠΊΠ½Π°:
>>> 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
, Π΅ΡΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΡΠΎ Π΅ΡΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠΎΡΠ½ΠΈΡΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠΉ ΠΏΠΎΠΈΡΠΊΠ°). ΠΡΠΎΡ «Π²ΡΠ°ΠΏΠΏΠ΅Ρ» ΡΠΆΠ΅ ΡΠΌΠ΅Π΅Ρ Π΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π½Π΅Π³ΠΎ.
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')
Π‘ΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΊΡΠΈΡΠ΅ΡΠΈΠ΅Π² Π΅ΡΡΡ Π² Π΄ΠΎΠΊΠ°Ρ
ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΠ°Π³ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎ Π°ΡΡΠΈΠ±ΡΡΡ ΠΈ ΠΏΠΎ ΠΊΠ»ΡΡΡ
Python ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΉ ΠΎΠΊΠ½Π° ΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ Π°ΡΡΠΈΠ±ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ (Π²Π½ΡΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ __getattribute__
). Π Π°Π·ΡΠΌΠ΅Π΅ΡΡΡ, Π½Π° ΠΈΠΌΡ Π°ΡΡΠΈΠ±ΡΡΠ° Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ ΠΈ Π½Π° ΠΈΠΌΡ Π»ΡΠ±ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π½Π΅Π»ΡΠ·Ρ Π²ΡΡΠ°Π²Π»ΡΡΡ ΠΏΡΠΎΠ±Π΅Π»Ρ, Π·Π°ΠΏΡΡΡΠ΅ ΠΈ ΠΏΡΠΎΡΠΈΠ΅ ΡΠΏΠ΅ΡΡΠΈΠΌΠ²ΠΎΠ»Ρ). Π ΡΡΠ°ΡΡΡΡ, pywinauto ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ «best match» Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠΈΡΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠΎΠΉΡΠΈΠ² ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΊΠ°ΠΌ ΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌ Π²Π°ΡΠΈΠ°ΡΠΈΡΠΌ.
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()
Control Identifiers:
Dialog - 'Windows NT Properties' (L688, T518, R1065, B1006)
[u'Windows NT PropertiesDialog', u'Dialog', u'Windows NT Properties']
child_window(title="Windows NT Properties", control_type="Window")
|
| Image - '' (L717, T589, R749, B622)
| [u'', u'0', u'Image1', u'Image0', 'Image', u'1']
| child_window(auto_id="13057", control_type="Image")
|
| Image - '' (L717, T630, R1035, B632)
| ['Image2', u'2']
| child_window(auto_id="13095", control_type="Image")
|
| Edit - 'Folder name:' (L790, T596, R1036, B619)
| [u'3', 'Edit', u'Edit1', u'Edit0']
| child_window(title="Folder name:", auto_id="13156", control_type="Edit")
|
| Static - 'Type:' (L717, T643, R780, B658)
| [u'Type:Static', u'Static', u'Static1', u'Static0', u'Type:']
| child_window(title="Type:", auto_id="13080", control_type="Text")
|
| Edit - 'Type:' (L790, T643, R1036, B666)
| [u'4', 'Edit2', u'Type:Edit']
| child_window(title="Type:", auto_id="13059", control_type="Edit")
|
| Static - 'Location:' (L717, T669, R780, B684)
| [u'Location:Static', u'Location:', u'Static2']
| child_window(title="Location:", auto_id="13089", control_type="Text")
|
| Edit - 'Location:' (L790, T669, R1036, B692)
| ['Edit3', u'Location:Edit', u'5']
| child_window(title="Location:", auto_id="13065", control_type="Edit")
|
| Static - 'Size:' (L717, T695, R780, B710)
| [u'Size:Static', u'Size:', u'Static3']
| child_window(title="Size:", auto_id="13081", control_type="Text")
|
| Edit - 'Size:' (L790, T695, R1036, B718)
| ['Edit4', u'6', u'Size:Edit']
| child_window(title="Size:", auto_id="13064", control_type="Edit")
|
| Static - 'Size on disk:' (L717, T721, R780, B736)
| [u'Size on disk:', u'Size on disk:Static', u'Static4']
| child_window(title="Size on disk:", auto_id="13107", control_type="Text")
|
| Edit - 'Size on disk:' (L790, T721, R1036, B744)
| ['Edit5', u'7', u'Size on disk:Edit']
| child_window(title="Size on disk:", auto_id="13106", control_type="Edit")
|
| Static - 'Contains:' (L717, T747, R780, B762)
| [u'Contains:1', u'Contains:0', u'Contains:Static', u'Static5', u'Contains:']
| child_window(title="Contains:", auto_id="13088", control_type="Text")
|
| Edit - 'Contains:' (L790, T747, R1036, B770)
| [u'8', 'Edit6', u'Contains:Edit']
| child_window(title="Contains:", auto_id="13087", control_type="Edit")
|
| Image - 'Contains:' (L717, T773, R1035, B775)
| [u'Contains:Image', 'Image3', u'Contains:2']
| child_window(title="Contains:", auto_id="13096", control_type="Image")
|
| Static - 'Created:' (L717, T786, R780, B801)
| [u'Created:', u'Created:Static', u'Static6', u'Created:1', u'Created:0']
| child_window(title="Created:", auto_id="13092", control_type="Text")
|
| Edit - 'Created:' (L790, T786, R1036, B809)
| [u'Created:Edit', 'Edit7', u'9']
| child_window(title="Created:", auto_id="13072", control_type="Edit")
|
| Image - 'Created:' (L717, T812, R1035, B814)
| [u'Created:Image', 'Image4', u'Created:2']
| child_window(title="Created:", auto_id="13097", control_type="Image")
|
| Static - 'Attributes:' (L717, T825, R780, B840)
| [u'Attributes:Static', u'Static7', u'Attributes:']
| child_window(title="Attributes:", auto_id="13091", control_type="Text")
|
| CheckBox - 'Read-only (Only applies to files in folder)' (L790, T825, R1035, B841)
| [u'CheckBox0', u'CheckBox1', 'CheckBox', u'Read-only (Only applies to files in folder)CheckBox', u'Read-only (Only applies to files in folder)']
| child_window(title="Read-only (Only applies to files in folder)", auto_id="13075", control_type="CheckBox")
|
| CheckBox - 'Hidden' (L790, T848, R865, B864)
| ['CheckBox2', u'HiddenCheckBox', u'Hidden']
| child_window(title="Hidden", auto_id="13076", control_type="CheckBox")
|
| Button - 'Advanced...' (L930, T845, R1035, B868)
| [u'Advanced...', u'Advanced...Button', 'Button', u'Button1', u'Button0']
| child_window(title="Advanced...", auto_id="13154", control_type="Button")
|
| Button - 'OK' (L814, T968, R889, B991)
| ['Button2', u'OK', u'OKButton']
| child_window(title="OK", auto_id="1", control_type="Button")
|
| Button - 'Cancel' (L895, T968, R970, B991)
| ['Button3', u'CancelButton', u'Cancel']
| child_window(title="Cancel", auto_id="2", control_type="Button")
|
| Button - 'Apply' (L976, T968, R1051, B991)
| ['Button4', u'ApplyButton', u'Apply']
| child_window(title="Apply", auto_id="12321", control_type="Button")
|
| TabControl - '' (L702, T556, R1051, B962)
| [u'10', u'TabControlSharing', u'TabControlPrevious Versions', u'TabControlSecurity', u'TabControl', u'TabControlCustomize']
| child_window(auto_id="12320", control_type="Tab")
| |
| | TabItem - 'General' (L704, T558, R753, B576)
| | [u'GeneralTabItem', 'TabItem', u'General', u'TabItem0', u'TabItem1']
| | child_window(title="General", control_type="TabItem")
| |
| | TabItem - 'Sharing' (L753, T558, R801, B576)
| | [u'Sharing', u'SharingTabItem', 'TabItem2']
| | child_window(title="Sharing", control_type="TabItem")
| |
| | TabItem - 'Security' (L801, T558, R851, B576)
| | [u'Security', 'TabItem3', u'SecurityTabItem']
| | child_window(title="Security", control_type="TabItem")
| |
| | TabItem - 'Previous Versions' (L851, T558, R947, B576)
| | [u'Previous VersionsTabItem', u'Previous Versions', 'TabItem4']
| | child_window(title="Previous Versions", control_type="TabItem")
| |
| | TabItem - 'Customize' (L947, T558, R1007, B576)
| | [u'CustomizeTabItem', 'TabItem5', u'Customize']
| | child_window(title="Customize", control_type="TabItem")
|
| TitleBar - 'None' (L712, T521, R1057, B549)
| ['TitleBar', u'11']
| |
| | Menu - 'System' (L696, T526, R718, B548)
| | [u'System0', u'System', u'System1', u'Menu', u'SystemMenu']
| | child_window(title="System", auto_id="MenuBar", control_type="MenuBar")
| | |
| | | MenuItem - 'System' (L696, T526, R718, B548)
| | | [u'System2', u'MenuItem', u'SystemMenuItem']
| | | child_window(title="System", control_type="MenuItem")
| |
| | Button - 'Close' (L1024, T519, R1058, B549)
| | [u'CloseButton', u'Close', 'Button5']
| | child_window(title="Close", control_type="Button")
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°ΡΡ
ΠΏΠ΅ΡΠ°ΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΡΠΌΠΎΠ·ΠΈΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² iTunes Π½Π° ΠΎΠ΄Π½ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Π°ΠΆ ΡΡΠΈ ΡΡΡΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²!), Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ depth
(Π³Π»ΡΠ±ΠΈΠ½Π°): depth=1
β ΡΠ°ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, depth=2
β ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π΄Π΅ΡΠΈ, ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. ΠΠ³ΠΎ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡ
ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ child_window
.
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΡΠ΅ΠΌ scapy.Sniffer
ΠΈΠ· ΠΏΠΈΡΠΎΠ½ΠΎΠ²ΡΠΊΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ°
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΌΠΎΠΈΠΌ ΡΡΡΠ΄Π΅Π½ΡΠΎΠΌ:
Π, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ (hot keys) ΠΈ ΠΌΡΡΠΈ:
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΠΈ
ΠΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ β ΡΠ΅ΠΌ, ΠΊΡΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΠ»Ρ ΠΌΠ΅Π½Ρ ΠΈ mouse
ΠΈ keyboard
Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ Π΄Π°Π²Π½ΠΎ ΡΠΈΡΠ°Ρ ΡΠΏΠ΅ΡΠΊΡΡΡ ΠΏΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Python, ΡΠ°ΡΡΡ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ²-ΠΌΠ°Π³ΠΈΡΡΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄ΠΎΠΌΠ°ΡΠ½ΠΈΠ΅ Π·Π°Π΄Π°Π½ΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠΈΡΠΈ ΠΈΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ Π²Π΅ΡΠΈ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ ΡΠΎΠΆΠ΅ ΠΊΠΎΠ³Π΄Π°-ΡΠΎ ΡΠ°ΡΠΊΠΎΠΏΠ°Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΡΠ΄Π΅Π½ΡΡ. Π₯ΠΎΡΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΠΈΡΡ. Π ΡΡΠΎΠΌ ΡΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ (QuantifiedCode, Codacy ΠΈ Landscape) ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΡ Π² ΠΎΠ±Π»Π°ΠΊΠ΅ (ΡΠ΅ΡΠ²ΠΈΡ AppVeyor) Ρ ΠΏΠΎΠΊΡΡΡΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° Π² ΡΠ°ΠΉΠΎΠ½Π΅ 95%.
Π’Π°ΠΊΠΆΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π²ΡΠ΅ΠΌ, ΠΊΡΠΎ ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΡΠ·ΡΠ²Ρ, Π·Π°Π²ΠΎΠ΄ΠΈΡ Π±Π°Π³ΠΈ ΠΈ ΠΏΡΠΈΡΡΠ»Π°Π΅Ρ ΠΏΡΠ»Π» ΡΠ΅ΠΊΠ²Π΅ΡΡΡ!
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ
ΠΠ° Π²ΠΎΠΏΡΠΎΡΠ°ΠΌΠΈ ΠΌΡ ΡΠ»Π΅Π΄ΠΈΠΌ ΠΏΠΎ
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΌΠ΅ΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com