Kukhazikitsa GUI pakompyuta ku Python + pywinauto: momwe mungapangire zibwenzi ndi MS UI Automation

Laibulale ya Python pywinauto β€” ndi pulojekiti yotseguka yogwiritsira ntchito mapulogalamu a GUI a desktop pa WindowsM'zaka ziwiri zapitazi, yawonjezera zinthu zatsopano zazikulu:

  • Chithandizo cha ukadaulo wa MS UI Automation. Mawonekedwe ake akadali chimodzimodzi, ndipo tsopano amathandizira WinForms, WPF, Qt5, Windows Sitolo (UWP) ndi zina zotero - pafupifupi chilichonse chomwe chilipo Windows.
  • Dongosolo la backends / mapulagini (pakadali pano pali awiri aiwo pansi pa hood: default "win32" ndi chatsopano "uia"). Kenako timayenda bwino kupita ku nsanja.
  • Win32 mbewa za mbewa ndi kiyibodi (makiyi otentha mu mzimu wa pyHook).

Tiperekanso chidule chachidule cha zomwe zikupezeka pamasamba otseguka a automation apakompyuta (popanda kunyengezera kufananiza kwakukulu).

Nkhaniyi ndi yolembedwa pang'ono ya lipoti la msonkhano wa SQA Days 20 ku Minsk (kanema tepi ΠΈ zithunzi), Baibulo la Chirasha Tsamba loyamba za pywinauto.

Tiyeni tiyambe ndi mwachidule za open source m'derali. Pamapulogalamu a GUI apakompyuta, chilichonse ndizovuta kwambiri kuposa pa intaneti, yomwe ili ndi Selenium. Nazi njira zazikuluzikulu:

Coordinate njira

Hardcode podina, tikuyembekeza zomenyedwa bwino.
[+] Cross-platform, yosavuta kugwiritsa ntchito.
[+] Ndikosavuta "kujambulitsanso" zojambulira zoyeserera.
[-] Zosakhazikika kwambiri pakusintha mawonekedwe azithunzi, mutu, mafonti, kukula kwazenera, ndi zina.
[-] Khama lalikulu lothandizira likufunika; nthawi zambiri zimakhala zosavuta kukonzanso mayeso kuyambira poyambira kapena kuyesa pamanja.
[-] Imangochita zinthu zokha; pali njira zina zotsimikizira ndi kubweza deta.

Zida (mtanda-nsanja): autopy, PyAutoGUI, PyUserInput ndi ena ambiri. Nthawi zambiri, zida zovuta kwambiri zimaphatikizapo magwiridwe antchito awa (osati nthawi zonse pamtanda).

Ndikoyenera kunena kuti njira yolumikizira imatha kuphatikizira njira zina. Mwachitsanzo, pazithunzi zomwe mumakonda, mutha kudina pazolumikizana zachibale (kuchokera pakona yakumanzere kwa zenera/chinthu, osati chophimba chonse) - izi nthawi zambiri zimakhala zodalirika, makamaka ngati mungaganizire kutalika / m'lifupi mwake. zinthu zonse (ndiye kuti zosintha zosiyanasiyana sizingapweteke).

Njira ina: perekani makina amodzi okha omwe ali ndi zoikamo zokhazikika zoyesa (osati nsanja, koma nthawi zina ndi zabwino).

Kuzindikirika kwazithunzi

[+] Cross-platform
[+-] Zodalirika (zabwino kuposa njira yolumikizira), komabe zimafunikira zidule zina.
[-+] Mochedwa pang'ono, chifukwa Imafunika zida za CPU kuti zizindikirike ma aligorivimu.
[-] Kuzindikiritsa malemba (OCR), monga lamulo, sikunali kofunikira => zolemba zolemba sizingapezeke. Monga ndikudziwira, mayankho omwe alipo a OCR sali odalirika kwambiri pa ntchito yamtunduwu, ndipo sagwiritsidwa ntchito kwambiri (kulandiridwa mu ndemanga ngati izi siziri choncho).

Zida: Sikuli, Lackey (Sikuli-compatible, Python yoyera), PyAutoGUI.

