แƒ“แƒ”แƒกแƒ™แƒขแƒแƒžแƒ˜แƒก GUI-แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ Python + pywinauto-แƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒฃแƒ›แƒ”แƒ’แƒแƒ‘แƒ แƒ“แƒ”แƒ— MS UI Automation-แƒก

แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒžแƒ˜แƒ•แƒ˜แƒœแƒแƒ•แƒขแƒ โ€” ัั‚ะพ open source ะฟั€ะพะตะบั‚ ะฟะพ ะฐะฒั‚ะพะผะฐั‚ะธะทะฐั†ะธะธ ะดะตัะบั‚ะพะฟะฝั‹ั… GUI ะฟั€ะธะปะพะถะตะฝะธะน ะฝะฐ Windows. ะ—ะฐ ะฟะพัะปะตะดะฝะธะต ะดะฒะฐ ะณะพะดะฐ ะฒ ะฝะตะน ะฟะพัะฒะธะปะธััŒ ะฝะพะฒั‹ะต ะบั€ัƒะฟะฝั‹ะต ั„ะธั‡ะธ:

  • ะŸะพะดะดะตั€ะถะบะฐ ั‚ะตั…ะฝะพะปะพะณะธะธ MS UI Automation. ะ˜ะฝั‚ะตั€ั„ะตะนั ะฟั€ะตะถะฝะธะน, ะธ ั‚ะตะฟะตั€ัŒ ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั: WinForms, WPF, Qt5, Windows Store (UWP) ะธ ั‚ะฐะบ ะดะฐะปะตะต โ€” ะฟะพั‡ั‚ะธ ะฒัะต, ั‡ั‚ะพ ะตัั‚ัŒ ะฝะฐ Windows.
  • backends/plugins-แƒ˜แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ (แƒแƒ›แƒŸแƒแƒ›แƒแƒ“ แƒแƒ แƒ˜แƒก แƒแƒ แƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœแƒ˜ แƒฅแƒฃแƒ“แƒ˜แƒก แƒฅแƒ•แƒ”แƒจ: แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ "win32" แƒ“แƒ แƒแƒฎแƒแƒšแƒ˜ "uia"). แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒฃแƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒšแƒแƒ“ แƒ›แƒ˜แƒ•แƒ“แƒ˜แƒ•แƒแƒ แƒ— แƒ™แƒ แƒแƒก-แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒแƒ–แƒ”.
  • Win32 แƒ™แƒแƒ™แƒ•แƒ”แƒ‘แƒ˜ แƒ›แƒแƒฃแƒกแƒ˜แƒกแƒ แƒ“แƒ แƒ™แƒšแƒแƒ•แƒ˜แƒแƒขแƒฃแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒชแƒฎแƒ”แƒšแƒ˜ แƒ™แƒšแƒแƒ•แƒ˜แƒจแƒ”แƒ‘แƒ˜ pyHook-แƒ˜แƒก แƒกแƒฃแƒšแƒ˜แƒกแƒ™แƒ•แƒ”แƒ—แƒ”แƒ‘แƒ˜แƒ—).

แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒ˜แƒ•แƒชแƒ”แƒ›แƒ— แƒ›แƒแƒ™แƒšแƒ” แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒแƒก, แƒ—แƒฃ แƒ แƒ แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ“แƒ”แƒกแƒ™แƒขแƒแƒžแƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒแƒจแƒ˜ (แƒกแƒ”แƒ แƒ˜แƒแƒ–แƒฃแƒšแƒ˜ แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”).

แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒแƒ แƒ˜แƒก แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ แƒ›แƒ˜แƒœแƒกแƒ™แƒจแƒ˜ SQA Days 20 แƒ™แƒแƒœแƒคแƒ”แƒ แƒ”แƒœแƒชแƒ˜แƒ˜แƒ“แƒแƒœ (แƒ•แƒ˜แƒ“แƒ”แƒแƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜ ะธ แƒกแƒšแƒแƒ˜แƒ“แƒ”แƒ‘แƒ˜), แƒœแƒแƒฌแƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ• แƒ แƒฃแƒกแƒฃแƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ แƒœแƒแƒชแƒœแƒแƒ‘แƒแƒ‘แƒ แƒ’แƒ–แƒแƒ›แƒ™แƒ•แƒšแƒ”แƒ•แƒ˜ แƒžแƒ˜แƒ•แƒ˜แƒœแƒแƒ•แƒขแƒแƒกแƒ—แƒ•แƒ˜แƒก.

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒแƒ› แƒกแƒคแƒ”แƒ แƒแƒจแƒ˜ แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒแƒก แƒ›แƒแƒ™แƒšแƒ” แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ˜แƒ—. แƒ“แƒ”แƒกแƒ™แƒขแƒแƒžแƒ˜แƒก GUI แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒฌแƒ˜แƒšแƒแƒ“ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜แƒ, แƒ•แƒ˜แƒ“แƒ แƒ” แƒ•แƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒแƒฅแƒ•แƒก แƒกแƒ”แƒšแƒ”แƒœแƒ˜. แƒแƒฅ แƒแƒ แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ”แƒ‘แƒ˜:

แƒ™แƒแƒแƒ แƒ“แƒ˜แƒœแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜

แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒฅแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒงแƒแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ, แƒฉแƒ•แƒ”แƒœ แƒ˜แƒ›แƒ”แƒ“แƒ˜ แƒ’แƒ•แƒแƒฅแƒ•แƒก, แƒ แƒแƒ› แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.
[+] แƒฏแƒ•แƒแƒ แƒ”แƒ“แƒ˜แƒœแƒ˜ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ, แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ.
[+] แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก โ€žแƒฉแƒแƒฌแƒ”แƒ แƒ-แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒโ€œ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ.
[-] แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒแƒ แƒแƒกแƒขแƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒ˜แƒ แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒ’แƒแƒ แƒฉแƒ”แƒ•แƒแƒ“แƒแƒ‘แƒ˜แƒก, แƒ—แƒ”แƒ›แƒ˜แƒก, แƒจแƒ แƒ˜แƒคแƒขแƒ”แƒ‘แƒ˜แƒก, แƒคแƒแƒœแƒฏแƒ แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ˜แƒก แƒ“แƒ แƒ.แƒจ.
[-] แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒฃแƒ–แƒแƒ แƒ›แƒแƒ–แƒแƒ แƒ˜ แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ; แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒฃแƒคแƒ แƒ แƒแƒ“แƒ•แƒ˜แƒšแƒ˜แƒ แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒก แƒ แƒ”แƒ’แƒ”แƒœแƒ”แƒ แƒแƒชแƒ˜แƒ แƒœแƒฃแƒšแƒ˜แƒ“แƒแƒœ แƒแƒœ แƒฎแƒ”แƒšแƒ˜แƒ— แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ.
[-] แƒแƒฎแƒ“แƒ”แƒœแƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒแƒก; แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒแƒฆแƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜.

แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ (แƒฏแƒ•แƒแƒ แƒ”แƒ“แƒ˜แƒœแƒ˜ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ): แƒแƒ•แƒขแƒแƒžแƒ˜แƒ, PyAutoGUI, PyUserInput แƒ“แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒฎแƒ•แƒ. แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ”แƒ‘แƒ˜ แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒแƒก (แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒฏแƒ•แƒแƒ แƒ”แƒ“แƒ˜แƒœแƒ˜ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ).

แƒแƒฆแƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜แƒ, แƒ แƒแƒ› แƒ™แƒแƒแƒ แƒ“แƒ˜แƒœแƒแƒขแƒ—แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒแƒ•แƒกแƒแƒก แƒกแƒฎแƒ•แƒ แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ”แƒ‘แƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒแƒ— แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ™แƒแƒแƒ แƒ“แƒ˜แƒœแƒแƒขแƒ”แƒ‘แƒ–แƒ” (แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก/แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ–แƒ”แƒ“แƒ แƒ›แƒแƒ แƒชแƒฎแƒ”แƒœแƒ แƒ™แƒฃแƒ—แƒฎแƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒแƒ แƒ แƒ›แƒ—แƒ”แƒš แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ”) - แƒ”แƒก แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒแƒ, แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ—แƒฃ แƒ’แƒแƒ•แƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ— แƒกแƒ˜แƒ’แƒ แƒซแƒ”แƒก/แƒกแƒ˜แƒ’แƒแƒœแƒ”แƒก. แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ (แƒ›แƒแƒจแƒ˜แƒœ แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ’แƒแƒ แƒฉแƒ”แƒ•แƒแƒ“แƒแƒ‘แƒ แƒแƒ  แƒ“แƒแƒแƒ–แƒแƒ แƒแƒšแƒ”แƒ‘แƒก).

แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜: แƒ’แƒแƒ›แƒแƒงแƒแƒ•แƒ˜แƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒกแƒขแƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒ— แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒแƒ แƒ แƒฏแƒ•แƒแƒ แƒ”แƒ“แƒ˜แƒœแƒ˜ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ”แƒก แƒ™แƒแƒ แƒ’แƒ˜แƒ).

แƒกแƒแƒชแƒœแƒแƒ‘แƒแƒ แƒ แƒกแƒฃแƒ แƒแƒ—แƒ˜แƒก แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ

[+] แƒฏแƒ•แƒแƒ แƒ”แƒ“แƒ˜แƒœแƒ˜ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ
[+-] แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ (แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜ แƒ•แƒ˜แƒ“แƒ แƒ” แƒ™แƒแƒแƒ แƒ“แƒ˜แƒœแƒแƒขแƒ—แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜), แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ˜แƒœแƒช แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒฎแƒ แƒ˜แƒ™แƒ”แƒ‘แƒก.
[-+] แƒจแƒ”แƒ“แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒœแƒ”แƒšแƒ˜, แƒ˜แƒ›แƒ˜แƒขแƒแƒ› แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก CPU แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒก แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ˜แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.
[-] แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ (OCR), แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒ’แƒแƒ›แƒแƒ แƒ˜แƒชแƒฎแƒฃแƒšแƒ˜แƒ => แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ. แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“แƒแƒช แƒ›แƒ” แƒ•แƒ˜แƒชแƒ˜, แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ OCR แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒกแƒแƒœแƒ“แƒ แƒแƒ› แƒขแƒ˜แƒžแƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒคแƒแƒ แƒ—แƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ (แƒ›แƒแƒ’แƒ”แƒกแƒแƒšแƒ›แƒ”แƒ‘แƒ˜แƒ— แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒจแƒ˜, แƒ—แƒฃ แƒ”แƒก แƒฃแƒ™แƒ•แƒ” แƒแƒกแƒ” แƒแƒ  แƒแƒ แƒ˜แƒก).

แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: แƒกแƒ˜แƒ™แƒฃแƒšแƒ˜, แƒšแƒ”แƒ™แƒ˜ (Sikuli-แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜, แƒกแƒฃแƒคแƒ—แƒ แƒžแƒ˜แƒ—แƒแƒœแƒ˜), PyAutoGUI.

แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒแƒ‘แƒ˜แƒก แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ

[+] แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒแƒซแƒ”แƒ‘แƒœแƒแƒ— แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—, แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒแƒ แƒ˜แƒก แƒ˜แƒ’แƒ˜ แƒ’แƒแƒ“แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒแƒœ แƒฉแƒแƒ แƒฉแƒแƒก แƒ›แƒ˜แƒ”แƒ .
[+] แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒแƒ›แƒแƒ˜แƒฆแƒแƒ— แƒขแƒ”แƒฅแƒกแƒขแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ => แƒฃแƒคแƒ แƒ แƒแƒ“แƒ•แƒ˜แƒšแƒ˜แƒ แƒขแƒ”แƒกแƒขแƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ.
[+] แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒกแƒฌแƒ แƒแƒคแƒ˜, แƒ˜แƒ›แƒ˜แƒขแƒแƒ› แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒแƒ  แƒ›แƒแƒ˜แƒฎแƒ›แƒแƒ แƒก CPU แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒก.
[-] ะขัะถะตะปะพ ัะดะตะปะฐั‚ัŒ ะบั€ะพัั-ะฟะปะฐั‚ั„ะพั€ะผะตะฝะฝั‹ะน ะธะฝัั‚ั€ัƒะผะตะฝั‚: ะฐะฑัะพะปัŽั‚ะฝะพ ะฒัะต open-source ะฑะธะฑะปะธะพั‚ะตะบะธ ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ ะพะดะฝัƒ-ะดะฒะต accessibility ั‚ะตั…ะฝะพะปะพะณะธะธ. Windows/Linux/MacOS ั†ะตะปะธะบะพะผ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฝะธะบั‚ะพ, ะบั€ะพะผะต ะฟะปะฐั‚ะฝั‹ั… ั‚ะธะฟะฐ TestComplete, UFT ะธะปะธ Squish.
[-] แƒแƒกแƒ”แƒ—แƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒจแƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ VirtualBox-แƒจแƒ˜ - แƒ”แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒกแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ‘แƒ”แƒ•แƒ  แƒ™แƒšแƒแƒกแƒ˜แƒ™แƒฃแƒ  แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ“แƒ’แƒแƒ›แƒ แƒ™แƒ•แƒšแƒแƒ• แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ. แƒ”แƒก แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒจแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒฃแƒšแƒ˜.

แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: TestStack.White C#-แƒจแƒ˜, Winium.Desktop C#-แƒจแƒ˜ (แƒกแƒ”แƒšแƒ”แƒœแƒ˜ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜), MS WinApp แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ˜ C#-แƒจแƒ˜ (Appium แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜), แƒžแƒ˜แƒ•แƒ˜แƒœแƒแƒ•แƒขแƒ, แƒžแƒ˜แƒแƒขแƒแƒ›แƒ˜ (LDTP แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜) Python-UIAutomation-for-Windows, แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ แƒฃแƒ‘แƒ˜แƒจแƒ˜, LDTP (Linux Desktop Testing Project) ะธ ะตะณะพ Windows แƒ•แƒ”แƒ แƒกแƒ˜แƒ Cobra.

LDTP แƒแƒ แƒ˜แƒก แƒแƒšแƒ‘แƒแƒ— แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒแƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ (แƒฃแƒคแƒ แƒ แƒ–แƒฃแƒกแƒขแƒแƒ“, แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜แƒก แƒแƒฏแƒแƒฎแƒ˜), แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒแƒ‘แƒ˜แƒก แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ”แƒ‘แƒ–แƒ”. แƒ—แƒฃแƒ›แƒชแƒ, แƒ˜แƒก แƒแƒ แƒช แƒ—แƒฃ แƒ˜แƒกแƒ” แƒžแƒแƒžแƒฃแƒšแƒแƒ แƒฃแƒšแƒ˜แƒ. แƒ›แƒ” แƒ—แƒ•แƒ˜แƒ—แƒแƒœ แƒแƒ  แƒ’แƒแƒ›แƒแƒ›แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—, แƒ›แƒ˜แƒกแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ’แƒแƒฅแƒ•แƒ— แƒ“แƒแƒ“แƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ’แƒแƒ›แƒแƒฎแƒ›แƒแƒฃแƒ แƒ”แƒ‘แƒ, แƒ’แƒ—แƒฎแƒแƒ•แƒ— แƒ’แƒแƒแƒ–แƒ˜แƒแƒ แƒแƒ— แƒ˜แƒ’แƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒจแƒ˜.

แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒฃแƒ™แƒแƒœแƒ แƒ™แƒแƒ แƒ˜ (แƒแƒœแƒฃ แƒจแƒ˜แƒ“แƒ แƒ•แƒ”แƒšแƒแƒกแƒ˜แƒžแƒ”แƒ“แƒ˜)

แƒ™แƒ แƒแƒก-แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ—แƒแƒ•แƒแƒ“ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒฅแƒ›แƒœแƒ˜แƒแƒœ แƒจแƒ˜แƒ“แƒ แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒก แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒจแƒ˜ แƒฅแƒ›แƒœแƒ˜แƒแƒœ แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก TCP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก, แƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ˜แƒแƒœ แƒ›แƒแƒก แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒฃแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒแƒœ แƒขแƒ”แƒฅแƒกแƒขแƒฃแƒ  แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒก: แƒ แƒแƒ–แƒ” แƒ“แƒแƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒแƒ—, แƒกแƒแƒ“ แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ.แƒจ. แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒ แƒฃแƒœแƒ˜แƒ•แƒ”แƒ แƒกแƒแƒšแƒฃแƒ แƒ˜.

แƒ“แƒ”แƒกแƒ™แƒขแƒแƒžแƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒแƒ‘แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ”แƒ‘แƒ˜

แƒซแƒ•แƒ”แƒšแƒ˜ แƒ™แƒแƒ แƒ’แƒ˜ Win32 API

แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” Windows ะฟั€ะธะปะพะถะตะฝะธะน, ะฝะฐะฟะธัะฐะฝะฝั‹ั… ะดะพ ะฒั‹ั…ะพะดะฐ WPF ะธ ะทะฐั‚ะตะผ Windows Store, ะฟะพัั‚ั€ะพะตะฝั‹ ั‚ะฐะบ ะธะปะธ ะธะฝะฐั‡ะต ะฝะฐ Win32 API. ะ ะธะผะตะฝะฝะพ, MFC, WTL, C++ Builder, Delphi, VB6 โ€” ะฒัะต ัั‚ะธ ะธะฝัั‚ั€ัƒะผะตะฝั‚ั‹ ะธัะฟะพะปัŒะทัƒัŽั‚ Win32 API. ะ”ะฐะถะต Windows Forms โ€” ะฒ ะทะฝะฐั‡ะธั‚ะตะปัŒะฝะพะน ัั‚ะตะฟะตะฝะธ Win32 API ัะพะฒะผะตัั‚ะธะผั‹ะต.

แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: แƒกแƒแƒฎแƒฃแƒ แƒแƒ•แƒ–แƒ” (แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ VB) แƒ“แƒ Python wrapper pyautoit, AutoHotkey (แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ”แƒœแƒ, แƒแƒ แƒ˜แƒก IDispatch COM แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜), แƒžแƒ˜แƒ•แƒ˜แƒœแƒแƒ•แƒขแƒ (แƒžแƒ˜แƒ—แƒแƒœแƒ˜) แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ (แƒ แƒฃแƒ‘แƒ˜) win32-autogui (แƒ แƒฃแƒ‘แƒ˜).

Microsoft UI แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ

ะ“ะปะฐะฒะฝั‹ะน ะฟะปัŽั: ั‚ะตั…ะฝะพะปะพะณะธั MS UI Automation ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ ะฟะพะดะฐะฒะปััŽั‰ะตะต ะฑะพะปัŒัˆะธะฝัั‚ะฒะพ GUI ะฟั€ะธะปะพะถะตะฝะธะน ะฝะฐ Windows ะทะฐ ั€ะตะดะบะธะผะธ ะธัะบะปัŽั‡ะตะฝะธัะผะธ. ะŸั€ะพะฑะปะตะผะฐ: ะพะฝะฐ ะฝะต ัะธะปัŒะฝะพ ะปะตะณั‡ะต ะฒ ะธะทัƒั‡ะตะฝะธะธ, ั‡ะตะผ Win32 API. ะ˜ะฝะฐั‡ะต ะฝะธะบั‚ะพ ะฑั‹ ะฝะต ะดะตะปะฐะป ะพะฑะตั€ั‚ะพะบ ะฝะฐะด ะฝะตะน.

แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒžแƒ”แƒ แƒกแƒแƒœแƒแƒšแƒฃแƒ แƒ˜ COM แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒ แƒ”แƒ‘แƒ˜ (แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ UIAutomationCore.dll), แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒแƒฅแƒ•แƒก .NET wrapper แƒคแƒแƒ แƒ›แƒแƒจแƒ˜ namespace System.Windows.Automation. แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒ›แƒแƒก แƒแƒฅแƒ•แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ, แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒช แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ UI แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒแƒ—. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— UIAutomationCore.dll แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  (แƒ—แƒฃ แƒ’แƒกแƒ›แƒ”แƒœแƒ˜แƒแƒ— UiaComWrapper-แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ C#-แƒจแƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ”แƒก แƒแƒ แƒ˜แƒก).

COM แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒก แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜:

(1) แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ IUแƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ - โ€žแƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ‘แƒแƒ แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒ”แƒกแƒ•แƒ˜โ€œ. แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ“แƒแƒ‘แƒแƒšแƒ˜ แƒ“แƒแƒœแƒ”, แƒแƒ แƒแƒกแƒแƒ“แƒ”แƒก แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜.
(2) IDispatch แƒ“แƒ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜ (แƒ›แƒแƒ’ Excel.Application), แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ Python-แƒจแƒ˜ win32com.client แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— (แƒ›แƒแƒงแƒ•แƒ”แƒ‘แƒ pyWin32). แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ“แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜.
(3) แƒ›แƒแƒ แƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ—แƒแƒœแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ›แƒฎแƒแƒ แƒ˜แƒก Python-แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒก แƒ™แƒแƒ›แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜.

แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: TestStack.White C#-แƒจแƒ˜, แƒžแƒ˜แƒ•แƒ˜แƒœแƒแƒ•แƒขแƒ 0.6.0+, Winium.Desktop C#-แƒจแƒ˜, Python-UIAutomation-for-Windows (แƒ›แƒแƒ—แƒ˜ แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒ˜ C แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก UIAutomationCore.dll-แƒ–แƒ” แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒŸแƒฆแƒแƒ•แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜), แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ แƒฃแƒ‘แƒ˜แƒจแƒ˜.

AT-SPI

ะะตัะผะพั‚ั€ั ะฝะฐ ั‚ะพ, ั‡ั‚ะพ ะฟะพั‡ั‚ะธ ะฒัะต ะพัะธ ัะตะผะตะนัั‚ะฒะฐ Linux ะฟะพัั‚ั€ะพะตะฝั‹ ะฝะฐ X Window System (ะฒ Fedora 25 ยซะธะบัั‹ยป ะฟะพะผะตะฝัะปะธ ะฝะฐ Wayland), ยซะธะบัั‹ยป ะฟะพะทะฒะพะปััŽั‚ ะพะฟะตั€ะธั€ะพะฒะฐั‚ัŒ ั‚ะพะปัŒะบะพ ะพะบะฝะฐะผะธ ะฒะตั€ั…ะฝะตะณะพ ัƒั€ะพะฒะฝั ะธ ะผั‹ัˆัŒัŽ/ะบะปะฐะฒะธะฐั‚ัƒั€ะพะน. ะ”ะปั ะดะตั‚ะฐะปัŒะฝะพะณะพ ั€ะฐะทะฑะพั€ะฐ ะฟะพ ะบะฝะพะฟะบะฐะผ, ะปะธัั‚ ะฑะพะบัะฐะผ ะธ ั‚ะฐะบ ะดะฐะปะตะต โ€” ััƒั‰ะตัั‚ะฒัƒะตั‚ ั‚ะตั…ะฝะพะปะพะณะธั AT-SPI. ะฃ ัะฐะผั‹ั… ะฟะพะฟัƒะปัั€ะฝั‹ั… ะพะบะพะฝะฝั‹ั… ะผะตะฝะตะดะถะตั€ะพะฒ ะตัั‚ัŒ ั‚ะฐะบ ะฝะฐะทั‹ะฒะฐะตะผั‹ะน AT-SPI registry ะดะตะผะพะฝ, ะบะพั‚ะพั€ั‹ะน ะธ ะพะฑะตัะฟะตั‡ะธะฒะฐะตั‚ ะดะปั ะฟั€ะธะปะพะถะตะฝะธะน ะฐะฒั‚ะพะผะฐั‚ะธะทะธั€ัƒะตะผั‹ะน GUI (ะบะฐะบ ะผะธะฝะธะผัƒะผ ะฟะพะดะดะตั€ะถะธะฒะฐัŽั‚ัั Qt ะธ GTK).

แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜: แƒžแƒ˜แƒแƒขแƒกแƒžแƒ˜2.

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, แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒžแƒ˜แƒแƒขแƒแƒ›แƒ˜. แƒ”แƒก แƒแƒ แƒ˜แƒก LDTP-แƒ—แƒแƒœ แƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒแƒ“แƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒกแƒ”แƒ•แƒ” แƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒฃแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ. แฒ›แƒแƒก แƒแƒฅแƒ•แƒก iTunes แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ macO-แƒ”แƒ‘แƒ–แƒ”แƒฉแƒ”แƒ›แƒ˜ แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜. แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ: แƒ›แƒแƒฅแƒœแƒ˜แƒšแƒ˜ แƒ•แƒแƒ“แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก (แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜ waitFor*). แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ‘แƒแƒจแƒ˜ แƒชแƒฃแƒ“แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก.

แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— pywinauto

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ˜ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ˜แƒแƒ แƒแƒฆแƒ”แƒ‘แƒ GUI แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ˜แƒœแƒกแƒžแƒ”แƒฅแƒขแƒแƒ แƒ˜แƒ— (แƒ แƒแƒกแƒแƒช แƒฐแƒฅแƒ•แƒ˜แƒ Spy tool). แƒ˜แƒก แƒ“แƒแƒ’แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒแƒ— แƒจแƒ”แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒแƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒจแƒ˜แƒ’แƒœแƒ˜แƒ“แƒแƒœ: แƒ แƒแƒ’แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ, แƒ แƒ แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜. แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ แƒ˜แƒœแƒกแƒžแƒ”แƒฅแƒขแƒแƒ แƒ”แƒ‘แƒ˜:

  • Spy++ - แƒจแƒ”แƒ“แƒ˜แƒก Visual Studio-แƒจแƒ˜, Express แƒแƒœ Community Edition-แƒ˜แƒก แƒฉแƒแƒ—แƒ•แƒšแƒ˜แƒ—. แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก Win32 API-แƒก. แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ™แƒšแƒแƒœแƒ˜แƒช AutoIt แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ.
  • Inspect.exe โ€” ะฒั…ะพะดะธั‚ ะฒ Windows SDK. ะ•ัะปะธ ะพะฝ ัƒ ะฒะฐั ัƒัั‚ะฐะฝะพะฒะปะตะฝ, ั‚ะพ ะฝะฐ 64-ะฑะธั‚ะฝะพะน Windows ะผะพะถะฝะพ ะฝะฐะนั‚ะธ ะตะณะพ ะฒ ะฟะฐะฟะบะต C:Program Files (x86)Windows Kits<winver>binx64. แƒ—แƒแƒ•แƒแƒ“ แƒ˜แƒœแƒกแƒžแƒ”แƒฅแƒขแƒแƒ แƒจแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒแƒ˜แƒ แƒฉแƒ˜แƒแƒ— แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜ UI แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ MS AA-แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ (Active Accessibility, UI Automation-แƒ˜แƒก แƒฌแƒ˜แƒœแƒแƒžแƒแƒ แƒ˜).

แƒ’แƒแƒœแƒแƒชแƒฎแƒแƒ“แƒ˜แƒก แƒ“แƒแƒ—แƒ•แƒแƒšแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ‘แƒ”แƒฅแƒ”แƒœแƒ“แƒก, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ—. Application แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ backend-แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ.

  • backend=โ€win32โ€ณ - แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก MFC, WTL, VB6 แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒซแƒ•แƒ”แƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—.
  • backend=โ€uiaโ€ โ€” ะฝะพะฒั‹ะน ะฑัะบะตะฝะด ะดะปั MS UI Automation: ะธะดะตะฐะปัŒะฝะพ ั€ะฐะฑะพั‚ะฐะตั‚ ั WPF ะธ WinForms; ั‚ะฐะบะถะต ั…ะพั€ะพัˆ ะดะปั Delphi ะธ Windows Store ะฟั€ะธะปะพะถะตะฝะธะน; ั€ะฐะฑะพั‚ะฐะตั‚ ั Qt5 ะธ ะฝะตะบะพั‚ะพั€ั‹ะผะธ Java ะฟั€ะธะปะพะถะตะฝะธัะผะธ. ะ˜ ะฒะพะพะฑั‰ะต, ะตัะปะธ Inspect.exe ะฒะธะดะธั‚ ัะปะตะผะตะฝั‚ั‹ ะธ ะธั… ัะฒะพะนัั‚ะฒะฐ, ะทะฝะฐั‡ะธั‚ ัั‚ะพั‚ ะฑัะบะตะฝะด ะฟะพะดั…ะพะดะธั‚. ะ’ ะฟั€ะธะฝั†ะธะฟะต, ะฑะพะปัŒัˆะธะฝัั‚ะฒะพ ะฑั€ะฐัƒะทะตั€ะพะฒ ั‚ะพะถะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ UI Automation (Mozilla ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ, ะฐ ะฅั€ะพะผัƒ ะฟั€ะธ ะทะฐะฟัƒัะบะต ะฝัƒะถะฝะพ ัะบะพั€ะผะธั‚ัŒ ะบะปัŽั‡ ะบะพะผะฐะฝะดะฝะพะน ัั‚ั€ะพะบะธ --force-renderer-accessibilityแƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒœแƒแƒฎแƒแƒ•แƒแƒ“ แƒ’แƒ•แƒ”แƒ แƒ“แƒ”แƒ‘แƒ–แƒ” Inspect.exe). แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒกแƒ”แƒšแƒ”แƒœแƒ—แƒแƒœ แƒ™แƒแƒœแƒ™แƒฃแƒ แƒ”แƒœแƒชแƒ˜แƒ แƒแƒ› แƒกแƒคแƒ”แƒ แƒแƒจแƒ˜ แƒซแƒœแƒ”แƒšแƒแƒ“ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ. แƒ‘แƒ แƒแƒฃแƒ–แƒ”แƒ แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ’แƒ–แƒ (แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒงแƒแƒก แƒฏแƒ•แƒแƒ แƒ”แƒ“แƒ˜แƒœแƒ˜ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒก แƒกแƒชแƒ”แƒœแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก).

แƒจแƒ”แƒกแƒ•แƒšแƒ˜แƒก แƒžแƒฃแƒœแƒฅแƒขแƒ”แƒ‘แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒคแƒแƒ แƒ—แƒแƒ“ แƒ˜แƒฅแƒœแƒ แƒ’แƒแƒ›แƒแƒ™แƒ•แƒšแƒ”แƒฃแƒšแƒ˜. แƒ“แƒ แƒแƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— Application แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ แƒ“แƒ แƒ’แƒแƒฃแƒจแƒ•แƒแƒ— แƒ˜แƒ’แƒ˜ แƒแƒœ แƒ›แƒ˜แƒแƒ›แƒแƒ’แƒ แƒแƒ— แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒก. แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒ™แƒšแƒแƒกแƒ˜แƒก แƒ™แƒšแƒแƒœแƒ˜ subprocess.Popen, แƒ™แƒ”แƒ แƒซแƒแƒ“, แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒก แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ˜แƒ—. แƒ”แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ, แƒ—แƒฃ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ  แƒ’แƒกแƒฃแƒ แƒ— แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœแƒ–แƒ” แƒจแƒ”แƒฎแƒ”แƒ‘แƒ.

from pywinauto.application import Application
app = Application(backend="uia").start('notepad.exe')

# ะžะฟะธัˆะตะผ ะพะบะฝะพ, ะบะพั‚ะพั€ะพะต ั…ะพั‚ะธะผ ะฝะฐะนั‚ะธ ะฒ ะฟั€ะพั†ะตััะต Notepad.exe
dlg_spec = app.UntitledNotepad
# ะถะดะตะผ ะฟะพะบะฐ ะพะบะฝะพ ั€ะตะฐะปัŒะฝะพ ะฟะพัะฒะธั‚ัั
actionable_dlg = dlg_spec.wait('visible')

แƒ—แƒฃ แƒ’แƒกแƒฃแƒ แƒ— แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ, แƒ”แƒก แƒ™แƒšแƒแƒกแƒ˜ แƒ“แƒแƒ’แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒแƒ— Desktop. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, Win10-แƒ˜แƒก แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒจแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒ”แƒ แƒแƒ แƒฅแƒ˜แƒ แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒžแƒ แƒแƒชแƒ”แƒกแƒ–แƒ” (แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ calc.exe). แƒแƒกแƒ” แƒ แƒแƒ› แƒแƒ แƒแƒœแƒแƒ˜แƒ แƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ Desktop แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜.

from subprocess import Popen
from pywinauto import Desktop

Popen('calc.exe', shell=True)
dlg = Desktop(backend="uia").Calculator
dlg.wait('visible')

แƒซแƒ˜แƒ แƒ”แƒฃแƒšแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ (Application แƒแƒœ Desktop) แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒแƒ“แƒ’แƒ˜แƒšแƒ˜แƒ, แƒกแƒแƒ“แƒแƒช แƒฃแƒœแƒ“แƒ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— backend. แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœแƒ˜ แƒ’แƒแƒ›แƒญแƒ•แƒ˜แƒ แƒ•แƒแƒšแƒ”แƒ“ แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ โ€žแƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ->แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒโ€œ แƒ™แƒแƒœแƒชแƒ”แƒคแƒชแƒ˜แƒแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒฃแƒšแƒ˜.

แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก/แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜

แƒ”แƒก แƒแƒ แƒ˜แƒก แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ™แƒแƒœแƒชแƒ”แƒคแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒ“แƒแƒช แƒแƒ’แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ pywinauto แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒฆแƒฌแƒ”แƒ แƒแƒ— แƒคแƒแƒœแƒฏแƒแƒ แƒ/แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ แƒฃแƒฎแƒ”แƒจแƒแƒ“ แƒแƒœ แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“, แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ—แƒฃ แƒ˜แƒก แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒœ แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒฎแƒฃแƒ แƒฃแƒšแƒ˜แƒ. แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ (แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ) แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒฃแƒœแƒ“แƒ แƒ›แƒแƒซแƒ”แƒ‘แƒœแƒแƒ— แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒคแƒแƒœแƒฏแƒแƒ แƒ แƒแƒœ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜.

แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒ˜ แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

>>> dlg_spec = app.window(title='Untitled - Notepad')

>>> dlg_spec
<pywinauto.application.WindowSpecification object at 0x0568B790>

>>> dlg_spec.wrapper_object()
<pywinauto.controls.win32_controls.DialogWrapper object at 0x05639B70>

แƒ—แƒแƒ•แƒแƒ“ แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒซแƒ”แƒ‘แƒœแƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒ— .wrapper_object(). แƒ˜แƒก แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš โ€žแƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒแƒกโ€œ แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก/แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒœ แƒ˜แƒกแƒ•แƒ แƒ˜แƒก ElementNotFoundError (แƒ–แƒแƒ’แƒฏแƒ”แƒ  ElementAmbiguousError, แƒ—แƒฃ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒ แƒœแƒแƒžแƒแƒ•แƒœแƒ˜, แƒแƒœแƒฃ แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒ•แƒ). แƒแƒ› โ€žแƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒแƒ›โ€œ แƒฃแƒ™แƒ•แƒ” แƒ˜แƒชแƒ˜แƒก, แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ—แƒแƒœ แƒแƒœ แƒ›แƒ˜แƒ˜แƒฆแƒแƒก แƒ›แƒ˜แƒกแƒ’แƒแƒœ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜.

แƒžแƒ˜แƒ—แƒแƒœแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ–แƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒšแƒ•แƒ .wrapper_object()แƒแƒกแƒ” แƒ แƒแƒ›, แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒ™แƒแƒ“แƒ˜ แƒฃแƒคแƒ แƒ แƒ›แƒแƒ™แƒšแƒ” แƒฎแƒ“แƒ”แƒ‘แƒ. แƒฉแƒ•แƒ”แƒœ แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒ’แƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ แƒแƒ แƒ˜ แƒฎแƒแƒ–แƒ˜ แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ˜แƒ’แƒ˜แƒ•แƒ”แƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก:

dlg_spec.wrapper_object().minimize() # debugging
dlg_spec.minimize() # production

แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒซแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก. แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:

# ะผะพะณัƒั‚ ะธะผะตั‚ัŒ ะฝะตัะบะพะปัŒะบะพ ัƒั€ะพะฒะฝะตะน
app.window(title_re='.* - Notepad$').window(class_name='Edit')

# ะผะพะถะฝะพ ะบะพะผะฑะธะฝะธั€ะพะฒะฐั‚ัŒ ะบั€ะธั‚ะตั€ะธะธ (ะบะฐะบ AND) ะธ ะฝะต ะพะณั€ะฐะฝะธั‡ะธะฒะฐั‚ัŒัั ะพะดะฝะธะผ ะฟั€ะพั†ะตััะพะผ ะฟั€ะธะปะพะถะตะฝะธั
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')

แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ แƒ™แƒ แƒ˜แƒขแƒ”แƒ แƒ˜แƒฃแƒ›แƒ˜แƒก แƒกแƒ˜แƒ แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒจแƒ˜ pywinauto.findwindows.find_elements(โ€ฆ).

แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒ— แƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒก แƒ›แƒแƒ’แƒ˜แƒ

แƒžแƒ˜แƒ—แƒแƒœแƒ˜ แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒก แƒคแƒแƒœแƒฏแƒ แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก แƒ“แƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒแƒ“ แƒแƒ›แƒแƒชแƒœแƒแƒ‘แƒแƒก (แƒจแƒ˜แƒœแƒแƒ’แƒแƒœแƒแƒ“, แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒฃแƒ’แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒงแƒแƒคแƒ˜แƒšแƒ˜แƒ __getattribute__). แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒ˜แƒ แƒ“แƒแƒฌแƒ”แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ–แƒ”, แƒ แƒแƒช แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ–แƒ” (แƒ•แƒ”แƒ  แƒฉแƒแƒกแƒ•แƒ˜แƒ— แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒ˜, แƒ›แƒซแƒ˜แƒ›แƒ”แƒ”แƒ‘แƒ˜ แƒแƒœ แƒกแƒฎแƒ•แƒ แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ”แƒ‘แƒ˜). แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, pywinauto แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ”แƒ’แƒ แƒ”แƒ— แƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒš โ€žแƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒจแƒ”แƒกแƒแƒขแƒงแƒ•แƒ˜แƒกโ€œ แƒกแƒแƒซแƒ˜แƒ”แƒ‘แƒ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ“แƒ’แƒ แƒแƒ“แƒ˜แƒ แƒ‘แƒ”แƒญแƒ“แƒ•แƒ˜แƒ—แƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ›แƒชแƒ˜แƒ แƒ” แƒ•แƒแƒ แƒ˜แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ—.

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

แƒ—แƒฃ แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒฃแƒœแƒ˜แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ”แƒ‘แƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ แƒฃแƒกแƒฃแƒšแƒ˜ แƒ”แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก), แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒ˜ แƒ“แƒ แƒ.แƒจ., แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฎแƒ•แƒ˜แƒ“แƒ”แƒ— แƒฆแƒ˜แƒšแƒแƒ™แƒ–แƒ” (แƒ—แƒ˜แƒ—แƒฅแƒแƒก แƒ”แƒก แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒšแƒ”แƒฅแƒกแƒ˜แƒ™แƒแƒœแƒ˜ แƒ˜แƒงแƒแƒก):

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

แƒฏแƒแƒ“แƒแƒกแƒœแƒฃแƒ แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒฎแƒฃแƒ—แƒ˜ แƒฌแƒ”แƒกแƒ˜

แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒแƒ— แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒฏแƒแƒ“แƒแƒกแƒœแƒฃแƒ แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜? แƒ˜แƒกแƒ˜แƒœแƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ”แƒœแƒ˜แƒญแƒ”แƒ‘แƒ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒก แƒซแƒ˜แƒ”แƒ‘แƒแƒ›แƒ“แƒ”. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ— แƒกแƒแƒฎแƒ”แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒแƒ“ แƒฐแƒ’แƒแƒ•แƒก แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ แƒ›แƒแƒ˜แƒซแƒ”แƒ‘แƒœแƒ”แƒ‘แƒ.

  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(). แƒ›แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ˜แƒก แƒ“แƒแƒ‘แƒ”แƒญแƒ“แƒ•แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ”, แƒแƒกแƒ”แƒ•แƒ” แƒคแƒแƒ˜แƒšแƒ–แƒ”. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ˜แƒ‘แƒ”แƒญแƒ“แƒ”แƒ‘แƒ แƒ›แƒ˜แƒกแƒ˜ แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒฏแƒแƒ“แƒแƒกแƒœแƒฃแƒ แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒ™แƒแƒžแƒ˜แƒ แƒแƒ— แƒ“แƒ แƒฉแƒแƒกแƒ•แƒแƒ— แƒ‘แƒแƒ•แƒจแƒ•แƒ˜แƒก แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒฃแƒคแƒ แƒ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒ˜ แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ˜แƒฅแƒ˜แƒ“แƒแƒœ. แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

