pip install --upgrade pywinauto
目录
P1 自动化的切入点
-
确定应用程序的可访问技术
- Win32 API (backend = "win32") - 默认的backend
- MFC,VB6,VCL,简单的WinFOrms空间和大多数旧的应用程序
- MS UI Automation API(backend = "uia")
- WinForms,WPF,Store apps,Qt5,浏览器
- Win32 API (backend = "win32") - 默认的backend
-
启动应用程序
- Application:作用范围是一个进程。
- Desktop:作用范围可以跨程序。
P2 程序检查辅助工具
- Inspect.exe(C:\Program Files\Windows Kits\10\bin\x64)
- spy++.exe:能显示程序所有控件,即适合使用win32的backend。
- ViewWizard:(窗口信息查看精灵)
- Aibote Windows Tool:纯代码RPA办公自动化框架,支持Android、Browser和Windows 三大平台。
P3 打开指定程序
打开记事本
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe")
打开任意的windows程序
from pywinauto.application import Application
app = Application(bacckend = "后端类型").start("程序位置路径") //.strat(r"程序位置路径")
P4 连接已经打开的程序
-
通过进程号去进行连接
- 任务管理器 详细信息 PID
-
通过窗口句柄进行连接
- ViewWizard(窗口信息查看精灵)
from pywinauto.application import Application
app = Application("uia").connect(process = 4444) // 进程号
app = Application("uia").connect(handle = 1904040) // 窗口句柄
print(app) // 检测
P5 选择应用程序的窗口
- 根据窗口标题或类名选择
- dlg = app[窗口类名/标题]
- 根据窗口类名选择窗口
- dlg = app.窗口类名
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["窗口类名/标题"] //方式一.选择窗口
dlg = app.窗口类名 //方式二.适合英文软件
dlg.print_control_identifiers() //打印窗口中所有的控件,检测是否选择窗口成功
P6 应用程序的窗口操作方法
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["notepad"] //选择窗口
dlg = maximize() //窗口最大化
dlg = minimize() //窗口最小化
dlg = restore() //窗口恢复正常大小
status = dlg.get_show_state() //查找窗口显示状态
print(status) //最大化1、正常0
dlg.close() //关闭窗口
rect = dlg.rectangle() //获取当前窗口显示坐标
print(rect) //左,上,右,下
P7 窗口空间的相关操作
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["notepad"] //选择窗口
dlg.print_control_identifiers() //查看窗口上所有的控件
menu = dlg["Menu"] //选择菜单
print(menu.print_control_identifiers())
file = menu.child_window(title="文件",control_type="MenuItem") //选择菜单项:文件
file.print_control_identifiers()
P8 窗口的分类
状态栏 | Status Bar | 静态内容 | Static |
按钮 | Button | 复选框 | Check Box |
单选框 | Radio Button | 组框 | Group Box |
组合框 | Combo Box | 对话框(窗口) | Dialog |
编辑栏 | Edit | 头部内容 | Header |
列表框 | List Box | 列表显示控件 | List View |
弹出菜单 | Popup Menu | 选项卡控件 | Tab Control |
工具栏 | Tool bar | 工具提示 | Tool Tips |
树状视图 | Tree View | 菜单 | Menu |
菜单项 | Menu Item | 窗格 | Pane |
P9 窗口控件属性的获取
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["notepad"] //选择窗口
menu = dlg["Menu"] //选择菜单
file = menu.child_window(title="文件") //选择菜单项:文件
print(dlg.wrapper_object()) //查看控件类型:wrapper_object
print(menu.wrapper_object())
print(file.wrapper_object())
print(dir(dlg.wrapper_object())) //查看对象所支持的方法:dir
print(file.texts()) //控件的文本内容获取:texts
print(dlg.children()) //获取子元素:children
print(menu.class_name()) //获取控件类名:class_name
print(menu.get_properties()) //获取控件的属性,返回的字典:get_properties(以上属性都会列出)
P10 窗口及控件截图处理
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["notepad"] //选择窗口
menu = dlg["Menu"] //选择菜单
file = menu.child_window(title="文件") //选择菜单项:文件
pic = dlg.capture_as_image() //截图
print(pic) //打印信息
pic.save("01.png") //保存截图
P11 菜单控件的相关操作
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["notepad"] //选择窗口
menu = dlg["Menu"] //选择菜单
file = menu.child_window(title="文件") //选择菜单项:文件
// -----菜单控件相关的操作-----
print(menu.items()) //获取菜单的子菜单项
m = menu.item_by_index(0) //通过下标去选择菜单项:item_by_index
print(m)
n = menu.item_by_path("文件->新建连接") //通过路径去选择菜单项:item_by_path
print(n)
// -----菜单项的操作方法-----
file.click_input() //点击菜单项的方法:click_input
P12 Pywinauto的等待机制
import time
time.sleep(1) //等待时间
-
wait方法:等待窗口处于某个状态 / wait_not方法:等待窗口不处于某个特定状态
-
参数:
- wait_for:等待的状态
- exists:表示该窗口是有效的句柄
- visible:表示该窗口未隐藏
- enabled:表示未禁用窗口
- ready:表示该窗口可见并启用
- active:表示该窗口处于活动状态
- timeout:超时时间
- retry_interval:重试时间间隔
- wait_for:等待的状态
-
-
wait_cpu_usage_lower 方法:等待该进程的cup的使用率低于某个阀值。
-
注意:此方法仅适用于整个应用程序进程,不适用于窗口/元素。
-
参数:
- threshold:该进程cup占用率
- timeout:超时时间
- retry_interval:重试时间间隔
-
from pywinauto.application import Application
app = Application(bacckend = "uia").start("notpad.exe") //打开程序
dlg = app["notepad"] //选择窗口
menu = dlg["Menu"] //选择菜单
file = menu.child_window(title="文件") //选择菜单项:文件
file.click_input() //点击文件
menu.item_by_path("文件->新建连接").click_input() //点击新建连接
# 等待窗口处于可见状态
new_dlg = app["新建连接"] //选择新建连接的窗口
new_dlg.wait(wait_for="ready",timeout=10,retry_interval=1) //如果状态为'ready',就会执行下一行代码。
# 等待窗口处于不可见状态
new_dlg.wait_not(wait_for_not="ready",timeout=10,retry_interval=1) //如果状态为'ready',就会执行下一行代码。
app = Application().connect(process=17260) //连接打开的进程
app.wait_cpu_usage_lower(threshold=20,timeout=5,usage_interval=1)
print("等待通过,当前该进程cup占用率低于20%")
-
等待机制之timings模块
-
wait_until方法
-
参数
- timeout:超时时间
- retry_interval:重试时间
- func:执行的函数
- value:比较的值
- op:比较方式函数(默认相等)
- args:给执行函数传位置参数
- kwargs:给执行函数传关键字参数
-
-
from pywinauto.timings import wait_until
"""
等函数返回的结果为5的时候,继续往下执行
"""
i = 0
def work():
global i
i += 1
print("当前i的值为",i)
return i
# 等待work返回的结果为5,继续往下执行
wait_until(10,1,work,5)
print("等待通过")
-
全局计时变量值的设置方法
- timings.defaults():将全局计时设为默认值
- timings.slow():将所有时间加倍
- timings.fast():将所有计时除以2
P13 编辑类控件的基本操作
"""
打开笔记本,替换里面的文字。
"""
import pywinauto
app = pywinauto.Application().start("notepad.exe") //运行程序
dlg = app["无标题 - 记事本"] //选择主窗口
dlg.print_contol_identifiers() //获取窗口的控件信息
dlg["Edit"].type_keys("这里是输入的文字.") //选择编辑框
dlg.menu_select("编辑->替换(R)") //通过菜单选择替换(这个方法,有的程序能用,有的不能用)
app["替换"].print_control_identifiers() //获取替换窗口的控件信息
app["替换"]["Edit1"].type_keys("666") //选择查找编辑框
app["替换"]["Edit2"].type_keys("999") //选择替换为编辑框
app["替换"]["Button3"].click() //选择全部替换按钮,并点击
P14 模拟用户键盘操作
-
键盘操作模块:pywinauto.keyboard
-
send_keys方法:send_keys(按键)
- 按F5:send_keys({VK_F5})
- 按回车键:send_keys({VK_RETURN})
- 按普通字母键:send_keys('A')
-
ESC | VK_ESCAPE(27) | Shift | VK_SHIFT(16) |
回车 | VK_RETURN(13) | Ctrl | VK_CONTROL(17) |
TAB | VK_TAB(9) | Alt | VK_MENU(18) |
Caps Lock | VK_CAPITAL(20) | 空格 | VK_SPACE(32) |
退格 | VK_BACK(8) | 左/右win | VK_LWIN(91) / RWIN(92) |
send_keys("{VK_LWIN}")
send_keys("cmd")
send_keys("{VK_RETURN}")
send_keys("{VK_LWIN}cmd{VK_RETURN}")
-
键盘修饰符的使用
- + :按Shift
- ^ :按Ctrl
- % : 按Alt
- ^s :按Ctrl+S
from pywinauto.keyboard import send_keys
send_keys("^a")
send_keys("^+n")
send_keys("%+{VK_F9}")
P15 模拟鼠标操作
click:鼠标单击
from pywinauto import mouse
mouse.click(coords=(580,52)) #默认鼠标左键