Python自动化工具:pywinauto
一、pywinauto的安装
(1)安装命令
pip install -U pywinauto/pip3 install -U pywinauto
(2)验证是否安装成功
from pywinauto.application import Application
二、pywinauto的使用
1.1介绍程序的backend
首先要判断程序是用什么语言写的?在实例化会有区别,主要是判断程序的backend?
程序的backend大致有两种:
(1)Win32 API(backend=“win32”)
(2)MS UI Automation(backend=“uia”)
1.2如何判断程序的backend?
1.3如何使用inspect来判断backend的类别
将inspect左上角的下拉列表中切换到“UI Automation”,然后鼠标点一下你需要测试的程序窗体,inspect就会显示相关信息。
inspect中显示了相关的信息,如下图所示。说明backend为uia。
如果inspect中显示拒绝访问,说明该程序的backend应该是win32;
这里主要是限制自动化控制进程的范围。如一个程序有多个实例,自动化控制一个实例,而保证其他实例(进程)不受影响。
主要有两种对象可以建立这种入口点——
-->Application()
-->Desktop()
Application的作用范围是一个进程,如一般的桌面应用程序都为此类。
建立好入口后,需要连接进程;
3.1连接进程的方法
(1)使用Application对象的start()方法
start(self, cmd_line, timeout=app_start_timeout) #instance method:
cmd_line参数就是你使用命令行启动程序的命令语句(程序路径)
例如:
app = Application().start(r"F:\python\auto_tools\Terminal_部标_2014-01-12-11.exe")
(2)使用Application对象的connect()方法
-->使用进程ID (PID)进行绑定;
app = Application().connect(process=15860)
进程的PID可以在任务管理器中查看;
-->使用窗口句柄绑定
app = Application().connect(handle=0x00030F9A)
窗口句柄可以在Spy++中查看 :
-->使用程序路径绑定
app=Application().connect(path=r"F:\python\auto_tools\Terminal_部标_2014-01-12-11.exe")
-->使用标题、类型等匹配
app = Application().connect(title_re="Terminal_部标_2014-01-12.*", class_name="#32770 (对话框)")
三、使用pywinauto操作窗口
1.启动程序
(1)application.Application().start('路径+程序名/程序名')
app = application.Application().start('notepad.exe')
例子:
myapp = Application().start("notepad")
myapp.__setattr__("name","notepad")
错误用法:
from pywinauto importapplication
app= application.Application.start('notepad.exe')
原因:因为start方法必须是针对应用实例的方法, 忘记了实例化操作, ()符号;
(2)MenuSelect方法自动检索Notepad上的菜单选项
(3)decode(‘gb2312’)方法,python3使用encode('gb2312')方法是把中文强制转换为unicode编码,对于非英文的操作系统都是要转换的;
例如:点击“帮助->关于记事本”操作;
app.Notepad.MenuSelect('帮助->关于记事本'.decode('gb2312'))
附注:抛出异常
① AttributeError: 'str' object has no attribute 'decode'
主要原因:Python2和Python3在字符串编码上的区别(必须将字节字符串解码后才能),python在bytes和str两种类型转换,所需要的函数依次是encode(),decode()
解决方案:str通过encode()方法可以编码为指定的bytes
反过来,当从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法。反之,则使用encode()方法即可!正确用法如下:
app.Notepad.MenuSelect('帮助->关于记事本'.encode('gb2312').decode('gb2312'))
例如,对一个写字板app应用中的窗口,在英文操作系统中,其标题是“untitled - Notepad”
可以使用以下两种方式调用该窗体
app.Untitled
app