Si otomaatig ah ugu samee GUI desktop gudaha Python + pywinauto: sida saaxiibbo loogu yeelo MS UI Automation

Maktabadda Python pywinauto waa mashruuc il furan oo si otomaatig ah loogu sameeyo barnaamijyada GUI desktop ee Windows. Labadii sano ee la soo dhaafay, astaamo cusub ayaa ka soo muuqday:

  • Taageerada farsamada MS UI Automation. Interface waa isku mid, oo hadda waxay taageertaa: WinForms, WPF, Qt5, Dukaanka Windows (UWP) iyo wixii la mid ah - ku dhawaad ​​​​wax kasta oo ku jira Windows.
  • Nidaamka backends/plugins (hadda waxaa jira laba ka mid ah daboolka hoostiisa: default "win32" oo cusub "uia"). Kadibna waxaan si habsami leh ugu soconaa dhanka isgoysyada.
  • Xirmooyinka Win32 ee mouse iyo kiiboodhka (furayaasha kulul ee ruuxa pyHook).

Waxaan sidoo kale bixin doonaa dulmar gaaban oo ku saabsan waxa laga heli karo il furan oo loogu talagalay otomatiga desktop (adigoon iska dhigin isbarbardhig halis ah).

Maqaalkani waa qayb qoraal ah oo ka soo baxay shirkii SQA Days 20 ee Minsk (cajalad muuqaal ah и sawiro), qayb ahaan nooca Ruushka Helitaanka Guide Bilaabidda loogu talagalay pywinauto.

Aan ku bilowno dulmar kooban oo ku saabsan isha furan ee aaggan. Codsiyada GUI ee desktop-ka, wax walbaa xoogaa way ka dhib badan yihiin shabakada, oo leh Selenium. Waa kuwan hababka ugu muhiimsan:

Habka isku xirka

Hardcode dhibcaha gujinta, waxaan rajeyneynaa hits guuleysta.
[+] Iskutallaab, fududahay in la hirgeliyo.
[+] Way fududahay in "dib loo duubo" duubista tijaabada
[-] Kuwa ugu xasiloon si loo beddelo xallinta shaashadda, mawduuca, xarfaha, cabbirrada daaqadaha, iwm.
[-] Dadaal taageero oo baaxad leh ayaa loo baahan yahay; inta badan way fududahay in dib loo soo nooleeyo imtixaanada meel eber ah ama lagu tijaabiyo gacanta.
[-] Si otomaatig ah ayuu u sameeyaa kaliya falalka; waxaa jira habab kale oo lagu xaqiijiyo iyo soo celinta xogta.

Aaladaha (goob-goynta): autopy, PyAutoGUI, PyUserInput iyo kuwo kale oo badan. Caadi ahaan, qalabyada kakan waxaa ka mid ah shaqeyntan (had iyo jeer maaha iskutallaab).

Waxaa haboon in la sheego in habka iskudubaridku uu buuxin karo habab kale. Tusaale ahaan, sawirada caadiga ah, waxaad riixi kartaa isku-duwayaasha qaraabada ah (laga bilaabo geeska bidix ee sare ee daaqada / qaybta, oo aan ahayn shaashadda oo dhan) - tani badanaa waa mid la isku halleyn karo, gaar ahaan haddii aad tixgeliso dhererka / ballaca element oo dhan (kadibna xallinta shaashadaha kala duwan ma dhaawici doonto).

Ikhtiyaar kale: u qoondee hal mashiin oo leh goobo deggan oo tijaabo ah (maaha iskutallaab, laakiin xaaladaha qaarkood way fiican tahay).

Aqoonsiga sawirka tixraaca

[+] Iskutallaab
[+-] Marka la eego la isku halayn karo (oo ka wanaagsan habka isku xirka), laakiin wali waxay u baahan tahay tabaha qaar.
[-+] Marka la eego gaabis, sababtoo ah Wuxuu u baahan yahay agabka CPU si loo aqoonsado algorithms-yada
[-] Aqoonsiga qoraalka (OCR), sida caadiga ah, kuma jiro su'aasha => xogta qoraalka lama heli karo. Ilaa hadda inta aan ogahay, xalalka OCR ee jira maaha kuwo la isku halleyn karo oo noocan oo kale ah, oo aan si ballaaran loo isticmaalin (ku soo dhawow faallooyinka haddii tani aysan hore u dhicin).

