เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” desktop GUI เปƒเบ™ Python + pywinauto: เบงเบดเบ—เบตเบเบฒเบ™เบชเป‰เบฒเบ‡เป€เบžเบทเปˆเบญเบ™เบเบฑเบš MS UI Automation

เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ” Python pywinauto เป€เบ›เบฑเบ™เป‚เบ„เบ‡เบเบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เป€เบžเบทเปˆเบญเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ GUI เป€เบ—เบดเบ‡ Windows. เปƒเบ™เป„เบฅเบเบฐเบชเบญเบ‡เบ›เบตเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบซเบกเปˆเป„เบ”เป‰เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบกเบฑเบ™:

  • เบฎเบญเบ‡เบฎเบฑเบšเป€เบ—เบฑเบเป‚เบ™เป‚เบฅเบเบต MS UI Automation. เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเปเบกเปˆเบ™เบ„เบทเบเบฑเบ™, เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบฑเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™: WinForms, WPF, Qt5, Windows Store (UWP) เปเบฅเบฐเบญเบทเปˆเบ™เป† - เป€เบเบทเบญเบšเบ—เบธเบเบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆเปƒเบ™ Windows.
  • เบฅเบฐเบšเบปเบšเบ‚เบญเบ‡ backends/plugins (เบ›เบฐเบˆเบธเบšเบฑเบ™เบกเบตเบชเบญเบ‡เบญเบฑเบ™เบžเบฒเบเปƒเบ•เป‰ hood: เบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ "win32" เปเบฅเบฐ เปƒเปเปˆ "uia"). เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบเป‰เบฒเบงเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ‚เป‰เบฒเบกเป€เบงเบ—เบต.
  • Win32 hook เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบซเบ™เบนโ€‹เปเบฅเบฐ keyboard (เบ›เบธเปˆเบกโ€‹เบฎเป‰เบญเบ™โ€‹เปƒเบ™โ€‹เบˆเบดเบ”โ€‹เปƒเบˆโ€‹เบ‚เบญเบ‡ pyHookโ€‹)โ€‹.

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเปƒเบซเป‰เบžเบฒเบšเบฅเบงเบกเบชเบฑเป‰เบ™เป†เบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” desktop (เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ—เปเบฒเบ—เปˆเบฒเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเบ—เบตเปˆเบฎเบธเบ™เปเบฎเบ‡).

เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบšเบปเบ”โ€‹เบฅเบฒเบโ€‹เบ‡เบฒเบ™โ€‹เบšเบฒเบ‡โ€‹เบชเปˆเบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบšเบปเบ”โ€‹เบฅเบฒเบโ€‹เบ‡เบฒเบ™โ€‹เบˆเบฒเบโ€‹เบเบญเบ‡โ€‹เบ›เบฐโ€‹เบŠเบธเบก SQA Days 20 เปƒเบ™ Minsk (เบงเบตเบ”เบตเป‚เบญ ะธ เบชเบฐเป„เบฅเป‰), เบชเบฐเบšเบฑเบšเบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบเบšเบฒเบ‡เบชเปˆเบงเบ™ เบ„เบนเปˆเบกเบทเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ เบชเปเบฒเบฅเบฑเบš pywinauto.

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบžเบฒเบšเบฅเบงเบกเบชเบฑเป‰เบ™เป†เบ‚เบญเบ‡เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เปƒเบ™เบ‚เบปเบ‡เป€เบ‚เบ”เบ™เบตเป‰. เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ GUI desktop, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบเบเปˆเบงเบฒเป€เบงเบฑเบš, เป€เบŠเบดเปˆเบ‡เบกเบต Selenium. เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ•เบปเป‰เบ™เบ•เป:

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™

Hardcode เบˆเบธเบ”เบ„เบฅเบดเบ, เบžเบงเบเป€เบฎเบปเบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบˆเบฐเป„เบ”เป‰ hits เบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”.
[+] เบ‚เป‰เบฒเบกเป€เบงเบ—เบต, เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”.
[+] เบกเบฑเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐ "record-play" เบเบฒเบ™เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.
[-] เบ„เบงเบฒเบกเบšเปเปˆเบชเบฐเบ–เบฝเบ™เบ—เบตเปˆเบชเบธเบ”เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ„เบงเบฒเบกเบฅเบฐเบญเบฝเบ”เปœเป‰เบฒเบˆเป, เบฎเบนเบšเปเบšเบšเบชเบตเบชเบฑเบ™, เบ•เบปเบงเบญเบฑเบเบชเบญเบ™, เบ‚เบฐเปœเบฒเบ”เปœเป‰เบฒเบˆเป, เปเบฅเบฐเบญเบทเปˆเบ™เป†.
[-] เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบชเบฐเปœเบฑเบšเบชเบฐเปœเบนเบ™เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡;
[-] เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบžเบฝเบ‡เปเบ•เปˆ;

เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบท (เบ‚เป‰เบฒเบกโ€‹เป€เบงโ€‹เบ—เบตโ€‹)โ€‹: autopy, PyAutoGUI, PyUserInput เปเบฅเบฐเบญเบทเปˆเบ™เป†เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ. เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบด, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบซเบผเบฒเบเบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ™เบตเป‰ (เบšเปเปˆเบชเบฐเป€เบซเบกเบตเป„เบ›เบ‚เป‰เบฒเบกเป€เบงเบ—เบต).

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบเบญเบšเบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป†. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ„เบฅเบดเบเปƒเบชเปˆเบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ (เบˆเบฒเบเบกเบธเบกเบŠเป‰เบฒเบเป€เบ—เบดเบ‡เบ‚เบญเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบก / เบญเบปเบ‡เบ›เบฐเบเบญเบš, เปเบฅเบฐเบšเปเปˆเปเบกเปˆเบ™เบซเบ™เป‰เบฒเบˆเปเบ—เบฑเบ‡เบซเบกเบปเบ”) - เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบ„เบงเบฒเบกเบเบฒเบง / เบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เบ‚เบญเบ‡. เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ” (เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบซเบ™เป‰เบฒเบˆเปเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบˆเบฑเบšเบ›เบงเบ”).

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™: เบˆเบฑเบ”เบชเบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบ”เบฝเบงเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš (เบšเปเปˆเปเบกเปˆเบ™เบ‚เป‰เบฒเบกเป€เบงเบ—เบต, เปเบ•เปˆเปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเบกเบฑเบ™เบ”เบต).

เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบฎเบนเบšเบžเบฒเบšเบญเป‰เบฒเบ‡เบญเบตเบ‡

[+] เบ‚เป‰เบฒเบกเป€เบงเบ—เบต
[+-] เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰ (เบ”เบตเบเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบชเบฒเบ™เบ‡เบฒเบ™), เปเบ•เปˆเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™ tricks เบšเบฒเบ‡.
[-+] เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบŠเป‰เบฒ, เป€เบžเบฒเบฐเบงเปˆเบฒ เบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ CPU เบชเปเบฒเบฅเบฑเบšเบชเบนเบ”เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰.
[-] เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ‚เปเป‰เบ„เบงเบฒเบก (OCR), เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš, เปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ„เปเบฒเบ–เบฒเบก => เบ‚เปเป‰เบกเบนเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบšเปเปˆเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบš. เป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบฎเบนเป‰, เบเบฒเบ™เปเบเป‰เป„เบ‚ OCR เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบกเปˆเบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบงเบฝเบเบ‡เบฒเบ™เบ›เบฐเป€เบžเบ”เบ™เบตเป‰, เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡ (เบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบšเปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™เบ–เป‰เบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบเปเบฅเบฐเบ™เบต).

เป€เบ„เบทเปˆเบญเบ‡เบกเบท: เบชเบตเบเบนเบฅเบต, เบ‚เบตเป‰เบ„เป‰เบฒเบ™ (Sikuli-เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰, Python เบšเปเบฅเบดเบชเบธเบ”), PyAutoGUI.

เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบŠเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡

[+] เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ”เป‰เบงเบเบ‚เปเป‰เบ„เบงเบฒเบก, เป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบชเบฐเปเบ”เบ‡เป‚เบ”เบเบฅเบฐเบšเบปเบšเบซเบผเบทเบเบญเบš.
[+] เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฐเบเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบ‚เปเป‰เบ„เบงเบฒเบก => เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบœเบปเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš.
[+] เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš, เป„เบงเบ—เบตเปˆเบชเบธเบ”, เป€เบžเบฒเบฐเบงเปˆเบฒ เป€เบเบทเบญเบšเบšเปเปˆเบกเบตเบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ CPU.
[-] เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบเบฒเบเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ‚เป‰เบฒเบกเป€เบงเบ—เบต: เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เบ—เบธเบเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” open-source เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบชเบญเบ‡เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบŠเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡. Windows/Linux/MacOS เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเปœเบฑเบšเบชเบฐเปœเบธเบ™เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆเบˆเบฒเบเปƒเบœเบเปเบ•เบฒเบก เบเบปเบเป€เบงเบฑเป‰เบ™เบญเบฑเบ™เบ—เบตเปˆเบˆเปˆเบฒเบเปเบฅเป‰เบงเป€เบŠเบฑเปˆเบ™ TestComplete, UFT เบซเบผเบท Squish.
[-] เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบเบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบšเปเปˆเบชเบฐเป€เบซเบกเบตเป„เบ›เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบซเบผเบ”เบซเบ™เป‰เบฒเบˆเปเบžเบฒเบเปƒเบ™ VirtualBox - เบ™เบตเป‰เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบฎเบนเบšเบžเบฒเบš. เปเบ•เปˆเปƒเบ™เบซเบผเบฒเบเป†เบเปเบฅเบฐเบ™เบตเบ„เบฅเบฒเบชเบชเบดเบ, เบงเบดเบ—เบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบเบฑเบ‡เปƒเบŠเป‰เป„เบ”เป‰. เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบ•เบทเปˆเบกเบญเบตเบ.