Kufikika kwaukadaulo

[+] Njira yodalirika kwambiri, chifukwa amakulolani kuti mufufuze ndi malemba, mosasamala kanthu kuti amaperekedwa ndi dongosolo kapena chimango.
[+] Imakulolani kuchotsa zolemba => zosavuta kutsimikizira zotsatira zoyesa.
[+] Monga lamulo, yothamanga kwambiri, chifukwa amadya pafupifupi palibe CPU chuma.
[-] N'kovuta kupanga chida chogwiritsa ntchito nsanja zosiyanasiyana: malaibulale onse otseguka amathandizira ukadaulo umodzi kapena iwiri yofikira. Windows/Linux/MacOS sichithandizidwa ndi aliyense kupatulapo omwe amalipidwa monga TestComplete, UFT kapena Squish.
[-] Ukadaulo wotere supezeka nthawi zonse. Mwachitsanzo, kuyesa chophimba chotsitsa mkati mwa VirtualBox - izi sizingachitike popanda kuzindikira kwazithunzi. Koma muzochitika zambiri zachikale, njira yofikira ikugwirabe ntchito. Izi zidzakambidwanso.

Zida: TestStack.White mu C#, Winium.Desktop mu C # (Selenium yogwirizana), MS WinApp Driver mu C # (Appium yogwirizana), pywinauto, pyatom (Zogwirizana ndi LDTP) Python-UIAutomation-for-Windows, RAutomation mu Ruby, Mtengo wa LDTP (Linux Ntchito Yoyesera Pakompyuta) ndi zake Windows Baibulo Cobra.

LDTP mwina ndiye chida chokhacho chotsegulira gwero (molondola, banja la malaibulale) kutengera matekinoloje opezeka. Komabe, sizodziwika kwambiri. Sindinagwiritse ntchito ndekha, koma malinga ndi ndemanga, mawonekedwe ake si abwino kwambiri. Ngati muli ndi ndemanga zabwino, chonde gawani mu ndemanga.

Yesani backdoor (njinga yam'nyumba)

Pazogwiritsa ntchito papulatifomu, opanga okha nthawi zambiri amapanga makina amkati kuti atsimikizire kuyesa. Mwachitsanzo, amapanga seva ya TCP pakugwiritsa ntchito, mayeso amalumikizana nawo ndikutumiza malamulo olembera: zomwe mungadina, komwe mungapeze deta, ndi zina. Odalirika, koma osati onse.

Tekinoloje zoyambira zopezeka pakompyuta

Zabwino zakale Win32 API

kwambiri Windows Mafomu olembera WPF isanatulutsidwe komanso itatha Windows Masitolo, amamangidwa mwanjira ina pa Win32 API. Mwachidule, MFC, WTL, C++ Builder, Delphi, VB6β€”zida zonsezi zimagwiritsa ntchito Win32 API. Windows Mafomu ambiri amagwirizana ndi Win32 API.

Zida: Padenga (zofanana ndi VB) ndi Python wrapper pyautoit, autohotkey (chinenero chanu, pali mawonekedwe a IDispatch COM), pywinauto (Python) RAutomation (Ruby) win32-autogui (Ruby).

Microsoft UI Automation

Ubwino waukulu: Ukadaulo wa MS UI Automation umathandizira mapulogalamu ambiri a GUI pa Windows Kupatulapo zinthu zina zomwe sizichitika kawirikawiri. Vuto ndilakuti sikophweka kuphunzira kuposa Win32 API. Kupanda kutero, palibe amene angapange ma wrappers ake.

M'malo mwake, awa ndi makonzedwe amtundu wa COM (makamaka UIAutomationCore.dll), komanso ali ndi .NET wrapper mu mawonekedwe namespace System.Windows.Automation. Mwa njira, ili ndi cholakwika choyambitsa chifukwa chomwe zinthu zina za UI zitha kuphonya. Choncho, ndibwino kugwiritsa ntchito UIAutomationCore.dll mwachindunji (ngati munamvapo za UiaComWrapper mu C #, ndiye izi).

Mitundu ya mawonekedwe a COM:

(1) Basic IUknown - β€œmuzu wa zoipa zonse”. Mulingo wotsika kwambiri, osagwiritsa ntchito bwino.
(2) IDispatch ndi zotumphukira (mwachitsanzo Excel.Application), yomwe ingagwiritsidwe ntchito ku Python pogwiritsa ntchito phukusi la win32com.client (lophatikizidwa ndi pyWin32). Njira yabwino komanso yokongola kwambiri.
(3) Mawonekedwe achikhalidwe omwe phukusi lachitatu la Python lingagwire nawo ntchito comtypes.

Zida: TestStack.White mu C#, pywinauto 0.6.0+, Winium.Desktop mu C#, Python-UIAutomation-for-Windows (kodi kwawo kwa C wrappers pa UIAutomationCore.dll sikuwululidwa), RAutomation mu ruby.

Chithunzi cha AT-SPI

Ngakhale kuti pafupifupi nkhwangwa zonse za m'banja Linux Yomangidwa pa X Window System (mu Fedora 25, "X" inalowedwa m'malo ndi Wayland), "X" imakulolani kugwiritsa ntchito mawindo apamwamba ndi mbewa/kiyibodi. Kuti muwunikenso mwatsatanetsatane mabatani, mabokosi amndandanda, ndi zina zotero, pali ukadaulo wa AT-SPI. Oyang'anira mawindo otchuka kwambiri ali ndi daemon yotchedwa AT-SPI registry, yomwe imapereka GUI yodziyimira payokha ya mapulogalamu (osachepera Qt ndi GTK zimathandizidwa).

