如果说PyAutoGUI 是个黑盒自动化测试windows应用操作工具,不用知道应用内部的结构,只需要知道位置,直接上键盘鼠标;
那么Pywinauto就是白盒自动化测试工具,他的操作精细到应用里面的每一个细小的控件
从一个例子开始
这里先上一个简单例子:打开资源管理器explorer . 右键点开 "common files"
代码如下,简单吧!
from pywinauto import Desktop, Application
1、启动程序
Application().start('explorer.exe "C:\\Program Files"')
2、找到进程, 注意title 可以是模糊匹配
app = Application(backend="uia").connect(path="explorer.exe", title="Program F")
3、找到主窗口-title模糊匹配
wnd = app['Program']
4、打印所有控件
wnd.print_control_identifiers()
================ 具体应用上面稍微改一下程序名================================
5、定位控件
common_files=wnd['common files'] 定位UI控件方法1
common_files=wnd.ListItem5 定位UI控件方法2
common_files=wnd['Common FilesLis'] 定位UI控件方法3
6、动作
common_files.right_click_input() 右击 ui控件
运行结果如下:
image.png
控件定位方法
那程序中的关键,控件是如何定位的呢?
1、打印所有的控件信息
我们无需使用inspect.exe , spy++ 只需要执行下面语句,就可以吧所有控件信息打印出来
wnd.print_control_identifiers()
2、然后找到结果中的控件信息,common files 为:
| | | | | ListItem - 'Common Files' (L370, T291, R944, B313)
| | | | | ['Common FilesListItem', 'ListItem5', 'Common Files']
['Common FilesListItem', 'ListItem5', 'Common Files']
我们可以使用这3个值中的任意一个来定位控件,而且支持模糊匹配。
源码分析pywinauto 实现的原理
1、建立控件索引
print_control_identifiers(): 函数里面把所有控件建立了一个列表,进行词典索引
# Create a list of this control and all its descendants
all_ctrls = [this_ctrl, ] + this_ctrl.descendants()
name_ctrl_id_map = findbestmatch.UniqueDict()
每个控件会有elementinfo
2、查找控件
在控件大列表中根据属性来查找控件
3、鼠标或者键盘操作
针对控件窗口进行发送消息操作
app.Notepad.Edit.right_click()
鼠标或者键盘操作就是发送消息了
win32functions.PostMessage(ctrl, msg, win32structures.WPARAM(flags), win32structures.LPARAM(click_point))
参考:https://pywinauto.readthedocs.io/en/latest/index.html
https://www.kancloud.cn/gnefnuy/pywinauto_doc/1193036
网友评论