เป€เบ„เบทเปˆเบญเบ‡เบกเบท: TestStack.White เปƒเบ™ C#, Winium.Desktop เปƒเบ™ C# (Selenium เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰), MS WinApp Driver เปƒเบ™ C# (Appium เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰), pywinauto, pyatom (LDTP เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰) Python-UIAutomation-for-Windows, เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” เปƒเบ™ Ruby, LDTP (เป‚เบ„เบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš Linux Desktop) เปเบฅเบฐเบฅเบธเป‰เบ™ Windows เบ‚เบญเบ‡เบกเบฑเบ™ Cobra.

LDTP เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เป€เบ›เบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเป‚เบญเป€เบžเบ™เบŠเบญเบ”เบ‚เป‰เบฒเบกเปเบžเบฅเบ”เบŸเบญเบกเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ (เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เป€เบ›เบฑเบ™เบ„เบญเบšเบ„เบปเบงเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”) เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเป€เบ—เบฑเบเป‚เบ™เป‚เบฅเบเบตเบเบฒเบ™เบŠเปˆเบงเบเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบ™เบดเบเบปเบกเบซเบผเบฒเบ. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบกเบฑเบ™โ€‹เป€เบญเบ‡โ€‹, เปเบ•เปˆโ€‹เบญเบตเบ‡โ€‹เบ•เบฒเบกโ€‹เบเบฒเบ™โ€‹เบ—เบปเบšโ€‹เบ—เบงเบ™โ€‹เบ„เบทเบ™โ€‹, เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ•เบญเบšโ€‹เบ‚เบญเบ‡โ€‹เบกเบฑเบ™โ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เบชเบฐโ€‹เบ”เบงเบโ€‹เบ—เบตเปˆโ€‹เบชเบธเบ”โ€‹. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เปƒเบ™เบ—เบฒเบ‡เบšเบงเบ, เบเบฐเบฅเบธเบ™เบฒเปเบšเปˆเบ‡เบ›เบฑเบ™เบกเบฑเบ™เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™.

เบ—เบปเบ”เบชเบญเบš backdoor (aka indoor bike)

เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เป‰เบฒเบกเป€เบงเบ—เบต, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบญเบ‡เบกเบฑเบเบˆเบฐเบชเป‰เบฒเบ‡เบเบปเบ™เป„เบเบžเบฒเบเปƒเบ™เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบ‚เบปเบฒเบชเป‰เบฒเบ‡เบšเปเบฅเบดเบเบฒเบ™เป€เบŠเบตเบŸเป€เบงเบต TCP เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบกเบฑเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก: เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบ„เบฅเบดเบเปƒเบชเปˆ, เบšเปˆเบญเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบ—เบปเปˆเบงเป„เบ›.

เป€เบ•เบฑเบโ€‹เป‚เบ™โ€‹เป‚เบฅโ€‹เบŠเบตโ€‹เบเบฒเบ™โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹เบžเบทเป‰เบ™โ€‹เบ–เบฒเบ™ desktopโ€‹

เบ”เบตเป€เบเบปเปˆเบฒ Win32 API

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Windows เบชเปˆเบงเบ™เปƒเบซเบเปˆเบ—เบตเปˆเบ‚เบฝเบ™เป„เบงเป‰เบเปˆเบญเบ™เบเบฒเบ™เบ›เปˆเบญเบ WPF เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ Windows Store เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ Win32 API เปƒเบ™เบ—เบฒเบ‡เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบญเบทเปˆเบ™. เบ„เบท, MFC, WTL, C ++ Builder, Delphi, VB6 - เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบŠเป‰ Win32 API. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ Windows Forms เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™ Win32 API เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰.

เป€เบ„เบทเปˆเบญเบ‡เบกเบท: เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (เบ„เป‰เบฒเบเบเบฑเบš VB) เปเบฅเบฐ Python wrapper pyautoit, เบ›เบธเปˆเบกเบเบปเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (เบžเบฒเบชเบฒเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš IDispatch COM), pywinauto ( python ) เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” (Ruby) win32-autogui (เบฃเบนเบšเบต).

Microsoft UI เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เบ›เบฐเป‚เบซเบเบ”เบ•เบปเป‰เบ™เบ•เป: เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบŠเบต MS UI Automation เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ GUI เบชเปˆเบงเบ™เปƒเบซเบเปˆเปƒเบ™ Windows เป‚เบ”เบเบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ—เบตเปˆเบซเบฒเบเบฒเบ. เบšเบฑเบ™เบซเบฒ: เบกเบฑเบ™เบšเปเปˆเบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบเปˆเบงเบฒ Win32 API. เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบšเปเปˆเบกเบตเปƒเบœเป€เบฎเบฑเบ” wrappers เป€เบ—เบดเบ‡เบกเบฑเบ™.

เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ™เบตเป‰เปเบกเปˆเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš COM เบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡ (เบ•เบปเป‰เบ™เบ•เป UIAutomationCore.dll), เปเบฅเบฐเบเบฑเบ‡เบกเบต .NET wrapper เปƒเบ™เบฎเบนเบšเปเบšเบš namespace System.Windows.Automation. เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบกเบฑเบ™เบกเบตเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบตเปˆเปเบ™เบฐเบ™เปเบฒเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบšเบฒเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบš UI เบญเบฒเบ”เบˆเบฐเบžเบฒเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ UIAutomationCore.dll เป‚เบ”เบเบเบปเบ‡ (เบ–เป‰เบฒเบ—เปˆเบฒเบ™เป„เบ”เป‰เบเบดเบ™เบเปˆเบฝเบงเบเบฑเบš UiaComWrapper เปƒเบ™ C#, เบ™เบตเป‰เปเบกเปˆเบ™เบกเบฑเบ™).

เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš COM:

(1) IU เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบ - "เบฎเบฒเบเบ‚เบญเบ‡เบ„เบงเบฒเบกเบŠเบปเปˆเบงเบฎเป‰เบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”". เบฅเบฐเบ”เบฑเบšเบ•เปเปˆเบฒเบชเบธเบ”, เบšเปเปˆเป€เบ„เบตเบเป€เบ›เบฑเบ™เบกเบดเบ”เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰.
(2) IDispatch เปเบฅเบฐ derivatives (eg Excel.Application), เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™ Python เป‚เบ”เบเปƒเบŠเป‰เบŠเบธเบ” win32com.client (เบฅเบงเบกเบเบฑเบš pyWin32). เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบชเบฐเบ”เบงเบเปเบฅเบฐเบชเบงเบเบ‡เบฒเบกเบ—เบตเปˆเบชเบธเบ”.
(3) เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡เบ—เบตเปˆเปเบžเบฑเบเป€เบเบฑเบ” Python เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเป„เบ”เป‰เบเบฑเบš เบ›เบฐเป€เบžเบ”.

เป€เบ„เบทเปˆเบญเบ‡เบกเบท: TestStack.White เปƒเบ™ C#, pywinauto 0.6.0+, Winium.Desktop เปƒเบ™ C#, Python-UIAutomation-for-Windows (เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบชเปเบฒเบฅเบฑเบš C wrappers เบœเปˆเบฒเบ™ UIAutomationCore.dll เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเป€เบ›เบตเบ”เป€เบœเบตเบ), เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” เปƒเบ™ Ruby.

AT-SPI

เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเป€เบเบทเบญเบšเบ—เบธเบเปเบเบ™เบ‚เบญเบ‡เบ„เบญเบšเบ„เบปเบง Linux เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ X Window System (เปƒเบ™ Fedora 25, "X's" เบ–เบทเบเบ›เปˆเบฝเบ™เป€เบ›เบฑเบ™ Wayland), "X's" เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบฅเบฐเบ”เบฑเบšเบชเบนเบ‡เบชเบธเบ”เปเบฅเบฐเบซเบ™เบน / เปเบ›เป‰เบ™เบžเบดเบก. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบ‚เบญเบ‡เบ›เบธเปˆเบก, เบเปˆเบญเบ‡เบฅเบฒเบเบŠเบทเปˆ, เปเบฅเบฐเบญเบทเปˆเบ™เป†, เบกเบตเป€เบ—เบเป‚เบ™เป‚เบฅเบเบต AT-SPI. เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเบ—เบตเปˆเบ™เบดเบเบปเบกเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เบกเบตเบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ daemon registry AT-SPI, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡ GUI เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเปเบฒเบฅเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ (เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ Qt เปเบฅเบฐ GTK เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™).

เป€เบ„เบทเปˆเบญเบ‡เบกเบท: pyatspi2.

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, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆ ATOMac, aka pyatom. เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบเบฒเบ™โ€‹เป‚เบ•เป‰โ€‹เบ•เบญเบšโ€‹เบ—เบตเปˆโ€‹เป€เบซเบกเบฒเบฐโ€‹เบชเบปเบกโ€‹เบเบฑเบš LDTPโ€‹, เปเบ•เปˆโ€‹เบเบฑเบ‡โ€‹เป€เบ›เบฑเบ™โ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ” standaloneโ€‹. เบกเบฑเบ™โ€‹เบกเบต เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ iTunes เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ macOs, เบ‚เบฝเบ™เป‚เบ”เบเบ™เบฑเบเบฎเบฝเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ. เบกเบตเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบ: เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ (เบงเบดเบ—เบตเบเบฒเบ™ waitFor*). เปเบ•เปˆเป‚เบ”เบเบฅเบงเบก, เบšเปเปˆเปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบšเปเปˆเบ”เบต.

เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ pywinauto

เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เปเบ‚เบ™โ€‹เบ•เบปเบงโ€‹เบ—เปˆเบฒเบ™โ€‹เป€เบญเบ‡โ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เบเบงเบ”โ€‹เบเบฒโ€‹เบงเบฑเบ”โ€‹เบ–เบธ GUI (เบญเบฑเบ™โ€‹เบ—เบตเปˆโ€‹เป€เบญเบตเป‰เบ™โ€‹เบงเปˆเบฒโ€‹เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบท Spyโ€‹)โ€‹. เบกเบฑเบ™เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบถเบเบชเบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบˆเบฒเบเบžเบฒเบเปƒเบ™: เบงเบดเบ—เบตเบเบฒเบ™เบฅเปเบฒเบ”เบฑเบšเบŠเบฑเป‰เบ™เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ”เปเบ”เปˆ. เบœเบนเป‰เบเบงเบ”เบเบฒเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เบ—เบตเปˆเบชเบธเบ”:

  • spy++ - เบฅเบงเบกเบเบฑเบš Visual Studio, เบฅเบงเบกเบ—เบฑเบ‡ Express เบซเบผเบท Community Edition. เปƒเบŠเป‰ Win32 API. clone เบฅเบฒเบงเบเบฑเบ‡เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบ AutoIt Window เบ‚เปเป‰เบกเบนเบ™.
  • Inspect.exe - เบฅเบงเบกเบขเบนเปˆเปƒเบ™ Windows SDK. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบ—เปˆเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เบกเบฑเบ™โ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เปƒเบ™ Windows 64-bit เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹เบกเบฑเบ™โ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เป‚เบŸเบ™โ€‹เป€เบ”เบตโ€‹ C:Program Files (x86)Windows Kits<winver>binx64. เปƒเบ™เบ•เบปเบงเบเบงเบ”เบเบฒเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบฎเบนเบšเปเบšเบš UI เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” เปเบ—เบ™ MS AA (Active Accessibility, เบšเบฑเบ™เบžเบฐเบšเบธเบฅเบธเบ”เบ‚เบญเบ‡ UI Automation).

เบกเบตเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป‚เบ”เบเบœเปˆเบฒเบ™เปเบฅเบฐเป‚เบ”เบเบœเปˆเบฒเบ™เบเบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบ backend เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰. เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบฅเบฐเบšเบธเบŠเบทเปˆเบ‚เบญเบ‡ backend เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.

  • backend=โ€win32โ€ณ โ€” เปƒเบ™โ€‹เบ‚เบฐโ€‹เบ™เบฐโ€‹เบ—เบตเปˆโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เป€เบ›เบฑเบ™โ€‹เบ„เปˆเบฒโ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™โ€‹, เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เป„เบ”เป‰โ€‹เบ”เบตโ€‹เบเบฑเบš MFCโ€‹, WTLโ€‹, VB6 เปเบฅเบฐโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เป€เบเบปเปˆเบฒโ€‹เบญเบทเปˆเบ™เป†โ€‹.
  • backend=โ€uiaโ€ - backend เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบš MS UI เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”: เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™เบเบฑเบš WPF เปเบฅเบฐ WinForms; เบเบฑเบ‡เบ”เบตเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Delphi เปเบฅเบฐ Windows Store; เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Qt5 เปเบฅเบฐเบšเบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Java. เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบ–เป‰เบฒ Inspect.exe เป€เบซเบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบฅเบฐเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ backend เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบก. เปƒเบ™เบซเบผเบฑเบเบเบฒเบ™, เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบชเปˆเบงเบ™เปƒเบซเบเปˆเบเบฑเบ‡เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ UI Automation (Mozilla เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบฅเบฐ Chrome เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เป‰เบญเบ™เบฅเบฐเบซเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. --force-renderer-accessibilityเป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™เบซเบ™เป‰เบฒเบ•เปˆเบฒเบ‡เป†เปƒเบ™ Inspect.exe). เปเบ™เปˆเบ™เบญเบ™, เบเบฒเบ™เปเบ‚เปˆเบ‡เบ‚เบฑเบ™เบเบฑเบš Selenium เปƒเบ™เบ‚เบปเบ‡เป€เบ‚เบ”เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบ„เปˆเบญเบเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰. เบžเบฝเบ‡เปเบ•เปˆเบงเบดเบ—เบตเบญเบทเปˆเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš (เบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ‚เป‰เบฒเบกเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™).

เบˆเบธเบ”เป€เบ‚เบปเป‰เบฒเบชเปเบฒเบฅเบฑเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰เบ–เบทเบเบ„เบปเป‰เบ™เบ„เป‰เบงเบฒเบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡. เบกเบฑเบ™เป€เบ–เบดเบ‡เป€เบงเบฅเบฒเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡ Application object เปเบฅเบฐเปเบฅเปˆเบ™เบกเบฑเบ™เบซเบผเบทเบ•เบดเบ”เบเบฑเบšเบญเบฑเบ™เบ—เบตเปˆเปเบฅเปˆเบ™เปเบฅเป‰เบง. เบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ clone เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™ 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. เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เบญเบทเปˆเบ™เบ•เบปเบเบขเบนเปˆเปƒเบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ” "specification->wrapper" เบขเปˆเบฒเบ‡เป‚เบ›เปˆเบ‡เปƒเบช, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบ•เปเปˆเบกเบฒ.

เบ‚เปเป‰เบกเบนเบ™เบชเบฐเป€เบžเบฒเบฐเปœเป‰เบฒเบ•เปˆเบฒเบ‡/เบญเบปเบ‡เบ›เบฐเบเบญเบš

เบ™เบตเป‰เปเบกเปˆเบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบซเบผเบฑเบเบ—เบตเปˆเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš 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(). เบกเบฑเบ™เบชเบปเปˆเบ‡เบ„เบทเบ™ "wrapper" เบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบชเปเบฒเบฅเบฑเบšเบ›เปˆเบญเบ‡เบขเป‰เบฝเบก / เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบซเบผเบทเบ–เบดเป‰เบก ElementNotFoundError (เบšเบฒเบ‡เบ„เบฑเป‰เบ‡ ElementAmbiguousError, เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เป„เบ”เป‰เบ–เบทเบเบžเบปเบšเป€เบซเบฑเบ™, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบตเป‰เปเบˆเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบเบฒเบ™เบŠเบญเบเบซเบฒ). "wrapper" เบ™เบตเป‰เบฎเบนเป‰เปเบฅเป‰เบงเบงเบดเบ—เบตเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบซเบผเบทเบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบกเบฑเบ™.

Python เบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบ‡เบเบฒเบ™เป‚เบ—เป„เบ”เป‰ .wrapper_object(), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบฅเบฐเบซเบฑเบ”เบชเบธเบ”เบ—เป‰เบฒเบเบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบชเบฑเป‰เบ™. เบžเบงเบเป€เบฎเบปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰เบกเบฑเบ™เป€เบžเบทเปˆเบญเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡ debugging เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบชเบญเบ‡เปเบ–เบงเบ•เปเปˆเป„เบ›เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™เปเบ—เป‰:

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')

เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆ pywinauto.findwindows.find_elements(โ€ฆ).

magic เบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป‚เบ”เบเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเปเบฅเบฐเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™

Python เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบ‡เปˆเบฒเบเบ•เปเปˆเบเบฒเบ™เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบ›เปˆเบญเบ‡เบขเป‰เบฝเบกเปเบฅเบฐเบฎเบฑเบšเบฎเบนเป‰เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง (เบžเบฒเบเปƒเบ™, เบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™ overridden. __getattribute__). เปเบ™เปˆเบ™เบญเบ™, เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ”เบฝเบงเบเบฑเบ™เปเบกเปˆเบ™เบ–เบทเบเบšเบฑเบ‡เบ„เบฑเบšเปƒเบชเปˆเบŠเบทเปˆเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบŠเบทเปˆเบ‚เบญเบ‡เบ•เบปเบงเปเบ›เปƒเบ”เป† (เบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบชเปˆเบเบฐเบซเบงเปˆเบฒเบ‡, เป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบˆเบธเบ”, เบซเบผเบทเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบžเบดเป€เบชเบ”เบญเบทเปˆเบ™เป†). เป‚เบŠเบเบ”เบต, pywinauto เปƒเบŠเป‰เบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ "เบเบฒเบ™เบˆเบฑเบšเบ„เบนเปˆเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”" algorithm เบ„เบปเป‰เบ™เบซเบฒเบ—เบตเปˆเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบเบฒเบ™เบžเบดเบกเบœเบดเบ”เปเบฅเบฐเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ.

app.UntitledNotepad
# ั‚ะพ ะถะต ัะฐะผะพะต, ั‡ั‚ะพ
app.window(best_match='UntitledNotepad')

เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบเบฑเบ‡โ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™ Unicode strings (เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบเบปเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹, เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบžเบฒโ€‹เบชเบฒโ€‹เบฅเบฑเบ”โ€‹เป€เบŠเบโ€‹)โ€‹, เบเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹, เปเบฅเบฐโ€‹เบญเบทเปˆเบ™เป†โ€‹, เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบ‚เบปเป‰เบฒโ€‹เป€เบ–เบดเบ‡โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบชเปเบฒโ€‹เบ„เบฑเบ™ (เป€เบŠเบฑเปˆเบ™โ€‹เบงเปˆเบฒโ€‹เบกเบฑเบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบˆเบฐโ€‹เบ™เบฒโ€‹เบ™เบธโ€‹เบเบปเบกโ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹)โ€‹:

app['Untitled - Notepad']
# ั‚ะพ ะถะต ัะฐะผะพะต, ั‡ั‚ะพ
app.window(best_match='Untitled - Notepad')

เบซเป‰เบฒเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบšเบŠเบทเปˆ magical

เบงเบดเบ—เบตเบเบฒเบ™เบŠเบญเบเบซเบฒเบŠเบทเปˆ magic เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™? เบœเบนเป‰เบ—เบตเปˆเบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบšเบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ„เบปเป‰เบ™เบซเบฒ. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบฅเบฐเบšเบธเบŠเบทเปˆเบ—เบตเปˆเบžเบฝเบ‡เบžเปเบเบฑเบšเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเบฐเบžเบปเบšเป€เบซเบฑเบ™.

  1. เป‚เบ”เบเบซเบปเบงเบ‚เปเป‰ (เบ‚เปเป‰เบ„เบงเบฒเบก, เบŠเบทเปˆ): app.Properties.OK.click()
  2. เป‚เบ”เบเบ‚เปเป‰เบ„เบงเบฒเบก เปเบฅเบฐเบ•เบฒเบกเบ›เบฐเป€เบžเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบš: app.Properties.OKButton.click()
  3. เป‚เบ”เบโ€‹เบ›เบฐโ€‹เป€เบžเบ”โ€‹เปเบฅเบฐโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹: app.Properties.Button3.click() (เบŠเบทเปˆ Button0 ะธ Button1 เบœเบนเบเบกเบฑเบ”เบเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™, Button2 - เบ—เบตเบชเบญเบ‡, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡ - เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”)
  4. เป‚เบ”เบเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเบ–เบดเบ” (เบŠเป‰เบฒเบ เบซเบผเบท เป€เบ—เบดเบ‡) เปเบฅเบฐเบ•เบฒเบกเบ›เบฐเป€เบžเบ”: app.OpenDialog.FileNameEdit.set_text("") (เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบกเปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง)
  5. เป‚เบ”เบเบ›เบฐเป€เบžเบ”เปเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบžเบฒเบเปƒเบ™: app.Properties.TabControlSharing.select("General")

เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบชเบญเบ‡เบซเบผเบทเบชเบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบšเปเปˆเบ„เปˆเบญเบเบซเบผเบฒเบ. เป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบŠเบทเปˆเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบ—เบตเปˆเบกเบตเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบš, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ print_control_identifiers(). เบกเบฑเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบžเบดเบกโ€‹เบ•เบปเป‰เบ™โ€‹เป„เบกเป‰โ€‹เบ‚เบญเบ‡โ€‹เบญเบปเบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบ—เบฑเบ‡โ€‹เปƒเบ™โ€‹เบซเบ™เป‰เบฒโ€‹เบˆเปโ€‹เปเบฅเบฐโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹. เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบš, เบŠเบทเปˆ magic เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เบ–เบทเบเบžเบดเบกเบญเบญเบ. เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ„เบฑเบ”เบฅเบญเบเปเบฅเบฐเบงเบฒเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เป€เบ”เบฑเบเบ™เป‰เบญเบเบˆเบฒเบเบšเปˆเบญเบ™เบ™เบฑเป‰เบ™. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบชเบฐเบ„เบดเบšเบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

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.

เบ•เบปเบงเบขเปˆเบฒเบ‡

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบ•เบตเบกเป€เบ•เบฑเบกเบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡ เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เปƒเบ™ repository. เปƒเบ™เบšเบฑเบ™เบ”เบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเป€เบ„เบทเบญเบ‚เปˆเบฒเบ WireShark (เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบ”เบตเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Qt5; เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบงเบฝเบเบ‡เบฒเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบกเบต GUI, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบต. scapy.Sniffer เบˆเบฒเบเบŠเบธเบ” Python เบ‚เบตเป‰เบเบฐเป€เบ”เบทเบญเบ™). เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡ MS Paint เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ—เบตเปˆเบกเบตเปเบ–เบšเป€เบ„เบทเปˆเบญเบ‡เบกเบท Ribbon เบ‚เบญเบ‡เบกเบฑเบ™.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆเบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡เบ—เบตเปˆเบ‚เบฝเบ™เป‚เบ”เบเบ™เบฑเบเบฎเบฝเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ: เบฅเบฒเบเป„เบŸเบฅเปŒเบˆเบฒเบ explorer.exe เป„เบ›เปƒเบชเปˆเปœเป‰เบฒ Chrome เบชเปเบฒเบฅเบฑเบš Google Drive (เบกเบฑเบ™เบˆเบฐเบเป‰เบฒเบเป„เบ›เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบซเบผเบฑเบเปƒเบ™เป€เบงเบฅเบฒเบ•เปเปˆเบกเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบ).

เปเบฅเบฐ, เปเบ™เปˆเบ™เบญเบ™, เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเปเบฑเบเปƒเบŠเป‰เปเบ›เป‰เบ™เบžเบดเบก (เบ›เบธเปˆเบกเบฎเป‰เบญเบ™) เปเบฅเบฐเป€เบซเบ”เบเบฒเบ™เป€เบกเบปเบฒเบชเปŒ:
hook_and_listen.py.

เบ‚เบญเบšเปƒเบˆ

เบ‚เบญเบšเปƒเบˆเป€เบ›เบฑเบ™เบžเบดเป€เบชเบ”เบ•เปเปˆเบœเบนเป‰เบ—เบตเปˆเบŠเปˆเบงเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ„เบ‡เบเบฒเบ™เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡. เบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเปเบฅเบฐ Valentine เบ™เบตเป‰เปเบกเปˆเบ™เบงเบฝเบเบญเบฐเบ”เบดเป€เบฅเบเบ–เบฒเบงเบญเบ™. เบ™เบฑเบเบชเบถเบเบชเบฒเบชเบญเบ‡เบ„เบปเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเบˆเบฒเบ UNN เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เป„เบ”เป‰เบ›เป‰เบญเบ‡เบเบฑเบ™เบฅเบฐเบ”เบฑเบšเบ›เบฐเบฅเบดเบ™เบเบฒเบ•เบตเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ™เบตเป‰. Alexander เป„เบ”เป‰เบ›เบฐเบเบญเบšเบชเปˆเบงเบ™เบญเบฑเบ™เปƒเบซเบเปˆเบซเบผเบงเบ‡เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ MS UI Automation เปเบฅเบฐเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบซเบผเบฑเบเบเบฒเบ™ "เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบซเบผเบดเป‰เบ™" เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เปเป‰เบ„เบงเบฒเบก (เบ™เบตเป‰เปเบกเปˆเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™เบ—เบตเปˆเบชเบธเบ”), เบกเบฒเบฎเบญเบ”เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบš backend "uia" เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. Ivan เบเปเบฒเบฅเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒ backend เปƒเบซเบกเปˆเบชเปเบฒเบฅเบฑเบš Linux เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ AT-SPI (เป‚เบกเบ”เบนเบ™ mouse ะธ keyboard เบญเบตเบ‡ python-xlib - เปเบฅเป‰เบงเปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบ 0.6.x).

เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบ‚เป‰เบญเบเป„เบ”เป‰เบชเบญเบ™เบซเบผเบฑเบเบชเบนเบ”เบžเบดเป€เบชเบ”เบเปˆเบฝเบงเบเบฑเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ Python เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™, เบ™เบฑเบเบฎเบฝเบ™เบ›เบฐเบฅเบดเบ™เบเบฒเป‚เบ—เบšเบฒเบ‡เบ„เบปเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบšเป‰เบฒเบ™, เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฑเบเบชเบฐเบ™เบฐเบ™เป‰เบญเบเป†เบซเบผเบทเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบšเบฒเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆ เบชเบณ เบ„เบฑเบ™เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบ„เบปเป‰เบ™เบ„เบงเป‰เบฒเบเปเปˆเป„เบ”เป‰เบ–เบทเบเบ„เบปเป‰เบ™เบžเบปเบšเป‚เบ”เบเบ™เบฑเบเบฎเบฝเบ™. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฒเบกเบขเปˆเบฒเบ‡เป€เบ‚เบฑเป‰เบกเบ‡เบงเบ”เบเปˆเบฝเบงเบเบฑเบšเบ„เบธเบ™เบ™เบฐเบžเบฒเบšเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”. เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบšเบšเบ„เบปเบ‡เบ—เบตเปˆ (QuantifiedCode, Codacy เปเบฅเบฐเบžเบนเบกเบชเบฑเบ™เบ–เบฒเบ™) เปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™เป€เบกเบ„ (เบšเปเบฅเบดเบเบฒเบ™ AppVeyor) เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบฅเบฐเบซเบฑเบ”เบ›เบฐเบกเบฒเบ™ 95% เบŠเปˆเบงเบเบซเบผเบฒเบเปƒเบ™เป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เบญเบšเปƒเบˆเบ—เบธเบเบ„เบปเบ™เบ—เบตเปˆเบญเบญเบเบ„เปเบฒเบ„เบดเบ”เป€เบซเบฑเบ™, เบชเป‰เบฒเบ‡เบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบถเบ‡!

เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก

เบžเบงเบเป€เบฎเบปเบฒเบ•เบดเบ”เบ•เบฒเบกเบ„เปเบฒเบ–เบฒเบก tag เปƒเบ™ StackOverflow (เบšเปเปˆโ€‹เบ”เบปเบ™โ€‹เบกเบฒโ€‹เบ™เบตเป‰โ€‹ tag เปƒเบ™เบชเบฐเบšเบฑเบšเบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบเบ‚เบญเบ‡ SO) เปเบฅเบฐ เป‚เบ”เบเบ„เปเบฒเบชเปเบฒเบ„เบฑเบ™เปƒเบ™ Toaster. เบกเบต เบชเบปเบ™เบ—เบฐเบ™เบฒเบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบเปƒเบ™ Gitter.

เบžเบงเบเป€เบฎเบปเบฒเบญเบฑเบšเป€เบ”เบ”เบ—เบธเบเป†เป€เบ”เบทเบญเบ™ เบเบฒเบ™เบˆเบฑเบ”เบญเบฑเบ™เบ”เบฑเบšเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” open-source เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš GUI. เปƒเบ™เปเบ‡เปˆเบ‚เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบ”เบฒเบงเปƒเบ™ GitHub, เบกเบตเบžเบฝเบ‡เปเบ•เปˆ Autohotkey (เบžเบงเบเป€เบ‚เบปเบฒเบกเบตเบŠเบธเบกเบŠเบปเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเปเบฅเบฐเบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”เบญเบฑเบ™เบเบฒเบงเบ™เบฒเบ™) เปเบฅเบฐ PyAutoGUI เบเปเบฒเบฅเบฑเบ‡เป€เบ•เบตเบšเป‚เบ•เป„เบงเบ‚เบถเป‰เบ™ (เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบเป‰เบญเบ™เบ„เบงเบฒเบกเบ™เบดเบเบปเบกเบ‚เบญเบ‡เบซเบ™เบฑเบ‡เบชเบทเป‚เบ”เบเบœเบนเป‰เบ‚เบฝเบ™ Al Sweigart: "เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเป€เบšเบทเปˆเบญเบเบฑเบš. Pythonโ€ เปเบฅเบฐเบญเบทเปˆเบ™เป†).

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster