Manao automatique ny GUI desktop amin'ny Python + pywinauto: ny fomba fanaovana namana amin'ny MS UI Automation

Tranomboky Python pywinauto dia tetik'asa misokatra ho an'ny automatique ny fampiharana GUI desktop amin'ny Windows. Tao anatin'ny roa taona lasa, nisy endri-javatra lehibe vaovao niseho tao:

  • Fanohanana ny teknolojia MS UI Automation. Ny interface dia mitovy, ary ankehitriny dia manohana: WinForms, WPF, Qt5, Windows Store (UWP) sy ny sisa - saika ny zavatra rehetra ao amin'ny Windows.
  • Rafitra backends/plugins (amin'izao fotoana izao dia misy roa amin'izy ireo eo ambanin'ny kapa: default "win32" ary vaovao "uia"). Avy eo dia mandroso tsara mankany amin'ny sehatra cross-platform isika.
  • Win32 hooks ho an'ny totozy sy fitendry (fanalahidy mafana amin'ny fanahin'ny pyHook).

Hanome topimaso fohy momba izay misy amin'ny loharano misokatra ho an'ny automation desktop ihany koa izahay (tsy misy fampitahana matotra).

Ity lahatsoratra ity dia ampahany amin'ny tatitra avy amin'ny fihaonambe SQA Days 20 tany Minsk (horonam-peo ΠΈ tsary), ampahany amin'ny dikan-teny Rosiana Fahazoana Started Guide ho an'ny pywinauto.

Andeha isika hanomboka amin'ny topimaso fohy momba ny loharano misokatra amin'ity faritra ity. Ho an'ny fampiharana GUI desktop, ny zava-drehetra dia somary sarotra kokoa noho ny amin'ny tranonkala, izay misy Selenium. Ireto ny fomba fiasa lehibe:

Fomba fandrindrana

Hardcode ny teboka kitiho, manantena izahay fa hahita fahombiazana.
[+] Cross-platform, mora ampiharina.
[+] Mora ny manao β€œrecord-replay” firaketana fitsapana.
[-] Ny tsy miovaova indrindra amin'ny fanovana ny famahana ny efijery, ny lohahevitra, ny endri-tsoratra, ny haben'ny varavarankely, sns.
[-] Ilaina ny ezaka fanohanana goavana;
[-] Manao automatique fotsiny ny hetsika;

Fitaovana (cross-platform): autopy, PyAutoGUI, PyUserInput sy ny maro hafa. Amin'ny ankapobeny, ny fitaovana saro-pady kokoa dia ahitana an'io fampiasa io (tsy voatery miampita sehatra).

Tsara ny milaza fa ny fomba fandrindrana dia afaka mameno ny fomba fiasa hafa. Ohatra, ho an'ny sary mahazatra, azonao atao ny manindry ny koordinate havanana (avy amin'ny zoro ambony havia amin'ny varavarankely/singa, fa tsy ny efijery manontolo) - matetika azo itokisana izany, indrindra raha raisinao ny halavany / sakan'ny singa iray manontolo (dia tsy handratra ny famahana ny efijery samihafa).

Safidy iray hafa: omeo milina iray ihany miaraka amin'ny filaharana stable ho an'ny fitsapana (tsy cross-platform, fa amin'ny toe-javatra sasany dia tsara).

Famantarana sary reference

[+] Cross-platform
[+-] Azo itokisana (tsara kokoa noho ny fomba fandrindrana), saingy mbola mila fitaka.
[-+] Somary miadana, satria Mitaky loharanon-karena CPU ho an'ny algorithma fantatra.
[-] Ny fanekena ny soratra (OCR), amin'ny ankapobeny, dia tsy misy fanontaniana => tsy azo alaina ny angona lahatsoratra. Raha ny fahalalako azy, ny vahaolana OCR efa misy dia tsy azo ianteherana loatra amin'ity karazana asa ity, ary tsy ampiasaina betsaka (tonga ao amin'ny fanehoan-kevitra raha tsy izany no izy).

fitaovana: Sikuli, mpanompon'andriana (Sikuli-mifanaraka, Python madio), PyAutoGUI.

Teknolojia fidirana

[+] Ny fomba azo antoka indrindra, satria mamela anao hikaroka amin'ny alΓ lan'ny lahatsoratra, na inona na inona adika amin'ny rafitra na rafitra.
[+] Mamela anao haka angona lahatsoratra => mora kokoa ny manamarina ny valin'ny fitsapana.
[+] Toy ny fitsipika, ny haingana indrindra, satria saika tsy mandany loharanon-karena CPU.
[-] Sarotra ny manao fitaovana mifanandrify amin'ny sehatra: tena manohana teknolojia fidirana iray na roa ny tranomboky misokatra rehetra. Windows/Linux/MacOS dia tsy tohanan'iza na iza afa-tsy ny karama toa ny TestComplete, UFT na Squish.
[-] Ny teknolojia toy izany dia tsy azo ampiasaina amin'ny fitsipika. Ohatra, mizaha ny efijery fandefasana ao anaty VirtualBox - tsy azo atao izany raha tsy misy ny fanekena sary. Saingy amin'ny tranga mahazatra maro dia mbola azo ampiharina ny fomba fidirana. Hodinihina bebe kokoa izany.

fitaovana: TestStack.White amin'ny C#, Winium.Desktop amin'ny C# (Selenium compatible), MS WinApp Driver amin'ny C# (Appium compatible), pywinauto, pyatom (Mifanaraka amin'ny LDTP) Python-UIAutomation-for-Windows, RAutomation amin'ny Ruby, LDTP (Linux Desktop Testing Project) sy ny dikan-ny Windows vipera.

LDTP angamba no hany fitaovana open-source cross-platform (ny marimarina kokoa, fianakavian'ny tranomboky) mifototra amin'ny teknolojian'ny fidirana. Tsy dia malaza loatra anefa izy io. Tsy nampiasa izany ny tenako, fa araka ny hevitra, ny interface tsara dia tsy mety indrindra. Raha manana hevitra tsara ianao dia zarao amin'ny fanehoan-kevitra.

Test backdoor (aka bisikileta anatiny)

Ho an'ny rindranasa cross-platform, ny mpamorona ny tenany dia mamorona mekanika anatiny mba hiantohana ny fahatsapan-tena. Ohatra, mamorona serivisy TCP serivisy ao amin'ny fampiharana izy ireo, mifandray amin'izany ny fitsapana ary mandefa baiko an-tsoratra: inona no kitihina, aiza no hahazoana ny angona, sns. Azo ianteherana, fa tsy manerana izao rehetra izao.

Teknolojian'ny fidirana amin'ny desktop fototra

Win32 API taloha tsara

Ny ankamaroan'ny fampiharana Windows nosoratana talohan'ny famoahana ny WPF ary avy eo ny Windows Store dia naorina tamin'ny Win32 API amin'ny fomba iray na hafa. Izany hoe, MFC, WTL, C++ Builder, Delphi, VB6 - ireo fitaovana rehetra ireo dia mampiasa ny Win32 API. Na ny Windows Forms aza dia mifanentana amin'ny Win32 API.

fitaovana: Eo amin'ny tafo (mitovy amin'ny VB) sy Python wrapper pyautoit, AutoHotkey (fiteny manokana, misy ny interface IDispatch COM), pywinauto (Python) RAutomation (Ruby) win32-autogui (Ruby).

Microsoft UI Automation

Ny tombony lehibe indrindra: Ny teknolojia MS UI Automation dia manohana ny ankamaroan'ny rindranasa GUI amin'ny Windows miaraka amin'ny tsy fahita firy. Olana: Tsy mora kokoa ny mianatra noho ny Win32 API. Raha tsy izany dia tsy hisy hanao fonon-tanana eo amboniny.

Raha ny marina, ity dia andian-tsarimihetsika COM mahazatra (indrindra UIAutomationCore.dll), ary manana fonosana .NET amin'ny endrika namespace System.Windows.Automation. Raha ny tokony ho izy dia manana bug nampidirina izy io noho ny tsy fahampian'ny singa UI sasany. Noho izany, tsara kokoa ny mampiasa UIAutomationCore.dll mivantana (raha nandre momba ny UiaComWrapper amin'ny C# ianao, dia izao no izy).

Karazana fifandraisana COM:

(1) Basic IUknown - β€œny fototry ny ratsy rehetra”. Ny ambaratonga ambany indrindra, tsy mora ampiasaina.
(2) IDispatch sy derivatives (oh Excel.Application), izay azo ampiasaina amin'ny Python amin'ny fampiasana ny fonosana win32com.client (tafiditra amin'ny pyWin32). Ny safidy mety sy tsara tarehy indrindra.
(3) Fifandraisana manokana izay azon'ny fonosana Python an'ny antoko fahatelo miasa comtypes.

fitaovana: TestStack.White amin'ny C#, pywinauto 0.6.0+, Winium.Desktop amin'ny C#, Python-UIAutomation-for-Windows (tsy navoaka ny kaody loharanon'izy ireo ho an'ny fonosana C amin'ny UIAutomationCore.dll), RAutomation amin'ny Ruby.

AT-SPI

Na dia eo aza ny zava-misy fa saika ny famaky rehetra an'ny fianakaviana Linux dia miorina amin'ny X Window System (ao amin'ny Fedora 25, ny "X's" dia novaina ho Wayland), ny "X's" dia mamela anao hiasa amin'ny varavarankely ambony indrindra sy ny totozy / fitendry. Ho an'ny famakafakana amin'ny antsipiriany momba ny bokotra, boaty lisitra, sy ny sisa, dia misy ny teknolojia AT-SPI. Ny mpitantana varavarankely malaza indrindra dia manana antsoina hoe AT-SPI registry daemon, izay manome GUI mandeha ho azy ho an'ny fampiharana (farafaharatsiny Qt sy GTK no tohanana).

fitaovana: pyatspi2.

pyatspi2, raha ny hevitro, dia misy fiankinan-doha be loatra toa ny PyGObject. Ny teknΓ΄lΓ΄jia mihitsy dia azo alaina toy ny tranomboky mavitrika mahazatra libatspi.so. Misy Boky torolΓ lana. Ho an'ny tranomboky pywinauto dia mikasa ny hampihatra ny fanohanan'ny AT-SPI izahay amin'ity fomba ity: amin'ny alΓ lan'ny fametahana libatspi.so sy ny module ctypes. Misy olana kely fotsiny amin'ny fampiasana ny dikan-teny ilaina, satria ho an'ny fampiharana GTK + sy Qt dia hafa kely izy ireo. Ny famoahana ny pywinauto 0.7.0 miaraka amin'ny fanohanana Linux feno dia azo antenaina amin'ny tapany voalohany amin'ny 2018.

Apple Accessibility API

MacOS dia manana ny fiteniny manokana, AppleScript. Mba hampiharana zavatra toy izany amin'ny Python, mazava ho azy, mila mampiasa fiasa avy amin'ny ObjectiveC ianao. Manomboka, toa, miaraka amin'ny MacOS 10.6, ny fonosana pyobjc dia tafiditra ao amin'ny Python efa napetraka. Izany dia hanamora ihany koa ny lisitry ny fiankinan-doha amin'ny fanohanana ho avy amin'ny pywinauto.

Fitaovana: Ho fanampin'ny fiteny Apple Script, ilaina ny mandinika ATOMac, aka pyatom. Mifanaraka amin'ny LDTP izy io, fa tranomboky tokana ihany koa. Manana izany Ohatra amin'ny automation iTunes amin'ny macOS, nosoratan'ny mpianatro. Misy olana fantatra: tsy mandeha ny fotoana miovaova (fomba waitFor*). Saingy amin'ny ankapobeny, tsy zavatra ratsy izany.

Ahoana ny fomba hanombohana pywinauto

Ny dingana voalohany dia ny fiadiana ny tenanao amin'ny inspektera zavatra GUI (izay antsoina hoe fitaovana Spy). Hanampy anao handalina ny fampiharana avy ao anatiny izany: ahoana ny firafitry ny ambaratongan'ny singa, inona ny fananana azo. Ny mpanara-maso ny tranokala malaza indrindra:

  • Mpitsikilo++ - miaraka amin'ny Visual Studio, anisan'izany ny Express na Community Edition. Mampiasa Win32 API. Fantatra ihany koa ny kloneny AutoIt Window Info.
  • Inspect.exe - tafiditra ao amin'ny Windows SDK. Raha efa nametraka azy io ianao, dia amin'ny Windows 64-bit dia azonao atao ny mahita azy ao amin'ny lahatahiry C:Program Files (x86)Windows Kits<winver>binx64. Ao amin'ny inspektera mihitsy dia mila misafidy fomba iray ianao UI Automation fa tsy MS AA (Active Accessibility, razamben'ny UI Automation).

Rehefa avy nandinika ny fampiharana izahay dia misafidy ny backend izay hampiasainay. Ampy ny mamaritra ny anaran'ny backend rehefa mamorona ny Application object.

  • backend=”win32β€³ - raha ampiasaina amin'ny alΓ lan'ny default, dia miasa tsara amin'ny MFC, WTL, VB6 ary fampiharana lova hafa.
  • backend=”uia” - backend vaovao ho an'ny MS UI Automation: miasa tsara amin'ny WPF sy WinForms; tsara ihany koa ho an'ny fampiharana Delphi sy Windows Store; miasa miaraka amin'ny Qt5 sy ny fampiharana Java sasany. Ary amin'ny ankapobeny, raha mahita ny singa sy ny fananany ny Inspect.exe, dia mety io backend io. Amin'ny ankapobeny, ny ankamaroan'ny navigateur koa dia manohana ny UI Automation (Mozilla amin'ny alΓ lan'ny default, ary ny Chrome dia mila omena ny fanalahidin'ny baiko rehefa manomboka. --force-renderer-accessibilitymba hahitana singa amin'ny pejy ao amin'ny Inspect.exe). Mazava ho azy fa zara raha azo atao ny fifaninanana amin'ny Selenium amin'ity sehatra ity. Fomba iray hafa ahafahana miasa amin'ny navigateur (mety ho ilaina amin'ny scenario isan-karazany).

Toerana fidirana ho an'ny automation

Nohadihadiana fatratra ny fampiharana. Fotoana izao hamoronana zavatra Application sy hampandehanana azy na hametahana amin'ny zavatra efa mandeha. Tsy clone an'ny kilasy mahazatra fotsiny izany subprocess.Popen, izany hoe zavatra fampidirana izay mametra ny hetsika rehetra ataonao amin'ny sisin'ny dingana. Tena ilaina izany raha misy tranga maromaro amin'ny fampiharana mandeha, saingy tsy te hikasika ny ambiny ianao.

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

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

Raha te hitantana fampiharana maromaro indray mandeha ianao dia hanampy anao ity kilasy ity Desktop. Ohatra, ao amin'ny kalkulator amin'ny Win10, ny ambaratongan'ny singa dia miparitaka amin'ny dingana maromaro (tsy hoe calc.exe). Ka tsy misy objectif Desktop tsy ampy.

from subprocess import Popen
from pywinauto import Desktop

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

Zavatra fototra (Application na Desktop) no hany toerana tokony hamaritana ny backend. Ny zavatra hafa rehetra dia latsaka mangarahara amin'ny foto-kevitra "specification->wrapper", izay hodinihina any aoriana.

Famaritana ny varavarankely / singa

Ity no foto-kevitra fototra iorenan'ny interface pywinauto. Azonao atao ny mamaritra ny varavarankely/singa iray amin'ny antsipiriany na amin'ny antsipiriany, na dia mbola tsy misy na efa mihidy aza. Famaritana ny varavarankely (object WindowSpecification) mitahiry ny fepetra ahafahana mikaroka varavarankely na singa tena izy.

Ohatra amin'ny famaritana ny varavarankely amin'ny antsipiriany:

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

Ny fitadiavana varavarankely dia mitranga amin'ny fiantsoana ny fomba .wrapper_object(). Mamerina "wrapper" ho an'ny varavarankely / singa tena izy na manipy ElementNotFoundError (indraindray ElementAmbiguousError, raha misy singa maromaro hita, izany hoe mila manazava ny fepetra fikarohana ianao). Ity "wrapper" ity dia efa mahay manao hetsika sasantsasany miaraka amin'ny singa iray na mandray angona avy aminy.

Afaka manafina ny antso i Python .wrapper_object(), ka lasa fohy kokoa ny kaody farany. Manoro hevitra izahay hampiasa azy io ho an'ny tanjona debugging ihany. Mitovy tanteraka ny andalana roa manaraka:

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

Betsaka ny fepetra fikarohana momba ny fanondroana varavarankely. Ireto misy ohatra vitsivitsy:

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

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

Ny lisitry ny fepetra rehetra azo atao dia ao amin'ny asa docs pywinauto.findwindows.find_elements(…).

Ny majika amin'ny fidirana amin'ny toetra sy ny fanalahidy

Ny Python dia manamora ny famoronana fikandrana manokana sy ny hamantatra ny toetran'ny zavatra amin'ny fomba mavitrika (ao anatiny, ny fomba dia nosoloina __getattribute__). Mazava ho azy, fameperana mitovy ihany no apetraka amin'ny anaran'ny toetra toy ny amin'ny anaran'ny variable rehetra (tsy afaka mampiditra habaka, faingo, na tarehintsoratra manokana hafa ianao). Soa ihany fa mampiasa algorithm fikarohana atao hoe "mifanandrina tsara indrindra" i pywinauto izay mahatohitra ny lesoka sy ny fiovaovana kely.

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

Raha mbola mila tady Unicode ianao (ohatra, ho an'ny teny Rosiana), habaka, sns., azonao idirana amin'ny alalan'ny fanalahidy (toy ny hoe rakibolana mahazatra):

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

Fitsipika dimy momba ny anarana mahagaga

Ahoana no ahafantarana ny anarana majika mahazatra? Ireo izay voatendry amin'ny singa alohan'ny hikaroka. Raha namaritra anarana mitovy amin'ny fenitra ianao, dia ho hita ilay singa.

  1. Amin'ny lohateny (soratra, anarana): app.Properties.OK.click()
  2. Amin'ny lahatsoratra sy amin'ny karazana singa: app.Properties.OKButton.click()
  3. Amin'ny karazana sy isa: app.Properties.Button3.click() (anarana Button0 ΠΈ Button1 mifamatotra amin'ny singa voalohany hita, Button2 - mankany amin'ny faharoa, ary avy eo amin'ny filaharana - izany no nitranga ara-tantara)
  4. Amin'ny lahatsoratra static (ankavia na ambony) ary amin'ny karazana: app.OpenDialog.FileNameEdit.set_text("") (ilaina ho an'ny singa misy lahatsoratra mavitrika)
  5. Amin'ny karazana sy amin'ny lahatsoratra ao anatiny: app.Properties.TabControlSharing.select("General")

Matetika ny fitsipika roa na telo no ampiharina amin'ny fotoana iray, mahalana kokoa. Mba hanamarinana izay anarana manokana misy ho an'ny singa tsirairay dia azonao ampiasaina ny fomba print_control_identifiers(). Izy io dia afaka manonta hazo misy singa na amin'ny efijery na amin'ny rakitra. Ho an'ny singa tsirairay dia atao pirinty ny anarana majika mahazatra. Azonao atao ihany koa ny mandika sy mametaka ny antsipiriany bebe kokoa momba ny singa ankizy avy ao. Ny vokatra ao amin'ny script dia ho toy izao:

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

Ny hazo misy singa dia matetika lamban-tongotra lehibe.

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

Amin'ny toe-javatra sasany, ny fanontana ny hazo iray manontolo dia mety ho miadana (ohatra, ao amin'ny iTunes dia misy singa telo arivo amin'ny tabilao iray!), Fa azonao atao ny mampiasa ny safidy. depth (lalina): depth=1 - ny singa tena, depth=2 - ny ankizy avy hatrany, sy ny sisa. Azo faritana ihany koa amin'ny famaritana rehefa mamorona child_window.

ohatra

Mameno tsy tapaka izahay lisitry ny ohatra ao amin'ny repository. Amin'ireo vao haingana, dia tsara ny manamarika ny automatique ny WireShark network analyzer (ohatra tsara amin'ny fampiharana Qt5 ity, na dia azo vahana aza ity asa ity raha tsy misy GUI, satria misy scapy.Sniffer avy amin'ny fonosana Python scapy). Misy ohatra iray amin'ny MS Paint automation miaraka amin'ny Ribbon toolbar.

Ohatra lehibe iray hafa nosoratan'ny mpianatra iray: misintona rakitra avy amin'ny explorer.exe mankany amin'ny pejy Chrome ho an'ny Google Drive (hifindra any amin'ny tahiry lehibe izy io aoriana kely).

Ary mazava ho azy, ohatra iray amin'ny famandrihana amin'ny fitendry (fanalahidy mafana) sy hetsika totozy:
hook_and_listen.py.

fankatelemana

Isaorana manokana ireo manampy hatrany amin’ny fampandrosoana ny tetikasa. Ho ahy ary Valentine Fialam-boly maharitra izany. Ny roa tamin'ireo mpianatro avy ao amin'ny UNN dia niaro ny mari-pahaizana bakalorea momba ity lohahevitra ity. АлСксандр nanao fandraisana anjara lehibe hanohanana ny MS UI Automation ary vao haingana no nanomboka nanamboatra kaody mandeha ho azy mifototra amin'ny foto-kevitra "record-playback" mifototra amin'ny fananana lahatsoratra (io no singa sarotra indrindra), hatreto dia ho an'ny backend "uia". Ivan dia mamolavola backend vaovao ho an'ny Linux mifototra amin'ny AT-SPI (modules mouse ΠΈ keyboard mifototra python-xlib - efa ao amin'ny famoahana 0.6.x).

Satria efa elaela aho no nampianatra taranja manokana momba ny automation amin'ny Python, ny mpianatra master sasany dia manao devoara, manatanteraka endri-javatra kely na ohatra momba ny automatique. Ny zava-dehibe sasany teo amin'ny sehatry ny fikarohana ihany koa dia hitan'ny mpianatra indray mandeha. Na dia tsy maintsy manara-maso mafy ny kalitaon'ny code aza ianao indraindray. Ny mpandinika static (QuantifiedCode, Codacy ary Landscape) ary ny fitsapana mandeha ho azy ao amin'ny rahona (serivisy AppVeyor) miaraka amin'ny fandrakofana kaody manodidina ny 95% dia manampy betsaka amin'izany.

Misaotra ihany koa ho an'izay rehetra mamela hevitra, manangana bibikely ary mandefa fangatahana fisarihana!

Loharano fanampiny

Manaraka fanontaniana izahay tag amin'ny StackOverflow (nipoitra vao haingana tag amin'ny dikan-teny Rosiana an'ny SO) ary amin'ny teny fanalahidy ao amin'ny Toaster. Misy Miresaka amin'ny teny rosiana amin'ny Gitter.

Manavao isam-bolana izahay fanombanana ny tranomboky misokatra ho an'ny fitsapana GUI. Raha jerena ny isan'ny kintana ao amin'ny GitHub, Autohotkey ihany (manana vondrom-piarahamonina tena lehibe sy tantara lava be izy ireo) ary PyAutoGUI no mitombo haingana kokoa (noho ny lazan'ny boky nosoratan'i Al Sweigart, mpanoratra azy: Python" sy ny hafa).

Source: www.habr.com

Mividiana fampiantranoana azo antoka ho an'ny tranokala misy fiarovana DDoS, mpizara VPS VDS πŸ”₯ Mividiana fampiantranoana tranonkala azo antoka miaraka amin'ny fiarovana DDoS, mpizara VPS VDS | ProHoster