下载安装直接使用pip安装
pip -- (Py2.7+, Py3.3+)
或者也可以手动安装(离线项目主机)
注意事项
支持的控件
标准Win32控件:MFC, WTL, VB6和其他一些使用的老应用
所有基于MS UI 的标准部件:WPF, Qt, 所有浏览器, 文件资源管理器和其他
对于非标准控件,简单情况下,我们可以在得到窗口句柄后,模拟键盘命令对其进行操作。
快速开始实例讲解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pywinauto.application import Application
app = Application().start("notepad.exe")
# 绑定进程,class_name和title是可选的,可以灵活使用,如果找到多个货没有找到该程序,程序会报错
app = Application().connect(class_name="Notepad",title="无标题 - 记事本")
# 得到可操作的窗口,可以传入标题,类名,或者将标题传入键值
win = app.window(title="无标题 - 记事本")
# 或者(通常使用此方法)
win = app["无标题 - 记事本"]
# 可以使用Edit对可编辑区进行编辑
win.Edit.type_keys('test.txt')
win.menu_select("文件->保存")
# 当弹出新的窗口时,窗口标题变化,因此需要重新确定可操作窗口
win = app['另存为']
win.Edit.type_keys('test.txt')
# 窗口内含有的按钮等名称,同样可以作为键值传入,从而得到控件
win['保存'].click()
如果不能确定如何寻找控件,可以使用以下方法打印出所有控件
1
win.print_control_identifiers()
一个完整的例子
1
2
3
4
5
6
7
8
9
10
from pywinauto.application import Application
app = Application().start("notepad.exe")
app = Application().connect(class_name="Notepad")
app['无标题 - 记事本'].Edit.type_keys('test01')
app['无标题 - 记事本'].menu_select("文件->保存")
app['另存为'].Edit.type_keys('test.txt')
app['另存为']['保存'].click()
app['确认另存为']['是'].click()
方法简介指定可用的实例
像要操作某个窗口,必须先实例化这个窗口,实例化窗口有下面两种方法可以实现:
start()启动程序并实例化
app = ().start(r"c:n -a -n -y --")
其中超时参数是可选的,如果应用程序需要很长时间来启动,则只需要使用该参数。
()实例化已经启动的程序:
()是当自动化程序已经启动时来使用,可以传入以下几种参数进行绑定:
注意:应用程序在你使用()之前窗口必须已经准备好。如果无法确定的话,你需要睡眠或者编写一个循环等待来等待应用程序完全启动。
如何指定应用程序的对话框
应用程序实例化完成之后,接着需要指定这个窗口。
例如:
dlg = app.
dlg = app['']
接下来是一个最简单的方法,去询问()函数
dlg = ()
它将返回这个应用程序最高层级的窗口
注意:这是目前尚未测试的,所以我们并不清楚它是否会正确的返回
如果上述还不能进行有效控制,那么你可以使用项目参数传递给.find.()
dlg = app.(="Page Setup", ="#32770")
最后介绍一个你可以进行多控制的方法
= app.()
这将返回应用程序中所有可见,启用的顶层窗口列表,然后你就可以使用模块中的某些方法所选用的对话框,一旦你拥有其句柄,就可以使用
app.(=win)
注意:如果对话框的标题很长,可以使用正则进行匹配
app.(=".*Part of Title.*")
其中 title 和 的区别是:
如何在对话框上指定控件
有很多方法,最简单的就是
1
2
app.dlg.control
app['dlg']['control']
代码依据如下内容来构建多个标识符:
如果标签的文本为空(或者删除不能使用的字符后为),那么文本就不能被使用。相反,我们会寻找上面和最右边的控制,并附加其相关类,所以列表就是:
一旦对话框中所有控件创建了一组标识符,我们就将它们消除歧义
使用.fiers()
例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
dlg_spec = app['无标题 - 记事本']
dlg_spec.print_control_identifiers()
>>>
Control Identifiers:
Dialog - '无标题 - 记事本' (L481, T434, R1281, B802)
['无标题 - 记事本Dialog', 'Dialog', '无标题 - 记事本']
child_window(title="无标题 - 记事本", control_type="Window")
|
| Edit - '文本编辑器' (L489, T485, R1273, B794)
| ['', 'Edit', '0', '1']
| child_window(title="文本编辑器", auto_id="15", control_type="Edit")
| |
| | ScrollBar - '垂直滚动条' (L1256, T485, R1273, B794)
| | ['垂直滚动条ScrollBar', '垂直滚动条', 'ScrollBar']
| | child_window(title="垂直滚动条", auto_id="NonClientVerticalScrollBar", control_type="ScrollBar")
| | |
| | | Button - '上一行' (L1256, T485, R1273, B502)
| | | ['上一行', '上一行Button', 'Button', 'Button0', 'Button1']
| | | child_window(title="上一行", auto_id="UpButton", control_type="Button")
| | |
| | | Button - '下一行' (L1256, T777, R1273, B794)
| | | ['下一行', '下一行Button', 'Button2']
| | | child_window(title="下一行", auto_id="DownButton", control_type="Button")
|
| TitleBar - 'None' (L505, T437, R1273, B465)
| ['2', 'TitleBar']
| |
| | Menu - '系统' (L489, T442, R511, B464)
| | ['系统Menu', '系统', 'Menu', '系统0', '系统1', 'Menu0', 'Menu1']
| | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")
| | |
| | | MenuItem - '系统' (L489, T442, R511, B464)
| | | ['系统2', 'MenuItem', '系统MenuItem', 'MenuItem0', 'MenuItem1']
| | | child_window(title="系统", control_type="MenuItem")
| |
| | Button - '最小化' (L1134, T435, R1181, B465)
| | ['最小化Button', '最小化', 'Button3']
| | child_window(title="最小化", control_type="Button")
| |
| | Button - '最大化' (L1181, T435, R1227, B465)
| | ['最大化Button', '最大化', 'Button4']
| | child_window(title="最大化", control_type="Button")
| |
| | Button - '关闭' (L1227, T435, R1274, B465)
| | ['关闭', '关闭Button', 'Button5']
| | child_window(title="关闭", control_type="Button")
|
| Menu - '应用程序' (L489, T465, R1273, B484)
| ['应用程序', 'Menu2', '应用程序Menu']
| child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar")
| |
| | MenuItem - '文件(F)' (L489, T465, R541, B484)
| | ['文件(F)MenuItem', 'MenuItem2', '文件(F)']
| | child_window(title="文件(F)", control_type="MenuItem")
| |
| | MenuItem - '编辑(E)' (L541, T465, R594, B484)
| | ['MenuItem3', '编辑(E)', '编辑(E)MenuItem']
| | child_window(title="编辑(E)", control_type="MenuItem")
| |
| | MenuItem - '格式(O)' (L594, T465, R650, B484)
| | ['格式(O)', '格式(O)MenuItem', 'MenuItem4']
| | child_window(title="格式(O)", control_type="MenuItem")
| |
| | MenuItem - '查看(V)' (L650, T465, R704, B484)
| | ['查看(V)MenuItem', '查看(V)', 'MenuItem5']
| | child_window(title="查看(V)", control_type="MenuItem")
| |
| | MenuItem - '帮助(H)' (L704, T465, R759, B484)
| | ['帮助(H)', 'MenuItem6', '帮助(H)MenuItem']
| | child_window(title="帮助(H)", control_type="MenuItem")
注意:此方法打印的标识符已经通过标识的唯一进程。所以如果你有两个编辑框,它们都会在其中列出。实际上,第一个可以被称之为“编辑”,“编辑0”,“编辑1”和第二个应该被称为“编辑2”
注意:你不需要精确!
如何使用在英文之外的环境
在py2中,的编码一直是蛋疼的问题,但是py3的出现改变了这一现状。中,字符串是以编码的,也就是说,的字符串支持多语言。使用如下方法来进行属性控制
在英文文档中,此部分还是以为基础
app...click()
app[''][''].click()
app.(="").(title="rs").click()
如何处理不按照预期进行响应的控件(例如控件)
对于非标准控件,无法定位到控件并对其进行操作。我们可以通过定位到其窗口,并模拟键盘操作的方式来操控它,使用上下箭头移动或则使用快捷键进行操作。
.("{HOME}{DOWN 2}{ENTER}ABC")
上面的例子表示模拟键盘依次键入了HOME DOWN DOWN ENTER A B C
对于一些特殊符号的快捷键,对应的码表如下:
按键名称对应符号
SHIFT
CTRL
ALT
SPACE
{SPACE}
{} {BS} or{BKSP}
BREAK
{BREAK}
CAPS LOCK
{}
DEL or
{} or {DEL}
DOWN ARROW
{DOWN}
END
{END}
ENTER
{ENTER} or ~
ESC
{ESC}
HELP
{HELP}
HOME
{HOME}
INS or
{} or {INS}
LEFT ARROW
{LEFT}
NUM LOCK
{}
PAGE DOWN
{PGDN}
PAGE UP
{PGUP}
{PRTSC}
RIGHT ARROW
{RIGHT}
LOCK
{}
TAB
{TAB}
UP ARROW
{UP}
{ADD}
{}
{}
{}
如何访问系统托盘(,通知区域)
1
2
3
import pywinauto.application
app = pywinauto.application.Application().connect(path="explorer")
systray_icons = app.ShellTrayWnd.NotificationAreaToolbar
任务栏模块提供对系统托盘的初步访问。
它定义了以下变量:
我还在模块中提供了两个可以用来点击系统托盘图标的功能:
通常,当您点击/右键单击图标时,您将收到一个弹出菜单。在这一点上要记住的是,弹出菜单是应用程序的一部分,而不是资源管理器的一部分。
例如:
1
2
3
4
5
6
7
8
# connect to outlook
outlook = Application.connect(path='outlook.exe')
# click on Outlook's icon
taskbar.ClickSystemTrayIcon("Microsoft Outlook")
# Select an item in the popup menu
outlook.PopupMenu.Menu().get_menu_path("Cancel Server Request")[0].click()
常用方法
app.click() 点击控件
app.close() 关闭窗口
app.Check() 勾选复选框
app.() 取消勾选复选框
所有控件的官方文档
自动化工具之
入门指南
未经允许不得转载! 作者:admin,转载或复制请以超链接形式并注明出处墨迹游戏网。
原文地址:《pywinauto简明教程》发布于:2024-10-31