Qalabka: Sikuli, Lackey (Sikuli-ku habboon, Python saafi ah), PyAutoGUI.

Farsamada gelitaanka

[+] Habka ugu kalsoonida badan, sababtoo ah Waxay kuu oggolaaneysaa inaad qoraal ku raadiso, iyadoon loo eegin sida loo sameeyay nidaamka ama qaab-dhismeedka.
[+] Waxay ku ogolaataa inaad soo saarto xogta qoraalka => fududahay in la xaqiijiyo natiijooyinka imtixaanka.
[+] Sida caadiga ah, kan ugu dhaqsaha badan, sababtoo ah ku dhawaad ​​ma isticmaalo khayraadka CPU.
[-] Way adag tahay in la sameeyo qalab iskutallaab ah: gabi ahaanba dhammaan maktabadaha il-furan waxay taageeraan hal ama laba tignoolajiyada gelitaanka. Windows/Linux/MacOS qofna si buuxda uma taageero marka laga reebo kuwa lacagta la bixiyo sida TestComplete, UFT ama Squish.
[-] Farsamada noocan oo kale ah had iyo jeer mabda' ahaan lama heli karo. Tusaale ahaan, tijaabinta shaashadda rarka gudaha VirtualBox - tan lama samayn karo iyada oo aan la aqoonsan sawirka. Laakiin xaalado badan oo caadi ah, habka gelitaanka weli waa lagu dabaqi karaa. Tani waa laga doodi doonaa si dheeraad ah.

Qalabka: TestStack.White ku jira C#, Winium.Desktop C # (Selenium ku habboon), MS WinApp Driver gudaha C # (Appium ku habboon), pywinauto, pyatom (LDTP waafaqi) Python-UIAutomation-for-Windows, Automation ee Ruby, LDTP (Linux Desktop Testing Project) iyo nooca Daaqadaha jilbiska.

LDTP waxa laga yaabaa inay tahay aaladda isha furan ee kaliya ee iskutallaabta ah (si sax ah, qoyska maktabadaha) oo ku saleysan tignoolajiyada la heli karo. Si kastaba ha ahaatee, maahan mid caan ah. Anigu ma aan isticmaalin nafteyda, laakiin marka loo eego dib u eegista, interface-keedu maaha mid ku habboon. Haddii aad hayso jawaab celin wanaagsan, fadlan ku wadaag faallooyinka.

Tijaabi albaabka dambe (loo yaqaan baaskiil gudaha ah)

Codsiyada isdhaafsiga ah, horumariyayaashu laftoodu waxay inta badan abuuraan hannaan gudaha ah si loo xaqiijiyo tijaabinta. Tusaale ahaan, waxay ku abuuraan adeeg TCP adeega arjiga, imtixaanadu waxay ku xidhmaan oo u soo diraan amarrada qoraalka: waxa la gujiyo, meesha laga helo xogta, iwm. Lagu kalsoonaan karo, laakiin maaha mid caalami ah.

Farsamooyinka gelitaanka desktop-ka aasaasiga ah

Wanaagsan Win32 API

Badi codsiyada Windows ee la qoray ka hor intaan la sii dayn WPF ka dibna Bakhaarka Windows waxaa lagu dhisay Win32 API si uun ama si kale. Kuwaas oo kala ah, MFC, WTL, C++ Builder, Delphi, VB6 - dhammaan qalabkani waxa ay adeegsadaan Win32 API. Xataa Foomamka Daaqadaha ayaa inta badan Win32 API ku habboon.

Qalabka: Saqafka sare (oo la mid ah VB) iyo Python ku duub pyautoit, autohotkey (luuqad gaar ah, waxaa jira interface IDispatch COM), pywinauto (Python) Automation (Ruby) guul 32-autogui (Ruby).

Microsoft UI Automation

Faa'iidada ugu weyn: Farsamada MS UI Automation waxay taageertaa inta badan codsiyada GUI ee Windows iyada oo laga reebayo naadir. Dhibaato: Wax aad ugama fududa in la barto marka loo eego Win32 API. Haddii kale, ninna ma samayn lahaa wax duudduuban.

