本章主要是通过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")