python自动化工具之pywinauto(三)_自动化工具之三:pywinauto

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

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

对于关于窗口,其标题是“About Notepad”

可以使用以下名称调用该窗体

app.AboutNotepad

这里的app是你刚才实例的对象,Notepad是类名;

查找/调用窗口

通过工具spy++lite查看窗口的类名和标题文字...

这里先介绍官方文档的两种方法:

(1)通过top_dlg = app.top_window_() 来获取最上面的window(不推荐,如果有新进程,就会得到错误对象)

(2)通过find_dlg = app.window_(title_re = ‘ ’, class_name = ‘ ’) 方法获得,title_re和 class_name这两个可以单独使用也可以一块使用,因为有时没有标题文本,也有时一个窗口类名有多个对象;

例如:

“Edit”有时当一个对话框中有多个输入框时会有多个Edit类名,对于“关于记事本”我们可以通过以下代码获得-->

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值