Dhab ahaantii, kani waa isku-xidhka is-dhexgalka COM ee gaarka ah (badanaa UIAautomationCore.dll), iyo sidoo kale wuxuu haystaa duubka NET ee foomka namespace System.Windows.Automation. Jid ahaan, waxay leedahay bug la soo bandhigay taas oo ay ugu wacan tahay qaar ka mid ah walxaha UI laga yaabo in la waayo. Sidaa darteed, way fiicantahay inaad si toos ah u isticmaasho UIAutomationCore.dll (haddii aad maqashay wax ku saabsan UiaComWrapper ee C #, markaa kani waa).

Noocyada is-dhex-galka COM:

(1) IUknown aasaasiga ah - "Xiddiga xumaanta oo dhan". Heerka ugu hooseeya, marnaba isticmaale-saaxiibtinimo.
(2) IDispatch iyo derivatives (tusaale Excel.Application), kaas oo loo isticmaali karo Python iyadoo la adeegsanayo xirmada win32com.client (oo ay ku jirto pyWin32). Doorashada ugu habboon uguna quruxda badan.
(3) Is-dhexgal gaar ah oo xirmo Python qolo saddexaad ah ay la shaqeyn karto comtypes.

Qalabka: TestStack.White ku jira C#, pywinauto 0.6.0+, Winium.Desktop ku jira C#, Python-UIAutomation-for-Windows (koodka isha ay ka soo jeedaan ee duubayaasha C ee ka sarreeya UIAutomationCore.dll lama shaacin), Automation ee Ruby.

AT-SPI

In kasta oo xaqiiqda ah in ku dhawaad ​​​​dhammaan faasasyada qoyska Linux ay ku dhisan yihiin Nidaamka daaqada X (Fedora 25, “X” waxaa loo beddelay Wayland), “X” waxay kuu oggolaaneysaa inaad ku shaqeyso kaliya daaqadaha heerka sare ah iyo jiirka / kiiboodhka. Falanqaynta faahfaahsan ee badhamada, sanduuqyada liiska, iyo wixii la mid ah, waxaa jira tignoolajiyada AT-SPI. Maamulayaasha daaqadaha ugu caansan waxay leeyihiin waxa loogu yeero AT-SPI diiwaanka daemon, kaas oo siiya GUI otomaatig ah codsiyada (ugu yaraan Qt iyo GTK waa la taageeray).

Qalabka: pyatspi2.

pyatspi2, fikradayda, waxay ka kooban tahay ku-tiirsanaan aad u badan sida PyGObject. Farsamada lafteeda ayaa loo heli karaa sidii maktabad firfircoon oo joogto ah libatspi.so. Waxaa jira a Buug Tixraac. Maktabadda pywinauto waxaan qorsheyneynaa inaan ku hirgelino taageerada AT-SPI sidan: anagoo ku shubaya libatspi.so iyo moduleka ctypes. Dhibaato yar ayaa ka jirta isticmaalka nooca loo baahan yahay oo keliya, sababtoo ah GTK+ iyo codsiyada Qt wax yar bay ka duwan yihiin. Siideynta pywinauto 0.7.0 oo leh taageero buuxda oo Linux ah ayaa la filan karaa qeybta hore ee 2018.

Apple Helitaanka API

MacOS waxa ay leedahay luqadda iswada ee u gaar ah, AppleScript. Si loo hirgeliyo wax sidan oo kale ah Python, dabcan, waxaad u baahan tahay inaad isticmaasho hawlaha ObjectiveC. Bilaabida, waxay umuuqataa, MacOS 10.6, xirmada pyobjc waxay ku jirtaa Python horay loo rakibay. Tani waxay sidoo kale fududeyn doontaa in lagu qoro ku-tiirsanaanta taageerada mustaqbalka ee pywinauto.

Qalabka: Marka lagu daro luqadda qoraalka Apple, waxaa habboon in fiiro gaar ah loo yeesho ATOMac, aka pyatom. Waa interface ku habboon LDTP, laakiin sidoo kale waa maktabad gooni ah. Waxeey heesataa tusaale ahaan otomatiga iTunes ee macOs, uu qoray ardaygaygu. Waxaa jirta dhibaato la yaqaan: waqtiyada dabacsani ma shaqeeyaan (hababka waitFor*). Laakiin guud ahaan, ma aha wax xun.

Sida loogu bilaabo pywinauto

Talaabada ugu horeysa waa in aad isku hubayso kormeeraha shayga GUI (waxa loo yaqaan aaladda Spy). Waxay kaa caawin doontaa inaad arjiga ka barato gudaha: sida kala sarreynta walxaha loo qaabeeyey, waa maxay sifooyinka la heli karo. Kormeerayaasha goobta ugu caansan:

  • Basaas ++ - lagu daray Visual Studio, oo ay ku jiraan Express ama Community Edition. Wuxuu adeegsadaa Win32 API. Waxaa sidoo kale loo yaqaan 'clone' Macluumaadka Daaqada AutoIt.
  • Kormeer.exe - waxaa ku jira Windows SDK. Haddii aad ku rakibtay, markaa 64-bit Windows waxaad ka heli kartaa galka C:Program Files (x86)Windows Kits<winver>binx64. Kormeeraha laftiisa waxaad u baahan tahay inaad doorato hab UI Automation halkii MS AA (Active Accessibility, awoowga UI Automation).

Markaan baarnay codsiga iyada oo la marayo, waxaan dooraneynaa dhabarka dambe ee aan isticmaali doono. Waa ku filan tahay in la qeexo magaca dhabarka marka la abuurayo shayga Codsiga.

  • dhabarka = "win32" - iyadoo si caadi ah loo isticmaalo, waxay si fiican ula shaqeysaa MFC, WTL, VB6 iyo codsiyada kale ee dhaxalka ah.
  • dhabarka = "uia" - dhabarka cusub ee MS UI Automation: wuxuu si fiican ula shaqeeyaa WPF iyo WinForms; sidoo kale u fiican codsiyada Delphi iyo Windows Store; la shaqeeya Qt5 iyo qaar ka mid ah codsiyada Java. Iyo guud ahaan, haddii Inspect.exe ay aragto walxaha iyo hantidooda, markaa dhabarkan ayaa ku habboon. Mabda 'ahaan, daalacashada badankood waxay sidoo kale taageeraan UI Automation (Mozilla sida caadiga ah, iyo Chrome wuxuu u baahan yahay in la quudiyo furaha khadka taliska marka la bilaabayo --force-renderer-accessibilitysi aad u aragto curiyayaasha boggaga Inspect.exe). Dabcan, tartanka Selenium ee aaggan maaha mid suurtagal ah. Kaliya hab kale oo lagula shaqeeyo browserka (waxaa laga yaabaa inay faa'iido u leedahay dhacdo isdhaafsi ah).

