python 3.x - Windows GUI Automation on legacy app

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at automatisere en gammel Windows-app kaldet FacTel5. [3]


Jeg har været i stand til at automatisere login-delen, men den næste formular er en kugleagtig liste, hvis kontroller er ikke , hverken på pywinauto control\_identifiers eller Windows Inspect


from pywinauto.application import Application
app = Application(backend="uia").start(r'C:Factel5Factel5.exe')

controlAcceso = app.FacTel5['Control de acceso a FacTel5'].GroupBox

user = controlAcceso.child\_window(auto\_id="4", control\_type="Edit")
user.type\_keys("userid")

password = controlAcceso.child\_window(auto\_id="5", control\_type="Edit")
password.type\_keys("password")

controlAcceso.child\_window(title="Aceptar", auto\_id="3", control\_type="Button").click()

pro = app.process
winApp = Application().connect(process=app.process)


App bruger 'uia' backend og winApp autoconnects ved hjælp af win32 backend.


Den øverste kode lander mig ved dette vindue, hvis du har brug for/prøv koden selv, er legitimationsoplysningerne de rigtige (og de er defineret i programmanualen). [4]


factelPic [5]


Mit mål er at klikke på det første element i listen.


inspectPic [6]


Jeg sætter stor pris på enhver hjælp, du kan give.

Bedste reference


Disse kontroller gør endda ikke reaktion på tastaturhandlinger. Så den eneste løsning er at klikke på koordinater! Men stop! Det er upåliteligt! Hvis det er absolutte skærmkoordinater, ja det er. Men vi kan bruge relative koordinater (oprindelse er et øverste venstre hjørne af kontrollen). Det kan være pålideligt, hvis styrestørrelsen er fast.


Denne kode fungerer for mig på Win10 x64:


from pywinauto.application import Application

app = Application(backend="uia").start(cmd\_line=r"C:Program Files (x86)Factel5Factel5.exe")
# this main window spec should work even if the subtitle changes
main\_window = app.window(title\_re=u'FacTel5 - Telefu0443nica.*')

controlAcceso = main\_window['Control de acceso a FacTel5'].GroupBox
user = controlAcceso.Edit1
user.set\_text("userid")
password = controlAcceso.Edit2
password.set\_text("password")
controlAcceso.child\_window(title="Aceptar", control\_type="Button").click()

controlAcceso = main\_window['Control de acceso a FacTel5'].child\_window(title=u'u0457Quu0439 desea hacer?')
# controlAcceso = main\_window['Control de acceso a FacTel5'][u'u0457Quu0439 desea hacer?'] # TODO: need a bug fix
rect = controlAcceso.rectangle()
item1 = (rect.width() / 2, int(float(rect.height() * 2.0) / 11.5))
item2 = (rect.width() / 2, int(float(rect.height() * 3.0) / 11.5))
item3 = (rect.width() / 2, int(float(rect.height() * 4.0) / 11.5))
item4 = (rect.width() / 2, int(float(rect.height() * 5.0) / 11.5))
item5 = (rect.width() / 2, int(float(rect.height() * 6.0) / 11.5))

item6 = (rect.width() / 2, int(float(rect.height() * 8.5) / 11.5))
item7 = (rect.width() / 2, int(float(rect.height() * 9.0) / 11.5))
item8\_exit = (rect.width() / 2, int(float(rect.height() * 10.0) / 11.5))

# uncomment move\_mouse and comment click\_input to see where the click happens
# controlAcceso.move\_mouse\_input(coords=item1, absolute=False)
controlAcceso.click\_input(coords=item1, absolute=False)

main\_window.menu\_select(u'Facturaciones->Gestión de facturaciones')