Zida: pyatsi2.

pyatspi2, m'malingaliro mwanga, ili ndi zodalira zambiri monga PyGObject. Tekinoloje yokhayo imapezeka ngati laibulale yokhazikika yokhazikika libatspi.so. Pali a Buku LofotokozeraPa laibulale ya pywinauto, tikukonzekera kugwiritsa ntchito chithandizo cha AT-SPI motere: potsegula libatspi.so ndi gawo la ctypes. Vuto laling'ono lokhalo ndikugwiritsa ntchito mtundu wolondola, chifukwa ndi wosiyana pang'ono pa mapulogalamu a GTK+ ndi Qt. Kutulutsidwa kwa pywinauto 0.7.0 komwe kungatheke kudzapereka chithandizo chonse. Linux zitha kuyembekezeredwa mu theka loyamba la chaka cha 2018.

Apple Accessibility API

MacOS ili ndi chilankhulo chake chokha, AppleScript. Kuti mugwiritse ntchito chonga ichi mu Python, ndithudi, muyenera kugwiritsa ntchito ntchito kuchokera ku ObjectiveC. Kuyambira, zikuwoneka, ndi MacOS 10.6, phukusi la pyobjc likuphatikizidwa mu Python yokhazikitsidwa kale. Izi zipangitsanso kukhala kosavuta kutchula zodalira pa chithandizo chamtsogolo mu pywinauto.

Zida: Kuphatikiza pa chilankhulo cha Apple Script, ndikofunikira kulabadira Zithunzi za ATOMac, kapena pyatom. Ndi mawonekedwe ogwirizana ndi LDTP, komanso ndi laibulale yoyima. Zatero chitsanzo cha iTunes automation pa macOs, lolembedwa ndi wophunzira wanga. Pali vuto lodziwika: nthawi zosinthika sizigwira ntchito (njira waitFor*). Koma zonse, osati zoipa.

Momwe mungayambire ndi pywinauto