Dhibcaha gelitaanka otomaatiga

Codsiga ayaa si weyn loo baaray. Waa waqtigii la samayn lahaa shay Codsiga oo la ordi lahaa ama lagu dhejin lahaa mid hore u socday. Tani ma aha oo kaliya hal-abuurka fasalka caadiga ah subprocess.Popen, oo ah shay la geli karo oo ku xaddidaya dhammaan ficilladaada xuduudaha habka. Tani aad bay faa'iido u leedahay haddii dhowr xaaladood oo arji ah ay socdaan, laakiin ma rabto inaad taabato inta kale.

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

# Опишем окно, которое хотим найти в процессе Notepad.exe
dlg_spec = app.UntitledNotepad
# ждем пока окно реально появится
actionable_dlg = dlg_spec.wait('visible')

Haddii aad rabto in aad maamusho dhawr codsi hal mar, fasalkan ayaa ku caawin doona Desktop. Tusaale ahaan, xisaabiyaha Win10, kala sareynta canaasiirta waxay ku faaftaa dhowr hannaan (ma aha oo kaliya calc.exe). Markaa ma jiro shay Desktop kuma filna.

from subprocess import Popen
from pywinauto import Desktop

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

Shayga xididka ah (Application ama Desktop) waa meesha kaliya ee aad u baahan tahay inaad qeexdo dhabarka dambe. Wax kasta oo kale waxay si hufan ugu dhacaan fikradda "specification-> wrapper", kaas oo mar dambe laga hadli doono.

Tilmaamaha Daaqadaha/Element

Tani waa fikradda udub-dhexaadka ah ee ku dhisan is-dhexgalka pywinauto. Waxaad u sifayn kartaa daaqad/qayb si qiyaas ah ama si faahfaahsan, xataa haddii aanu wali jirin ama uu hore u xidhan yahay. Tilmaamaha daaqada (shay Daaqadaha sifaynta) kaydiyaa shuruudaha lagu raadiyo daaqad ama curiye dhab ah.