app.Properties.child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13087", control_type="Edit")

แƒ—แƒแƒ•แƒแƒ“ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”, แƒ แƒแƒ’แƒแƒ แƒช แƒฌแƒ”แƒกแƒ˜, แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ“แƒ˜แƒ“แƒ˜ แƒคแƒ”แƒฎแƒ˜แƒก แƒฅแƒกแƒแƒ•แƒ˜แƒšแƒ˜แƒ.

>>> app.Properties.print_control_identifiers()

Control Identifiers:

Dialog - 'Windows NT Properties'    (L688, T518, R1065, B1006)
[u'Windows NT PropertiesDialog', u'Dialog', u'Windows NT Properties']
child_window(data-gt-translate-attributes='["title"]' title="Windows NT Properties", control_type="Window")
   |
   | Image - ''    (L717, T589, R749, B622)
   | [u'', u'0', u'Image1', u'Image0', 'Image', u'1']
   | child_window(auto_id="13057", control_type="Image")
   |
   | Image - ''    (L717, T630, R1035, B632)
   | ['Image2', u'2']
   | child_window(auto_id="13095", control_type="Image")
   |
   | Edit - 'Folder name:'    (L790, T596, R1036, B619)
   | [u'3', 'Edit', u'Edit1', u'Edit0']
   | child_window(data-gt-translate-attributes='["title"]' title="Folder name:", auto_id="13156", control_type="Edit")
   |
   | Static - 'Type:'    (L717, T643, R780, B658)
   | [u'Type:Static', u'Static', u'Static1', u'Static0', u'Type:']
   | child_window(data-gt-translate-attributes='["title"]' title="Type:", auto_id="13080", control_type="Text")
   |
   | Edit - 'Type:'    (L790, T643, R1036, B666)
   | [u'4', 'Edit2', u'Type:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Type:", auto_id="13059", control_type="Edit")
   |
   | Static - 'Location:'    (L717, T669, R780, B684)
   | [u'Location:Static', u'Location:', u'Static2']
   | child_window(data-gt-translate-attributes='["title"]' title="Location:", auto_id="13089", control_type="Text")
   |
   | Edit - 'Location:'    (L790, T669, R1036, B692)
   | ['Edit3', u'Location:Edit', u'5']
   | child_window(data-gt-translate-attributes='["title"]' title="Location:", auto_id="13065", control_type="Edit")
   |
   | Static - 'Size:'    (L717, T695, R780, B710)
   | [u'Size:Static', u'Size:', u'Static3']
   | child_window(data-gt-translate-attributes='["title"]' title="Size:", auto_id="13081", control_type="Text")
   |
   | Edit - 'Size:'    (L790, T695, R1036, B718)
   | ['Edit4', u'6', u'Size:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Size:", auto_id="13064", control_type="Edit")
   |
   | Static - 'Size on disk:'    (L717, T721, R780, B736)
   | [u'Size on disk:', u'Size on disk:Static', u'Static4']
   | child_window(data-gt-translate-attributes='["title"]' title="Size on disk:", auto_id="13107", control_type="Text")
   |
   | Edit - 'Size on disk:'    (L790, T721, R1036, B744)
   | ['Edit5', u'7', u'Size on disk:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Size on disk:", auto_id="13106", control_type="Edit")
   |
   | Static - 'Contains:'    (L717, T747, R780, B762)
   | [u'Contains:1', u'Contains:0', u'Contains:Static', u'Static5', u'Contains:']
   | child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13088", control_type="Text")
   |
   | Edit - 'Contains:'    (L790, T747, R1036, B770)
   | [u'8', 'Edit6', u'Contains:Edit']
   | child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13087", control_type="Edit")
   |
   | Image - 'Contains:'    (L717, T773, R1035, B775)
   | [u'Contains:Image', 'Image3', u'Contains:2']
   | child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13096", control_type="Image")
   |
   | Static - 'Created:'    (L717, T786, R780, B801)
   | [u'Created:', u'Created:Static', u'Static6', u'Created:1', u'Created:0']
   | child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13092", control_type="Text")
   |
   | Edit - 'Created:'    (L790, T786, R1036, B809)
   | [u'Created:Edit', 'Edit7', u'9']
   | child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13072", control_type="Edit")
   |
   | Image - 'Created:'    (L717, T812, R1035, B814)
   | [u'Created:Image', 'Image4', u'Created:2']
   | child_window(data-gt-translate-attributes='["title"]' title="Created:", auto_id="13097", control_type="Image")
   |
   | Static - 'Attributes:'    (L717, T825, R780, B840)
   | [u'Attributes:Static', u'Static7', u'Attributes:']
   | child_window(data-gt-translate-attributes='["title"]' title="Attributes:", auto_id="13091", control_type="Text")
   |
   | CheckBox - 'Read-only (Only applies to files in folder)'    (L790, T825, R1035, B841)
   | [u'CheckBox0', u'CheckBox1', 'CheckBox', u'Read-only (Only applies to files in folder)CheckBox', u'Read-only (Only applies to files in folder)']
   | child_window(data-gt-translate-attributes='["title"]' title="Read-only (Only applies to files in folder)", auto_id="13075", control_type="CheckBox")
   |
   | CheckBox - 'Hidden'    (L790, T848, R865, B864)
   | ['CheckBox2', u'HiddenCheckBox', u'Hidden']
   | child_window(data-gt-translate-attributes='["title"]' title="Hidden", auto_id="13076", control_type="CheckBox")
   |
   | Button - 'Advanced...'    (L930, T845, R1035, B868)
   | [u'Advanced...', u'Advanced...Button', 'Button', u'Button1', u'Button0']
   | child_window(data-gt-translate-attributes='["title"]' title="Advanced...", auto_id="13154", control_type="Button")
   |
   | Button - 'OK'    (L814, T968, R889, B991)
   | ['Button2', u'OK', u'OKButton']
   | child_window(data-gt-translate-attributes='["title"]' title="OK", auto_id="1", control_type="Button")
   |
   | Button - 'Cancel'    (L895, T968, R970, B991)
   | ['Button3', u'CancelButton', u'Cancel']
   | child_window(data-gt-translate-attributes='["title"]' title="Cancel", auto_id="2", control_type="Button")
   |
   | Button - 'Apply'    (L976, T968, R1051, B991)
   | ['Button4', u'ApplyButton', u'Apply']
   | child_window(data-gt-translate-attributes='["title"]' title="Apply", auto_id="12321", control_type="Button")
   |
   | TabControl - ''    (L702, T556, R1051, B962)
   | [u'10', u'TabControlSharing', u'TabControlPrevious Versions', u'TabControlSecurity', u'TabControl', u'TabControlCustomize']
   | child_window(auto_id="12320", control_type="Tab")
   |    |
   |    | TabItem - 'General'    (L704, T558, R753, B576)
   |    | [u'GeneralTabItem', 'TabItem', u'General', u'TabItem0', u'TabItem1']
   |    | child_window(data-gt-translate-attributes='["title"]' title="General", control_type="TabItem")
   |    |
   |    | TabItem - 'Sharing'    (L753, T558, R801, B576)
   |    | [u'Sharing', u'SharingTabItem', 'TabItem2']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Sharing", control_type="TabItem")
   |    |
   |    | TabItem - 'Security'    (L801, T558, R851, B576)
   |    | [u'Security', 'TabItem3', u'SecurityTabItem']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Security", control_type="TabItem")
   |    |
   |    | TabItem - 'Previous Versions'    (L851, T558, R947, B576)
   |    | [u'Previous VersionsTabItem', u'Previous Versions', 'TabItem4']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Previous Versions", control_type="TabItem")
   |    |
   |    | TabItem - 'Customize'    (L947, T558, R1007, B576)
   |    | [u'CustomizeTabItem', 'TabItem5', u'Customize']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Customize", control_type="TabItem")
   |
   | TitleBar - 'None'    (L712, T521, R1057, B549)
   | ['TitleBar', u'11']
   |    |
   |    | Menu - 'System'    (L696, T526, R718, B548)
   |    | [u'System0', u'System', u'System1', u'Menu', u'SystemMenu']
   |    | child_window(data-gt-translate-attributes='["title"]' title="System", auto_id="MenuBar", control_type="MenuBar")
   |    |    |
   |    |    | MenuItem - 'System'    (L696, T526, R718, B548)
   |    |    | [u'System2', u'MenuItem', u'SystemMenuItem']
   |    |    | child_window(data-gt-translate-attributes='["title"]' title="System", control_type="MenuItem")
   |    |
   |    | Button - 'Close'    (L1024, T519, R1058, B549)
   |    | [u'CloseButton', u'Close', 'Button5']
   |    | child_window(data-gt-translate-attributes='["title"]' title="Close", control_type="Button")

แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ›แƒ—แƒ”แƒšแƒ˜ แƒฎแƒ˜แƒก แƒ“แƒแƒ‘แƒ”แƒญแƒ“แƒ•แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒœแƒ”แƒšแƒ˜ แƒ˜แƒงแƒแƒก (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, iTunes-แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒกแƒแƒ›แƒ˜ แƒแƒ—แƒแƒกแƒ˜ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜ แƒ”แƒ แƒ— แƒฉแƒแƒœแƒแƒ แƒ—แƒ–แƒ”!), แƒ›แƒแƒ’แƒ แƒแƒ› แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ”แƒก แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜. depth (แƒกแƒ˜แƒฆแƒ แƒ›แƒ”): depth=1 - แƒ—แƒแƒ•แƒแƒ“ แƒ”แƒšแƒ”แƒ›แƒ”แƒœแƒขแƒ˜, depth=2 - แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฃแƒแƒฎแƒšแƒแƒ”แƒกแƒ˜ แƒ‘แƒแƒ•แƒจแƒ•แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ.แƒจ. แƒ˜แƒก แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ–แƒฃแƒกแƒขแƒ“แƒ”แƒก แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒจแƒ˜ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก child_window.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜

แƒฉแƒ•แƒ”แƒœ แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ“ แƒ•แƒแƒ•แƒกแƒ”แƒ‘แƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ แƒกแƒแƒชแƒแƒ•แƒจแƒ˜. แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก, แƒแƒฆแƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜แƒ WireShark แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ (แƒ”แƒก แƒแƒ แƒ˜แƒก Qt5 แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒ แƒ’แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜; แƒ—แƒฃแƒ›แƒชแƒ แƒแƒ› แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ GUI-แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก scapy.Sniffer แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒ“แƒแƒœ แƒฅแƒ”แƒ แƒชแƒšแƒ˜แƒแƒœแƒ˜). แƒแƒกแƒ”แƒ•แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก MS Paint แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ›แƒ˜แƒกแƒ˜ Ribbon แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ—แƒ แƒžแƒแƒœแƒ”แƒšแƒ˜แƒ—.

แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒจแƒ”แƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒฉแƒ”แƒ›แƒ˜ แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ : แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ explorer.exe-แƒ“แƒแƒœ Chrome-แƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ–แƒ” Google Drive-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ•แƒ แƒ›แƒ—แƒแƒ•แƒแƒ  แƒกแƒแƒชแƒแƒ•แƒจแƒ˜ แƒชแƒแƒขแƒ แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ—).

แƒ“แƒ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ™แƒšแƒแƒ•แƒ˜แƒแƒขแƒฃแƒ แƒ˜แƒก (แƒชแƒฎแƒ”แƒšแƒ˜ แƒ™แƒšแƒแƒ•แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒก) แƒ“แƒ แƒ›แƒแƒฃแƒกแƒ˜แƒก แƒฆแƒแƒœแƒ˜แƒกแƒซแƒ˜แƒ”แƒ‘แƒ”แƒ‘แƒ–แƒ” แƒ’แƒแƒ›แƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜:
hook_and_listen.py.

แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ

แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒ›แƒแƒ—, แƒ•แƒ˜แƒœแƒช แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒแƒ“ แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒแƒก. แƒฉแƒ”แƒ›แƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ•แƒแƒšแƒ”แƒœแƒขแƒ˜แƒœแƒ˜ แƒ”แƒก แƒ›แƒฃแƒ“แƒ›แƒ˜แƒ•แƒ˜ แƒฐแƒแƒ‘แƒ˜แƒ. แƒฉแƒ”แƒ›แƒ›แƒ แƒแƒ แƒ›แƒ แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ›แƒ UNN-แƒ“แƒแƒœ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ“แƒแƒ˜แƒชแƒ•แƒ แƒ‘แƒแƒ™แƒแƒšแƒแƒ•แƒ แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜ แƒแƒ› แƒ—แƒ”แƒ›แƒแƒ–แƒ”. แƒแƒšแƒ”แƒฅแƒกแƒแƒœแƒ“แƒ แƒ” แƒ“แƒ˜แƒ“แƒ˜ แƒฌแƒ•แƒšแƒ˜แƒšแƒ˜ แƒจแƒ”แƒ˜แƒขแƒแƒœแƒ MS UI Automation-แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒแƒจแƒ˜ แƒ“แƒ แƒแƒฎแƒšแƒแƒฎแƒแƒœ แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ "แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒ™แƒ•แƒ แƒ˜แƒก" แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ—แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ–แƒ” (แƒ”แƒก แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ แƒ—แƒฃแƒšแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ), แƒฏแƒ”แƒ แƒฏแƒ”แƒ แƒแƒ‘แƒ˜แƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ "uia" backend-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒ•แƒแƒœ ั€ะฐะทั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ ะฝะพะฒั‹ะน ะฑัะบะตะฝะด ะฟะพะด Linux ะฝะฐ ะพัะฝะพะฒะต AT-SPI (ะผะพะดัƒะปะธ mouse ะธ keyboard แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ python-xlib - แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒจแƒ˜ 0.6.x).

แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒ›แƒ” แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒแƒœแƒ˜แƒ แƒ•แƒแƒกแƒฌแƒแƒ•แƒšแƒ˜ แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒ™แƒฃแƒ แƒกแƒก, แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒ›แƒแƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒก แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ˜ แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒกแƒแƒจแƒ˜แƒœแƒแƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒแƒก, แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก แƒ›แƒชแƒ˜แƒ แƒ” แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒก แƒแƒœ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒก. แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ—แƒ˜ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ แƒแƒ› แƒ™แƒ•แƒšแƒ”แƒ•แƒ˜แƒก แƒ”แƒขแƒแƒžแƒ–แƒ” แƒแƒกแƒ”แƒ•แƒ” แƒ”แƒ แƒ—แƒฎแƒ”แƒš แƒแƒฆแƒ›แƒแƒแƒฉแƒ˜แƒœแƒ”แƒก แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ . แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› แƒ–แƒแƒ’แƒฏแƒ”แƒ  แƒ›แƒ™แƒแƒชแƒ แƒแƒ“ แƒฃแƒœแƒ“แƒ แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒแƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜. แƒกแƒขแƒแƒขแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒแƒœแƒแƒšแƒ˜แƒ–แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜ (QuantifiedCode, Codacy แƒ“แƒ Landscape) แƒ“แƒ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒ˜ แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜ แƒฆแƒ แƒฃแƒ‘แƒ”แƒšแƒจแƒ˜ (AppVeyor แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜) แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 95% แƒ“แƒแƒคแƒแƒ แƒ•แƒ˜แƒ— แƒ‘แƒ”แƒ•แƒ แƒก แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ แƒแƒ›แƒแƒจแƒ˜.

แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒแƒก, แƒ•แƒ˜แƒœแƒช แƒขแƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ”แƒ‘แƒก, แƒแƒฉแƒ”แƒœแƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒก แƒ“แƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒก!

แฒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜

แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒ‘แƒก แƒขแƒ”แƒ’แƒ˜ StackOverflow-แƒ–แƒ” (แƒชแƒแƒขแƒ แƒฎแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ แƒขแƒ”แƒ’แƒ˜ SO-แƒก แƒ แƒฃแƒกแƒฃแƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜) แƒ“แƒ แƒกแƒแƒ™แƒ•แƒแƒœแƒซแƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒ— แƒขแƒแƒกแƒขแƒ”แƒ แƒ–แƒ”. แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ แƒฃแƒกแƒฃแƒšแƒ”แƒœแƒแƒ•แƒแƒœแƒ˜ แƒฉแƒแƒขแƒ˜ Gitter-แƒ–แƒ”.

แƒ•แƒแƒแƒฎแƒšแƒ”แƒ‘แƒ— แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒฃแƒ แƒแƒ“ แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ˜แƒก แƒ แƒ”แƒ˜แƒขแƒ˜แƒœแƒ’แƒ˜ GUI แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. GitHub-แƒ–แƒ” แƒ•แƒแƒ แƒกแƒ™แƒ•แƒšแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒ›แƒฎแƒแƒšแƒแƒ“ Autohotkey (แƒ›แƒแƒ— แƒแƒฅแƒ•แƒ— แƒซแƒแƒšแƒ˜แƒแƒœ แƒ“แƒ˜แƒ“แƒ˜ แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒ แƒ“แƒ แƒ“แƒ˜แƒ“แƒ˜ แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒ) แƒ“แƒ PyAutoGUI แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ (แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒแƒ“ แƒ›แƒ˜แƒกแƒ˜ แƒแƒ•แƒขแƒแƒ แƒ˜แƒก แƒแƒš แƒกแƒ•แƒ”แƒ˜แƒ’แƒแƒ แƒขแƒ˜แƒก แƒฌแƒ˜แƒ’แƒœแƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒžแƒฃแƒšแƒแƒ แƒแƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ: โ€Automate the Boring Stuff with แƒžแƒ˜แƒ—แƒแƒœแƒ˜โ€œ แƒ“แƒ แƒกแƒฎแƒ•แƒ).

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒกแƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก ๐Ÿ”ฅ แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒ—, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜ | ProHoster