Gawo loyamba ndikudzikonzekeretsa ndi wowunikira zinthu za GUI (chomwe chimatchedwa chida cha Spy). Zikuthandizani kuti muphunzire kugwiritsa ntchito mkati: momwe maulamuliro azinthu amapangidwira, ndi zinthu ziti zomwe zilipo. Oyang'anira malo otchuka kwambiri:

  • Kazitape++ - yophatikizidwa ndi Visual Studio, kuphatikiza Express kapena Community Edition. Amagwiritsa ntchito Win32 API. Wokondedwa wake amadziwikanso AutoIt Window Info.
  • Onani.exe β€” ikuphatikizidwa mu Windows SDK. Ngati mwaiyika, ndiye kuti ili pa 64-bit Windows Mungapeze mu chikwatu C:Program Files (x86)Windows Kits<winver>binx64. Mu inspector palokha muyenera kusankha mode UI Automation m'malo mwa MS AA (Active Accessibility, kholo la UI Automation).

Titawunika kugwiritsa ntchito ndikudutsa, timasankha backend yomwe tidzagwiritse ntchito. Ndikokwanira kutchula dzina la backend popanga chinthu cha Application.

  • backend=”win32β€³ - pomwe imagwiritsidwa ntchito mwachisawawa, imagwira ntchito bwino ndi MFC, WTL, VB6 ndi mapulogalamu ena olowa.
  • backend = "uia" β€” backend yatsopano ya MS UI Automation: imagwira ntchito bwino ndi WPF ndi WinForms; komanso yabwino kwa Delphi ndi Windows Mapulogalamu a Store; amagwira ntchito ndi Qt5 ndi mapulogalamu ena a Java. Ndipo nthawi zambiri, ngati Inspect.exe ikuwona zinthu ndi katundu wawo, ndiye kuti backend iyi ndi yoyenera. Kwenikweni, asakatuli ambiri amathandiziranso UI Automation (Mozilla mwachisawawa, ndipo Chrome imafuna kusintha kwa mzere wa malamulo ikayamba). --force-renderer-accessibilitykuti muwone zinthu patsamba la Inspect.exe). Inde, mpikisano ndi Selenium m'derali sizingatheke. Njira inanso yogwirira ntchito ndi msakatuli (itha kukhala yothandiza pazochitika zamitundu yosiyanasiyana).

Malo olowera a automation

Ntchitoyi yafufuzidwa mozama. Yakwana nthawi yoti mupange chinthu cha Application ndikuchiyendetsa kapena kulumikizana ndi chomwe chikuyenda kale. Izi sizingofanana ndi gulu lokhazikika subprocess.Popen, chomwe ndi chinthu cholowetsa chomwe chimalepheretsa zochita zanu zonse kumalire a ndondomekoyi. Izi ndizothandiza kwambiri ngati muli ndi zochitika zingapo zogwiritsira ntchito, koma simukufuna kukhudza zina zonse.

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

# ОпишСм ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π½Π°ΠΉΡ‚ΠΈ Π² процСссС Notepad.exe
dlg_spec = app.UntitledNotepad
# ΠΆΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ° ΠΎΠΊΠ½ΠΎ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ появится
actionable_dlg = dlg_spec.wait('visible')

Ngati mukufuna kuyang'anira mapulogalamu angapo nthawi imodzi, kalasi iyi ikuthandizani Desktop. Mwachitsanzo, mu chowerengera pa Win10, kuchuluka kwa zinthu kumafalikira panjira zingapo (osati kokha. calc.exe). Choncho palibe kanthu Desktop osakwanira.

from subprocess import Popen
from pywinauto import Desktop

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

Muzu chinthu (Application kapena Desktop) ndi malo okhawo omwe muyenera kufotokoza zakumbuyo. Zina zonse zimagwera mowonekera mu lingaliro la "specification->wrapper", lomwe lidzakambidwe pambuyo pake.

Mazenera/Zosintha Zazinthu

Ili ndiye lingaliro lofunikira lomwe mawonekedwe a pywinauto amamangidwira. Mutha kufotokoza zenera/chinthu pafupifupi kapena mwatsatanetsatane, ngakhale sichinakhalepo kapena chatsekedwa kale. Mawonekedwe a mawindo (chinthu WindowSpecification) amasunga njira zofufuzira zenera lenileni kapena chinthu.

Chitsanzo chatsatanetsatane wazenera:

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