Tusaalaha qeexida daaqada oo faahfaahsan:

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

Raadinta daaqada lafteedu waxay ku dhacdaa adoo wacaya habka .wrapper_object(). Waxay u soo celisaa qayb "duubo" gaar ah oo loogu talagalay daaqad/ cunsur dhab ah ama tuuray ElementNotFoundError (mararka qaar ElementAmbiguousError, haddii dhowr walxood la helo, taas oo ah, waxaad u baahan tahay inaad caddeyso shuruudaha raadinta). Tani "duubabka" horeba wuu garanayaa sida loo sameeyo ficilada qaar iyada oo leh shay ama uu ka helo xogta.

Python way qarin kartaa wacitaanka .wrapper_object(), sidaas darteed koodka kama dambaysta ah wuxuu noqonayaa mid gaaban. Waxaan kugula talineynaa in aad u isticmaasho ujeedooyinka saxarada kaliya. Labada sadar ee soo socda waxay sameeyaan isla shay:

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

Waxaa jira shuruudo badan oo raadinta ee qeexida daaqada. Waa kuwan dhawr tusaale:

# могут иметь несколько уровней
app.window(title_re='.* - Notepad$').window(class_name='Edit')

# можно комбинировать критерии (как AND) и не ограничиваться одним процессом приложения
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')

Liiska dhammaan shuruudaha suurtagalka ah ayaa ku jira dukumeentiyada shaqada pywinauto.findwindows.find_elements(...).

Sixirka gelitaanka sifada iyo furaha

Python waxa ay fududaynaysaa in ay abuurto qeexitaannada daaqadaha oo ay si firfircoon u aqoonsadaan sifooyinka shayga (gudaha, habka waa laga gudbay. __getattribute__). Dabcan, xayiraad isku mid ah ayaa lagu soo rogay magaca sifada sida magaca doorsoome kasta (ma geli kartid meelo banaan, hakad, ama xarfo kale oo gaar ah). Nasiib wanaag, pywinauto waxay isticmaashaa waxa loogu yeero "kuwa ugu fican" algorithm raadinta kaas oo u adkeysanaya qoraalada iyo kala duwanaanta yaryar.

app.UntitledNotepad
# то же самое, что
app.window(best_match='UntitledNotepad')

Haddii aad weli u baahan tahay xadhkaha Unicode (tusaale ahaan, luqadda Ruushka), meelo bannaan, iwm., waxaad ku geli kartaa furaha (sida haddii ay tahay qaamuus caadi ah):

app['Untitled - Notepad']
# то же самое, что
app.window(best_match='Untitled - Notepad')

Shanta xeer ee magacyada sixirka

Sidee loo ogaadaa magacyada sixirka caadiga ah? Kuwa loo qoondeeyay curiyaha ka hor inta aan la raadin. Haddii aad qeexday magac ku filan oo la mid ah heerka, markaa cunsurka ayaa la heli doonaa.

  1. Cinwaanka (qoraal, magac): app.Properties.OK.click()
  2. Qoraal ahaan iyo nooca curiyaha: app.Properties.OKButton.click()
  3. Nooca iyo lambarka: app.Properties.Button3.click() (magacyada Button0 и Button1 ku xidhan curiyaha kowaad ee la helay, Button2 - ilaa labaad, ka dibna siday u kala horreeyaan - tani waa sida ay u dhacday taariikh ahaan)
  4. Qoraal taagan (bidix ama sare) iyo nooca: app.OpenDialog.FileNameEdit.set_text("") (waxtar u leh curiyayaasha leh qoraal firfircoon)
  5. Nooca iyo qoraalka gudaha: app.Properties.TabControlSharing.select("General")

Caadiyan laba ama saddex xeer ayaa isku mar lagu dhaqmaa, dhif iyo naadir. Si aad u hubiso magacyada gaarka ah ee loo heli karo shay kasta, waxaad isticmaali kartaa habka print_control_identifiers(). Waxay ku daabici kartaa geed walxo labadaba shaashadda iyo faylka. Qayb kasta, magacyadeeda sixirka caadiga ah waa la daabacaa. Waxa kale oo aad koobi ka dhigi kartaa oo aad ku dhejin kartaa faahfaahin dheeraad ah oo ku saabsan canaasirta ilmaha halkaas. Natiijada qoraalka ayaa u ekaan doonta sidan:

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

