本章主要是通过pywinauto模块实现对windows上的一些窗口应用进行自动化运行
pywinauto这几天用下来感觉很方便也很稳定,但是有些软件的title,class_name还是无法定位到,需要结合到别的模块或方法实现自动化。
主要步骤:
- 启动应用程序
- 连接应用程序
- 得到应用主窗口
- 通过pywinauto模块内的方法对程序主窗口的控件进行操作
安装
pip install pywinauto -i https://pypi.douban.com/simple # 安装pywinauto模块
检查工具,通过这些工具能够得到程序窗口和控件信息
- Inspect 是一种基于 Windows 的工具,通过该工具,您可以选择任意 UI 元素并查看元素的可访问性数据 。
https://accessibilityinsights.io/docs/en/windows/getstarted/inspect/ # inspct下载地址
- 推荐使用spy++,有查找窗口的功能,把准星对准窗口,就能得到窗口的信息

一些基础的方法
from pywinauto.application import Application
import win32gui
import time
app = Application(backend='uia').start(r"d:\win_install\Nuke-12.2v2-win-x86-64-installer.exe") # 打开程序
time.sleep(3) # 等待程序启动
nuke_handle = win32gui.FindWindow(0,
"Nuke 12.2v2 安装") # 获取窗口句柄,单纯使用title连接程序,有时会报错,通过title和句柄连接可以避免pywinauto.findwindows.ElementNotFoundError错误
app.connect(title="QQ", handle=nuke_handle)
mainwindow = app.window(title_re="QQ", handle=nuke_handle) # 获取程序主窗口
mainwindow.print_control_identifiers() # 打印主窗口上的所有控件
得到的主窗口控件

窗口控件类型(包括但不限于下列)

针对这些窗口控件可以进行一些操作
# 获取控件的文本内容
print(mainwindow.child_window(title="关闭", control_type="Button").texts())
# 对窗口截图保存
pic = mainwindow.capture_as_image()
pic.save('01.png')
对菜单控件的一些操作
# 通过下标选择菜单项
menu = window['menu']
print(menu.items())#获取菜单的子菜单项
m = menu.item_by_index(1)
print(m)
# 通过路径选择菜单项
menu = window['menu']
print(menu.items())#获取菜单的子菜单项
m = menu.item_by_path("文件->新建连接...")
print(m)
# 点击菜单项
m.click_input()#点击
鼠标方法

键盘方法

写一个自动安装Nuke软件脚本
from pywinauto.application import Application
import time
import os
import win32gui
import pywinauto.keyboard as kb
# 启动安装程序程序
os.startfile(r"d:\win_install\Nuke-12.2v2-win-x86-64-installer.exe")
print("安装程序启动中,请稍等...")
for i in range(10):
time.sleep(1)
try:
if win32gui.FindWindow(0, "Nuke 12.2v2 安装"):
break
except:
pass
nuke_handle = win32gui.FindWindow(0, "Nuke 12.2v2 安装")
app = Application(backend="uia")
app.connect(title="Nuke 12.2v2 安装", handle=nuke_handle)
mainwindow = app.window(title="Nuke 12.2v2 安装", handle=nuke_handle)
mainwindow["下一步(&N) >"].click()
time.sleep(2)
mainwindow["我接受(&I)"].click()
time.sleep(2)
mainwindow["下一步(&N) >"].click()
time.sleep(2)
mainwindow["安装(&I)"].click()
kb.send_keys("{VK_RETURN}") # 这里不知道怎么卡住了,改用键盘enter选择安装
print("等待安装完成")
for i in range(600):
print(".")
time.sleep(3)
try:
mainwindow["完成(&F)"].click()
time.sleep(3)
break
except:
pass
print("nuke 安装完成")
os.system("pause")