Kusaka zenera palokha kumachitika poyitana njira .wrapper_object(). Imabwezeranso "wrapper" inayake pawindo lenileni / chinthu kapena kuponya ElementNotFoundError (nthawi zina ElementAmbiguousError, ngati zinthu zingapo zapezeka, ndiko kuti, muyenera kufotokozera muyeso wofufuzira). "Wrapper" uyu amadziwa kale kuchita zina ndi chinthu kapena kulandira deta kuchokera kwa icho.

Python imatha kubisa kuyimba .wrapper_object(), kotero code yomaliza imakhala yaifupi. Tikukulimbikitsani kuti mugwiritse ntchito pazolinga zowongolera zokha. Mizere iwiri yotsatira ikuchita chimodzimodzi:

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

Pali njira zambiri zofufuzira za mawonekedwe a zenera. Nazi zitsanzo zochepa chabe:

# ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ
app.window(title_re='.* - Notepad$').window(class_name='Edit')

# ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ (ΠΊΠ°ΠΊ AND) ΠΈ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ процСссом прилоТСния
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')

Mndandanda wazinthu zonse zomwe zingatheke uli muzolemba za ntchito pywinauto.findwindows.find_elements(…).

Matsenga ofikira ndi mawonekedwe ndi makiyi

Python imapangitsa kuti zikhale zosavuta kupanga mawonekedwe azenera ndikuzindikira mawonekedwe a chinthu mwachangu (mkati, njirayo imachotsedwa. __getattribute__). Zachidziwikire, zoletsa zomwezo zimayikidwa pa dzina lachidziwitso monga pa dzina la mtundu uliwonse (simungathe kuyika mipata, koma, kapena zilembo zina zapadera). Mwamwayi, pywinauto imagwiritsa ntchito zomwe zimatchedwa "machesi abwino kwambiri" omwe amatsutsana ndi typos ndi zosiyana zazing'ono.

app.UntitledNotepad
# Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ
app.window(best_match='UntitledNotepad')

Ngati mukufunikirabe zingwe za Unicode (mwachitsanzo, chilankhulo cha Chirasha), mipata, ndi zina zambiri, mutha kuzipeza ndi kiyi (monga ngati ndi dikishonale yokhazikika):

app['Untitled - Notepad']
# Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ
app.window(best_match='Untitled - Notepad')

Malamulo asanu a mayina amatsenga