Geedka canaasiirta laftiisa badanaa waa maro cag weyn oo weyn.

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

Xaaladaha qaarkood, daabacaadda geedka oo dhan waxay noqon kartaa mid gaabis ah (tusaale ahaan, iTunes waxaa ku jira ilaa saddex kun oo walxood hal tab!), Laakiin waxaad isticmaali kartaa ikhtiyaarka. depth (qoto dheer): depth=1 - element laftiisa, depth=2 - kaliya carruurta dhow, iyo wixii la mid ah. Waxa kale oo lagu qeexi karaa qeexitaannada marka la abuurayo child_window.

tusaalooyin

Waxaan si joogto ah u buuxinaynaa liiska tusaalooyinka ku jira kaydka. Waxaa ka mid ah kuwa ugu dambeeyay, waxaa habboon in la xuso otomatiga ee falanqeeyaha shabakadda WireShark (tani waa tusaale wanaagsan oo ah codsiga Qt5; in kasta oo hawshan lagu xallin karo GUI la'aan, sababtoo ah waxaa jira scapy.Sniffer ka xirmo Python bararsan). Waxa kale oo jira tusaale MS Rinjiga Automation-ka oo wata qalabkiisa Ribbon.

Tusaale kale oo weyn oo uu qoray ardaygeyga: ka jiidaya faylka Explorer.exe bogga Chrome ee Google Drive (wax yar ka dib ayay u guuri doontaa kaydka weyn).

Iyo, dabcan, tusaale ahaan isu-diiwaangelinta kiiboodhka (furayaasha kulul) iyo dhacdooyinka jiirka:
jillaab_iyo_dhegeyso.py.

Mahadnaq

Mahad gaar ah ayaa leh kuwa had iyo jeer gacan ka geysta horumarinta mashruuca. Aniga iyo Valentine Tani waa hiwaayad joogto ah. Laba ka mid ah ardaydayda UNN ayaa dhawaan ka difaacay shahaadadooda koowaad ee jaamacadda mawduucan. Александр waxa uu gacan weyn ka geystay taageerada MS UI Automation oo dhawaan bilaabay samaynta koronto-dhaliye toos ah oo ku salaysan mabda'a "diwaangelinta dib-u-ciyaarista" ee ku salaysan sifooyinka qoraalka (tani waa qaabka ugu adag), ilaa hadda kaliya "uia" dhabarka. Ivan waxay horumarinaysaa dhabarka cusub ee Linux oo ku salaysan AT-SPI (modules mouse и keyboard ku saleysan Python-xlib - horayba u sii daayay 0.6.x).

Tan iyo markii aan wax ku barayay koorso gaar ah oo ku saabsan automation-ka Python in muddo ah, ardayda sayidyada qaarkood waxay qabtaan shaqo-guri, iyagoo fulinaya astaamo yar yar ama tusaalayaal otomaatig ah. Waxyaabaha muhiimka ah ee marxaladda cilmi-baarista ayaa sidoo kale mar ay soo saareen ardaydu. Inkasta oo mararka qaarkood ay tahay inaad si adag ula socoto tayada koodhka. Falanqeeyayaasha joogtada ah (QuantifiedCode, Codacy iyo Landscape) iyo imtixaanada tooska ah ee daruuraha (adeegga AppVeyor) oo leh kood daboolan oo ku dhow 95% ayaa wax badan ka caawinaya tan.

Sidoo kale mahadsanid qof kasta oo ka taga dib u eegista, kor u qaada dhiqlaha oo soo diray codsiyo jiid!

Ополнительные ресурсы

Su'aalaha ayaan la soconaa ku dheji StackOverflow (dhawaan soo muuqday ku calaamadee nooca Ruushka ee SO) iyo by keyword on Toaster. waxaa jira Ku sheekeysiga luqadda Ruushka Gitter.

Waxaan cusbooneysiineynaa bil kasta qiimaynta maktabadaha il-furan ee imtixaanka GUI. Marka la eego tirada xiddigaha ee GitHub, kaliya Autohotkey (waxay leeyihiin bulsho aad u weyn iyo taariikh dheer) iyo PyAutoGUI si dhakhso leh ayey u koraan (inta badan sababtoo ah caannimada buugaagta qoraageeda Al Sweigart: “Automate the Boring Stuff with Python" iyo kuwo kale).

Source: www.habr.com

Add a comment