Python tsev qiv ntawv β yog ib qhov project qhib rau kev ua kom cov desktop GUI applications ua haujlwm tau zoo WindowsTau ob xyoos dhau los no, nws tau ntxiv cov yam ntxwv tshiab tseem ceeb:
- Kev txhawb nqa rau MS UI Automation thev naus laus zis. Lub interface tseem zoo li qub, thiab tam sim no txhawb nqa WinForms, WPF, Qt5, Windows Khw (UWP) thiab lwm yam - yuav luag txhua yam uas nyob rau Windows.
- System ntawm backends/plugins (tam sim no muaj ob ntawm lawv nyob rau hauv lub hood: default
"win32"thiab tshiab"uia"). Tom qab ntawd peb txav mus rau qhov sib txawv ntawm lub platform. - Win32 hooks rau nas thiab keyboard (cov yawm sij kub hauv tus ntsuj plig ntawm pyHook).
Peb tseem yuav muab cov ntsiab lus luv luv ntawm dab tsi muaj nyob rau hauv qhib qhov chaw rau desktop automation (tsis suav tias yog qhov sib piv loj).
Kab lus no yog ib feem ntawm daim ntawv tshaj tawm los ntawm SQA Hnub 20 lub rooj sib tham hauv Minsk ( ΠΈ ), ib feem ntawm Russia rau pywinauto.
- Cov txheej txheem yooj yim
- Basic desktop accessibility technologies
Cia peb pib nrog cov ntsiab lus luv luv ntawm qhov qhib qhov chaw hauv cheeb tsam no. Rau desktop GUI daim ntawv thov, txhua yam yog me ntsis nyuab dua rau lub vev xaib, uas muaj Selenium. Nov yog cov txheej txheem tseem ceeb:
Coordinate method
Hardcode cov nyem cov ntsiab lus, peb cia siab rau kev vam meej hits.
[+] Hla-platform, yooj yim rau kev siv.
[+] Nws yooj yim rau "sau-replay" cov ntaub ntawv kaw cia.
[-] Qhov tsis ruaj khov tshaj plaws rau kev hloov pauv kev daws teeb meem, lub ntsiab lus, fonts, qhov loj me, thiab lwm yam.
[-] yuav tsum muaj kev txhawb nqa loj heev; nws feem ntau yooj yim dua los tsim cov kev sim los ntawm kos los yog sim manually.
[-] Automates nkaus xwb; muaj lwm txoj hauv kev rau kev txheeb xyuas thiab khaws cov ntaub ntawv.
Cov cuab yeej (cross-platform): , , thiab ntau lwm tus. Feem ntau, cov cuab yeej siv ntau dua suav nrog cov haujlwm no (tsis yog ib txwm hla lub platform).
Nws yog tsim nyog hais tias txoj kev sib koom tes tuaj yeem ua tiav lwm txoj hauv kev. Piv txwv li, rau cov duab kev cai, koj tuaj yeem nyem rau ntawm tus txheeb ze sib koom ua ke (los ntawm sab laug sab laug ntawm lub qhov rais / lub ntsiab lus, thiab tsis yog tag nrho lub vijtsam) - qhov no feem ntau txhim khu kev qha, tshwj xeeb tshaj yog tias koj coj mus rau hauv tus account qhov ntev / dav. tag nrho cov khoom (tom qab ntawd cov kev daws teeb meem sib txawv yuav tsis mob).
Lwm qhov kev xaiv: faib tsuas yog ib lub tshuab nrog qhov chaw ruaj khov rau kev sim (tsis yog hla lub platform, tab sis qee zaus nws zoo).
Reference duab paub
[+] Hla-platform
[+-] Tus txheeb ze txhim khu kev qha (zoo dua li txoj kev sib koom tes), tab sis tseem xav tau qee qhov kev ua kom yuam kev.
[-+] Kev qeeb qeeb, vim Xav tau CPU cov peev txheej rau kev lees paub algorithms.
[-] Text recognition (OCR), raws li txoj cai, yog tawm ntawm lo lus nug => ntawv cov ntaub ntawv tsis tuaj yeem tau. Raws li kuv paub, cov kev daws teeb meem OCR uas twb muaj lawm tsis muaj kev ntseeg siab rau hom haujlwm no, thiab tsis tau siv dav (zoo siab txais tos hauv cov lus yog tias qhov no tsis yog lawm).
Cov cuab yeej: , (Sikuli-tshaj, Python ntshiab), .
Kev siv technology
[+] Txoj kev ntseeg siab tshaj plaws, vim tso cai rau koj mus tshawb los ntawm cov ntawv nyeem, tsis hais nws yuav ua li cas los ntawm qhov system lossis lub moj khaum.
[+] Tso cai rau koj rho tawm cov ntawv nyeem => yooj yim dua los txheeb xyuas cov txiaj ntsig kev xeem.
[+] Raws li txoj cai, ceev tshaj plaws, vim siv yuav luag tsis muaj peev txheej CPU.
[-] Nws nyuaj rau ua ib lub cuab yeej hla-platform: kiag li txhua lub tsev qiv ntawv qhib-qhov chaw txhawb nqa ib lossis ob lub thev naus laus zis nkag tau yooj yim. Windows/Linux/MacOS tsis muaj leej twg txhawb nqa tag nrho tsuas yog cov uas them nyiaj xws li TestComplete, UFT lossis Squish xwb.
[-] Cov thev naus laus zis zoo li no tsis yog ib txwm muaj nyob hauv txoj cai. Piv txwv li, kuaj lub vijtsam thauj khoom hauv VirtualBox - qhov no tsis tuaj yeem ua tsis tau yam tsis muaj duab pom. Tab sis nyob rau hauv ntau qhov xwm txheej classic, txoj hauv kev nkag mus tau tseem siv tau. Qhov no yuav tau tham ntxiv.
Cov cuab yeej: hauv C#, hauv C# (Selenium tshaj), hauv C# (Appium tshaj), , (LDTP tau tshaj) , hauv Ruby, (Linux Qhov Kev Ntsuas Desktop) thiab nws Windows version .
LDTP yog kab tias tsuas yog cov cuab yeej hla-platform qhib (ntau qhov tseeb, ib tsev neeg ntawm cov tsev qiv ntawv) raws li kev siv thev naus laus zis. Txawm li cas los xij, nws tsis yog nrov heev. Kuv tsis tau siv nws tus kheej, tab sis raws li kev txheeb xyuas, nws qhov interface tsis yog qhov yooj yim tshaj plaws. Yog tias koj muaj lus pom zoo, thov qhia rau hauv cov lus.
Test backdoor (aka sab hauv tsev tsheb kauj vab)
Rau cov ntawv thov hla lub platform, cov neeg tsim khoom lawv tus kheej feem ntau tsim cov txheej txheem sab hauv kom ntseeg tau tias muaj kev sib tw. Piv txwv li, lawv tsim ib qho kev pabcuam TCP server hauv daim ntawv thov, kev sim txuas rau nws thiab xa cov lus txib: nyem rau ntawm dab tsi, qhov twg kom tau txais cov ntaub ntawv, thiab lwm yam. Kev ntseeg tau, tab sis tsis yog universal.
Basic desktop accessibility technologies
Zoo qub Win32 API
Feem Ntau Windows cov ntawv thov sau ua ntej WPF raug tso tawm thiab tom qab Windows Cov khw muag khoom, tau tsim los ntawm ib txoj kev lossis lwm txoj hauv kev ntawm Win32 API. Uas yog, MFC, WTL, C ++ Builder, Delphi, VB6 - tag nrho cov cuab yeej no siv Win32 API. Txawm tias Windows Cov ntawv feem ntau yog sib xws nrog Win32 API.
Cov cuab yeej: (zoo ib yam li VB) thiab Python wrapper , (tus kheej hom lus, muaj IDispatch COM interface), (Python) (Ruby) (Ruby).
Microsoft UI Automation
Qhov zoo tshaj plaws: MS UI Automation thev naus laus zis txhawb nqa feem ntau ntawm GUI daim ntawv thov ntawm Windows Tsuas yog qee zaum xwb. Qhov teeb meem: nws tsis yooj yim kawm dua li Win32 API. Txwv tsis pub, yuav tsis muaj leej twg tsim cov ntawv qhwv rau nws.
Qhov tseeb, qhov no yog cov txheej txheem kev cai COM interfaces (tseem ceeb UIAutomationCore.dll), thiab tseem muaj .NET wrapper hauv daim ntawv namespace System.Windows.Automation. Los ntawm txoj kev, nws muaj cov kab laum qhia vim tias qee cov ntsiab lus UI yuav ploj mus. Yog li ntawd, nws yog qhov zoo dua los siv UIAutomationCore.dll ncaj qha (yog tias koj tau hnov ββββtxog UiaComWrapper hauv C#, ces qhov no yog nws).
Hom ntawm COM interfaces:
(1) Basic IUknown - "lub hauv paus ntawm txhua yam kev phem". Qib qis tshaj plaws, tsis txhob siv tus phooj ywg.
(2) IDispatch thiab derivatives (eg Excel.Application), uas tuaj yeem siv tau hauv Python siv lub pob win32com.client (suav nrog pyWin32). Qhov kev xaiv yooj yim tshaj plaws thiab zoo nkauj.
(3) Custom interfaces uas lub pob Python thib peb tuaj yeem ua haujlwm nrog .
Cov cuab yeej: hauv C#, Xyoo 0.6.0+, hauv C#, (lawv qhov chaws code rau C wrappers tshaj UIAutomationCore.dll tsis qhia tawm), hauv Ruby.
AT-SPI
Txawm hais tias yuav luag txhua tus neeg hauv tsev neeg Linux Ua los ntawm X Window System (hauv Fedora 25, "X" tau hloov los ntawm Wayland), "X" tsuas yog tso cai rau koj ua haujlwm cov qhov rai sab saud thiab nas / keyboard. Rau kev tshuaj xyuas ntxaws ntxaws ntawm cov nyees khawm, cov thawv teev npe, thiab lwm yam, muaj AT-SPI thev naus laus zis. Cov thawj tswj qhov rai nrov tshaj plaws muaj qhov hu ua AT-SPI registry daemon, uas muab GUI tsis siv neeg rau cov ntawv thov (tsawg kawg Qt thiab GTK tau txhawb nqa).
Cov cuab yeej: .
pyatspi2, hauv kuv lub tswv yim, muaj ntau qhov kev cia siab zoo li PyGObject. Lub tshuab nws tus kheej yog muaj raws li lub tsev qiv ntawv dynamic tsis tu ncua libatspi.so. Muaj ib Rau lub tsev qiv ntawv pywinauto, peb npaj yuav siv AT-SPI kev txhawb nqa li no: los ntawm kev thauj khoom libatspi.so thiab ctypes module. Qhov teeb meem me me tsuas yog siv cov version raug, vim lawv txawv me ntsis rau GTK + thiab Qt daim ntawv thov. Qhov kev tso tawm ntawm pywinauto 0.7.0 yuav muaj kev txhawb nqa tag nrho. Linux tuaj yeem cia siab tias yuav muaj nyob rau hauv thawj ib nrab ntawm xyoo 2018.
Apple Accessibility API
MacOS muaj nws tus kheej automation lus, AppleScript. Txhawm rau siv qee yam zoo li no hauv Python, tau kawg, koj yuav tsum siv cov haujlwm los ntawm ObjectiveC. Pib, zoo li, nrog MacOS 10.6, cov pob pyobjc suav nrog hauv Python ua ntej. Qhov no tseem yuav ua rau nws yooj yim dua los sau cov kev cia siab rau yav tom ntej kev txhawb nqa hauv pywinauto.
Cov cuab yeej: Ntxiv nrog rau cov lus Apple Script, nws tsim nyog them rau , ua pyatom. Nws yog interface sib xws nrog LDTP, tab sis kuj yog ib lub tsev qiv ntawv standalone. Nws muaj , sau los ntawm kuv tus menyuam kawm ntawv. Muaj ib qho teeb meem paub: lub sijhawm hloov pauv tsis ua haujlwm (txoj kev waitFor*). Tab sis tag nrho, tsis yog qhov phem.
Yuav pib li cas nrog pywinauto
Thawj kauj ruam yog los tuav koj tus kheej nrog GUI cov khoom soj ntsuam (dab tsi yog hu ua Spy tool). Nws yuav pab tau koj kawm daim ntawv thov los ntawm sab hauv: yuav ua li cas lub hierarchy ntawm lub ntsiab yog tsim, yam khoom muaj. Cov kws tshuaj xyuas qhov chaw nto moo tshaj plaws:
- Spy++ - suav nrog Visual Studio, suav nrog Express lossis Community Edition. Siv Win32 API. Nws clone kuj paub AutoIt Qhov rai Info.
- Inspect.exe - suav nrog rau hauv Windows SDK. Yog tias koj twb nruab nws lawm, ces nws nyob rau ntawm 64-ntsis Windows Koj tuaj yeem nrhiav nws hauv daim nplaub tshev
C:Program Files (x86)Windows Kits<winver>binx64. Nyob rau hauv tus neeg soj ntsuam nws tus kheej koj yuav tsum xaiv ib hom UI Automation hloov MS AA (Active Accessibility, yawg koob ntawm UI Automation).
Tom qab tshuaj xyuas daim ntawv thov los ntawm thiab dhau los, peb xaiv lub backend uas peb yuav siv. Nws yog txaus los qhia lub npe ntawm lub backend thaum tsim cov khoom siv.
- backend = "win32" - thaum siv los ntawm lub neej ntawd, ua haujlwm zoo nrog MFC, WTL, VB6 thiab lwm yam kev siv qub txeeg qub teg.
- backend = "ua" β backend tshiab rau MS UI Automation: ua haujlwm zoo kawg nkaus nrog WPF thiab WinForms; kuj zoo rau Delphi thiab Windows Khaws cov apps; ua haujlwm nrog Qt5 thiab qee cov ntawv thov Java. Thiab feem ntau, yog tias Inspect.exe pom cov ntsiab lus thiab lawv cov khoom, ces qhov backend no tsim nyog. Yeej, feem ntau cov browsers kuj txhawb nqa UI Automation (Mozilla los ntawm lub neej ntawd, thiab Chrome xav tau kev hloov pauv kab hais kom ua thaum pib).
--force-renderer-accessibilitykom pom cov ntsiab lus ntawm nplooj ntawv hauv Inspect.exe). Tau kawg, kev sib tw nrog Selenium hauv cheeb tsam no tsis yog qhov ua tau. Tsuas yog lwm txoj hauv kev los ua haujlwm nrog browser (tej zaum yuav muaj txiaj ntsig zoo rau cov khoom sib txawv).
Cov ntsiab lus nkag rau automation
Daim ntawv thov tau raug tshawb fawb ntau. Nws yog lub sij hawm los tsim ib qho Application object thiab khiav nws los yog txuas rau ib qho uas twb tau khiav lawm. Qhov no tsis yog ib qho clone ntawm cov chav kawm ntawv xwb subprocess.Popen, uas yog ib qho khoom siv uas txwv tag nrho koj cov kev ua rau thaj tsam ntawm cov txheej txheem. Qhov no yog qhov tseem ceeb heev yog tias ntau zaus ntawm daim ntawv thov tab tom ua haujlwm, tab sis koj tsis xav kov lwm tus.
from pywinauto.application import Application
app = Application(backend="uia").start('notepad.exe')
# ΠΠΏΠΈΡΠ΅ΠΌ ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Ρ
ΠΎΡΠΈΠΌ Π½Π°ΠΉΡΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Notepad.exe
dlg_spec = app.UntitledNotepad
# ΠΆΠ΄Π΅ΠΌ ΠΏΠΎΠΊΠ° ΠΎΠΊΠ½ΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΠΏΠΎΡΠ²ΠΈΡΡΡ
actionable_dlg = dlg_spec.wait('visible')Yog tias koj xav tswj hwm ntau daim ntawv thov ib zaug, chav kawm no yuav pab koj Desktop. Piv txwv li, hauv lub laij lej ntawm Win10, lub hierarchy ntawm cov ntsiab lus tau nthuav tawm thoob plaws ntau yam txheej txheem (tsis yog xwb. calc.exe). Yog li tsis muaj khoom Desktop tsis txaus.
from subprocess import Popen
from pywinauto import Desktop
Popen('calc.exe', shell=True)
dlg = Desktop(backend="uia").Calculator
dlg.wait('visible')Cov khoom hauv paus (Application los yog Desktop) yog tib qhov chaw uas koj yuav tsum tau qhia lub backend. Txhua yam lwm yam ntog pob tshab rau hauv "specification-> wrapper" lub tswv yim, uas yuav tau tham tom qab.
Qhov rai/Element Specifications
Qhov no yog lub ntsiab lus tseem ceeb uas lub pywinauto interface tau tsim. Koj tuaj yeem piav qhia txog lub qhov rais / lub ntsiab lus ntxhib lossis nthuav dav ntxiv, txawm tias nws tseem tsis tau muaj los yog twb kaw lawm. Qhov rai specification (object Qhov raiSpecification) khaws cov txheej txheem los ntawm kev tshawb nrhiav lub qhov rais tiag tiag lossis lub caij.
Piv txwv ntawm cov ncauj lus kom ntxaws qhov rai specification:
>>> 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>Lub qhov rais nrhiav nws tus kheej tshwm sim los ntawm kev hu rau txoj kev .wrapper_object(). Nws rov qab ib qho "wrapper" rau lub qhov rais tiag tiag / lub ntsiab lus lossis cuam tshuam ElementNotFoundError (qee zaum ElementAmbiguousError, yog tias pom ntau lub ntsiab lus, uas yog, koj yuav tsum tau qhia meej txog kev tshawb nrhiav). Qhov no "wrapper" twb paub yuav ua li cas ua tej yam ua nrog ib lub caij los yog tau txais cov ntaub ntawv los ntawm nws.
Python tuaj yeem nkaum qhov hu .wrapper_object(), yog li qhov kawg code yuav luv dua. Peb pom zoo kom siv nws rau kev debugging nkaus xwb. Ob kab tom ntej no ua tib yam nkaus:
dlg_spec.wrapper_object().minimize() # debugging
dlg_spec.minimize() # productionMuaj ntau yam kev tshawb nrhiav rau lub qhov rais specification. Nov yog qee qhov piv txwv xwb:
# ΠΌΠΎΠ³ΡΡ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎΠ²Π½Π΅ΠΉ
app.window(title_re='.* - Notepad$').window(class_name='Edit')
# ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ (ΠΊΠ°ΠΊ AND) ΠΈ Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
dlg = Desktop(backend="uia").Calculator
dlg.window(auto_id='num8Button', control_type='Button')Ib daim ntawv teev tag nrho cov txheej txheem ua tau yog nyob rau hauv cov ntaub ntawv ua haujlwm .
Cov khawv koob ntawm kev nkag los ntawm tus cwj pwm thiab qhov tseem ceeb
Python ua rau nws yooj yim los tsim qhov rais specifications thiab paub txog cov khoom attributes dynamically (internally, txoj kev yog overridden __getattribute__). Tau kawg, tib qhov kev txwv yog raug txwv rau lub npe tus cwj pwm xws li lub npe ntawm txhua qhov sib txawv (koj tsis tuaj yeem ntxig qhov chaw, commas, lossis lwm yam cim tshwj xeeb). Hmoov zoo, pywinauto siv lub npe hu ua "zoo tshaj plaws" kev tshawb nrhiav algorithm uas tiv taus typos thiab me me hloov pauv.
app.UntitledNotepad
# ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ
app.window(best_match='UntitledNotepad')Yog tias koj tseem xav tau cov hlua Unicode (piv txwv li, rau cov lus Lavxias), qhov chaw, thiab lwm yam, koj tuaj yeem nkag tau los ntawm tus yuam sij (xws li nws yog phau ntawv txhais lus li niaj zaus):
app['Untitled - Notepad']
# ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ
app.window(best_match='Untitled - Notepad')Tsib txoj cai rau npe tej yam yees siv
Yuav ua li cas thiaj nrhiav tau cov npe khawv koob? Cov uas tau muab rau lub caij ua ntej tshawb nrhiav. Yog tias koj teev ib lub npe uas zoo ib yam li tus qauv, ces lub caij yuav pom.
- Los ntawm lub npe (ntawv nyeem, lub npe):
app.Properties.OK.click() - Los ntawm cov ntawv nyeem thiab cov ntsiab lus:
app.Properties.OKButton.click() - Los ntawm hom thiab naj npawb:
app.Properties.Button3.click()(cov npeButton0ΠΈButton1khi rau thawj lub ntsiab lus pom,Button2- mus rau qhov thib ob, thiab tom qab ntawd hauv kev txiav txim - qhov no yog li cas nws tshwm sim keeb kwm) - Los ntawm cov ntawv zoo li qub (sab laug lossis sab saum toj) thiab los ntawm hom:
app.OpenDialog.FileNameEdit.set_text("")(pab tau rau cov ntsiab lus nrog cov ntawv dynamic) - Los ntawm hom thiab los ntawm cov ntawv hauv:
app.Properties.TabControlSharing.select("General")
Feem ntau ob lossis peb txoj cai raug siv tib lub sijhawm, tsis tshua muaj ntau. Txhawm rau txheeb xyuas cov npe tshwj xeeb twg muaj rau txhua lub caij, koj tuaj yeem siv txoj hauv kev print_control_identifiers(). Nws tuaj yeem luam ib tsob ntoo ntawm cov ntsiab lus ob qho tib si rau qhov screen thiab rau cov ntaub ntawv. Rau txhua lub caij, nws cov qauv khawv koob npe raug luam tawm. Koj tseem tuaj yeem luam tawm thiab muab cov ncauj lus kom ntxaws ntxiv ntawm cov ntsiab lus me nyuam los ntawm qhov ntawd. Cov txiaj ntsig hauv tsab ntawv yuav zoo li no:
app.Properties.child_window(data-gt-translate-attributes='["title"]' title="Contains:", auto_id="13087", control_type="Edit")Tsob ntoo ntawm cov ntsiab lus nws tus kheej feem ntau yog ib qho loj footcloth.
>>> 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")Qee zaum, luam ntawv tag nrho cov ntoo yuav qeeb (piv txwv li, hauv iTunes muaj ntau li peb txhiab lub ntsiab lus ntawm ib tab!), tab sis koj tuaj yeem siv qhov kev xaiv. depth (qhov tob): depth=1 - lub ntsiab nws tus kheej, depth=2 - Tsuas yog cov me nyuam tam sim ntawd, thiab lwm yam. Nws kuj tseem tuaj yeem teev nyob rau hauv specifications thaum tsim child_window.
piv txwv
Peb niaj hnub ntxiv . Ntawm cov tsis ntev los no, nws tsim nyog sau cia qhov kev ua haujlwm ntawm WireShark network analyzer (qhov no yog ib qho piv txwv zoo ntawm Qt5 daim ntawv thov; txawm hais tias txoj haujlwm no tuaj yeem daws tau yam tsis muaj GUI, vim tias muaj scapy.Sniffer los ntawm Python pob ). Kuj tseem muaj qhov piv txwv ntawm MS Paint automation nrog nws Ribbon toolbar.
Lwm qhov piv txwv zoo uas sau los ntawm kuv tus menyuam kawm ntawv: (nws yuav txav mus rau qhov chaw cia khoom loj me ntsis tom qab).
Thiab, tau kawg, ib qho piv txwv ntawm kev tso npe rau cov keyboard (cov yuam sij kub) thiab cov xwm txheej nas:
.
Kev lees paub
Ua tsaug tshwj xeeb rau cov neeg uas niaj hnub pab tsim qhov project. Rau kuv thiab Qhov no yog ib qho kev nyiam ua mus tas li. Ob ntawm kuv cov tub ntxhais kawm los ntawm UNN tsis ntev los no tau tiv thaiv lawv daim bachelor's degree ntawm lub ncauj lus no. ua ib qho kev txhawb nqa loj rau kev txhawb nqa rau MS UI Automation thiab tsis ntev los no tau pib ua lub tshuab hluav taws xob tsis siv neeg raws li "cov ntaub ntawv-playback" txoj cai raws li cov ntawv nyeem (qhov no yog qhov nyuaj tshaj plaws), kom deb li deb tsuas yog rau "uia" backend. tab tom tsim ib qho backend tshiab rau Linux raws li AT-SPI (modules) mouse ΠΈ keyboard raws - twb tso tawm 0.6.x).
Txij li thaum kuv tau qhia ib chav tshwj xeeb ntawm automation hauv Python rau qee lub sijhawm, qee tus tswv cov tub ntxhais kawm ua homework, siv cov yam ntxwv me me lossis piv txwv ntawm automation. Qee yam tseem ceeb ntawm theem kev tshawb fawb kuj tau pom ib zaug los ntawm cov tub ntxhais kawm. Txawm hais tias qee zaum koj yuav tsum nruj me ntsis saib xyuas qhov zoo ntawm cov cai. Cov neeg soj ntsuam zoo li qub (QuantifiedCode, Codacy thiab Toj roob hauv pes) thiab kev sim tsis siv neeg hauv huab (AppVeyor kev pabcuam) nrog cov lej them nyiaj ntawm ib puag ncig 95% pab ntau qhov no.
Tsis tas li ua tsaug rau txhua tus neeg uas tawm kev tshuaj xyuas, tsa cov kab thiab xa cov lus thov rub!
Cov peev txheej ntxiv
Peb ua raws li cov lus nug (tsis ntev los no tau tshwm sim ) thiab Cov. muaj .
Peb hloov tshiab txhua lub hlis . Hais txog cov hnub qub ntawm GitHub, tsuas yog Autohotkey (lawv muaj lub zej zog loj heev thiab keeb kwm ntev) thiab PyAutoGUI tau loj hlob sai dua (feem ntau vim yog qhov nrov ntawm cov phau ntawv los ntawm nws tus kws sau Al Sweigart: "Automate the Boring Stuff with Python" thiab lwm yam).
Tau qhov twg los: www.hab.com