Kodi mungapeze bwanji mayina amatsenga? Zomwe zimaperekedwa ku chinthucho musanafufuze. Ngati mwatchula dzina lomwe likufanana mokwanira ndi muyezo, ndiye kuti chinthucho chipezeka.

  1. Ndi mutu (mawu, dzina): app.Properties.OK.click()
  2. Mwa mawu ndi mtundu wa chinthu: app.Properties.OKButton.click()
  3. Mwa mtundu ndi nambala: app.Properties.Button3.click() (mazina Button0 ΠΈ Button1 kugwirizana ndi chinthu choyamba chomwe chapezeka, Button2 - kwa chachiwiri, ndiyeno mwadongosolo - umu ndi momwe zidachitikira m'mbiri)
  4. Ndi mawu osasunthika (kumanzere kapena pamwamba) ndi mtundu: app.OpenDialog.FileNameEdit.set_text("") (zothandiza pazinthu zokhala ndi mawu osinthika)
  5. Mwa mtundu ndi mawu mkati: app.Properties.TabControlSharing.select("General")

Nthawi zambiri malamulo awiri kapena atatu amagwiritsidwa ntchito nthawi imodzi, kawirikawiri. Kuti muwone mayina enieni omwe alipo pa chinthu chilichonse, mutha kugwiritsa ntchito njirayo print_control_identifiers(). Ikhoza kusindikiza mtengo wazinthu zonse pazenera komanso ku fayilo. Pa chinthu chilichonse, mayina ake amatsenga amasindikizidwa. Mutha kukopera ndi kumata tsatanetsatane wazinthu za ana kuchokera pamenepo. Zotsatira mu script zidzawoneka motere:

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

Mtengo wa zinthu womwewo nthawi zambiri umakhala nsalu yayikulu kwambiri.

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

Nthawi zina, kusindikiza mtengo wonse kumatha kukhala pang'onopang'ono (mwachitsanzo, mu iTunes pali zinthu zambiri mpaka XNUMX pa tabu imodzi!), koma mutha kugwiritsa ntchito njirayi. depth (kuya): depth=1 - element yokha, depth=2 - ana okha achangu, ndi zina zotero. Itha kufotokozedwanso muzofotokozera popanga child_window.

zitsanzo

Timadzaza nthawi zonse mndandanda wa zitsanzo munkhokwe. Pakati pa zaposachedwa, ndikofunikira kudziwa kusinthika kwa WireShark network analyzer (ichi ndi chitsanzo chabwino cha pulogalamu ya Qt5; ngakhale ntchitoyi itha kuthetsedwa popanda GUI, chifukwa pali scapy.Sniffer kuchokera phukusi la Python scapy). Palinso chitsanzo cha MS Paint automation yokhala ndi Ribbon toolbar.

Chitsanzo china chabwino cholembedwa ndi wophunzira wanga: kukokera fayilo kuchokera ku explorer.exe kupita ku tsamba la Chrome la Google Drive (idzasunthira kunkhokwe yayikulu pambuyo pake).

Ndipo, ndithudi, chitsanzo cholembetsa ku kiyibodi (makiyi otentha) ndi zochitika za mbewa:
hook_and_listen.py.

Zothokoza

Zikomo kwambiri kwa iwo omwe amathandizira nthawi zonse kupanga polojekitiyi. Kwa ine ndi Valentine Ichi ndi chokonda chokhazikika. Awiri mwa ophunzira anga ochokera ku UNN posachedwapa ateteza madigiri awo a bachelor pamutuwu. АлСксандр adapereka chithandizo chachikulu chothandizira MS UI Automation ndipo posachedwapa anayamba kupanga makina opangira ma code generator pogwiritsa ntchito mfundo ya "record-playback" pogwiritsa ntchito malemba (ichi ndi chinthu chovuta kwambiri), mpaka pano pokhapokha "uia" backend. Ivan ikupanga backend yatsopano ya Linux kutengera ma module a AT-SPI mouse ΠΈ keyboard zochokera python-xlib - zomwe zatulutsidwa kale 0.6.x).

Popeza ndakhala ndikuphunzitsa maphunziro apadera odzipangira okha ku Python kwanthawi yayitali, ophunzira ena ambuye amachita homuweki, kugwiritsa ntchito zing'onozing'ono kapena zitsanzo za makina. Zinthu zina zofunika kwambiri pa kafukufuku zidafukulidwanso ndi ophunzira. Ngakhale nthawi zina muyenera kuyang'anitsitsa khalidwe la code. Ma static analyzer (QuantifiedCode, Codacy and Landscape) ndi zoyesa zokha pamtambo (AppVeyor service) zokhala ndi ma code pafupifupi 95% zimathandiza kwambiri pa izi.

Komanso zikomo kwa aliyense amene amasiya ndemanga, amadzutsa nsikidzi ndikutumiza zopempha kukoka!

Zowonjezera Zowonjezera

Timatsatira mafunso tag pa StackOverflow (zowonekera posachedwa tag mu Russian version ya SO) ndi ndi mawu ofunika pa Toaster. Pali Macheza achi Russia pa Gitter.

Timasintha mwezi uliwonse mlingo wa malaibulale otseguka oyesa GUI. Pankhani ya kuchuluka kwa nyenyezi pa GitHub, Autohotkey yokha (ali ndi gulu lalikulu kwambiri komanso mbiri yakale) ndipo PyAutoGUI ikukula mwachangu (makamaka chifukwa cha kutchuka kwa mabuku ndi wolemba wake Al Sweigart: "Automate the Boring Stuff with Python" ndi ena).

Source: www.habr.com

Gulani kuchititsa kodalirika kwamasamba okhala ndi chitetezo cha DDoS, ma seva a VPS VDS Gulani malo odalirika osungira mawebusayiti okhala ndi chitetezo cha DDoS, ma seva a VPS VDS | ProHoster