Python的Windows GUI自动化之Pywinauto(三)
引言:
上一章节中,我们介绍了Pywinauto 是一个用于自动化 Windows 应用程序的 Python 库。它提供了一组功能强大的工具,可以通过控件和窗口句柄来操作和控制 Windows 程序。下面让我们实际操作
注:下面的截图都是自己本人今日头条文章上的,做迁移
一、安装三方包Pywinauto
前提条件:
安装 Python:确保您已在计算机上安装了 Python。您可以从官方网站(
https://www.python.org/downloads/)上下载最新的 Python 版本,并按照安装向导进行安装。
安装 Microsoft Visual C++:某些 Pywinauto 的依赖库需要 Microsoft Visual C++ 14.0 运行时。您可以从 Microsoft 官方网站(
https://visualstudio.microsoft.com/downloads/)上下载并安装适用于您的操作系统的最新版本。(一般不需要)
①联网情况下,电脑 win+R 打开 输入cmd,
然后输入命令 pip install Pywinauto,完成三方包的安装
②若无法连接互联网则去官网下载对应的三方包,然后安装
登录:https://pypi.org/ 然后搜索Pywinauto,下载
下载后将其拷贝到自己的python安装目录 我的是在d盘,然后执行安装命令,注意截图的执行路径,一定要切换到这个路径
二、应用程序实践操作
下面我们用node++来进行实例说明吧,其他window程序同理
2.1 启动应用程序
一般启动应用程序时,此程序可能进程还在,所以一般我都是先杀掉进程再启动
import psutil
from pywinauto import Application
for process in psutil.process_iter(): #杀掉进程
try:
processinfo = process.as_dict(attrs=['pid', 'name'])
if processinfo['name'] == 'notepad++.exe': #notepad++.exe是进程名,也可以使用进程pid杀掉进程
process.kill()
except psutil.NoSuchProcess:
pass
path = r'C:\Program Files (x86)\Notepad++\notepad++.exe' #应用程序安装的路径
app = Application(backend='uia').start(path)
app['Notepad++'].print_control_identifiers() #获取Notepad++ 界面所有的控件信息
#这里为什么启动用Application 前面一章节有解释
执行完毕后就可以看到应用程序已经启动起来
获取控件信息
app['Notepad++'].print_control_identifiers() #获取Notepad++ 界面所有的控件信息
控件信息内容打印如下:
Control Identifiers:
Dialog - 'new 1 - Notepad++' (L315, T249, R1655, B908)
['new 1 - Notepad++Dialog', 'new 1 - Notepad++', 'Dialog']
child_window(title="new 1 - Notepad++", control_type="Window")
|
| Pane - '' (L325, T351, R1645, B876)
| ['Pane', 'Pane0', 'Pane1']
|
| TabControl - 'Tab' (L323, T325, R1647, B878)
| ['TabTabControl', 'Tab', 'TabControl']
| child_window(title="Tab", control_type="Tab")
| |
| | TabItem - 'new 1' (L325, T327, R395, B349)
| | ['TabItem', 'new 1TabItem', 'new 1']
| | child_window(title="new 1", control_type="TabItem")
|
| StatusBar - '' (L323, T878, R1647, B900)
| ['Normal text fileStatusBar', 'StatusBar']
| |
| | Static - 'Normal text file' (L323, T880, R907, B900)
| | ['Static', 'Normal text file', 'Normal text fileStatic', 'Static0', 'Static1']
| | child_window(title="Normal text file", control_type="Text")
| |
| | Static - 'length : 0 lines : 1' (L909, T880, R1107, B900)
| | ['Static2', 'length : 0 lines : 1', 'length : 0 lines : 1Static']
| | child_window(title="length : 0 lines : 1", control_type="Text")
| |
| | Static - 'Ln : 1 Col : 1 Sel : 0 | 0' (L1109, T880, R1367, B900)
| | ['Static3', 'Ln : 1 Col : 1 Sel : 0 | 0', 'Ln : 1 Col : 1 Sel : 0 | 0Static']
| | child_window(title="Ln : 1 Col : 1 Sel : 0 | 0", control_type="Text")
| |
| | Static - 'Windows (CR LF)' (L1369, T880, R1477, B900)
| | ['Static4', 'Windows (CR LF)', 'Windows (CR LF)Static']
| | child_window(title="Windows (CR LF)", control_type="Text")
| |
| | Static - 'UTF-8' (L1479, T880, R1597, B900)
| | ['Static5', 'UTF-8', 'UTF-8Static']
| | child_window(title="UTF-8", control_type="Text")
| |
| | Static - 'INS' (L1599, T880, R1627, B900)
| | ['Static6', 'INSStatic', 'INS']
| | child_window(title="INS", control_type="Text")
|
| Pane - '' (L323, T300, R1647, B325)
| ['Pane2']
| |
| | Toolbar - '' (L325, T300, R1647, B325)
| | ['Toolbar']
| | |
| | | Button - '' (L325, T300, R348, B322)
| | | ['Button', 'Button0', 'Button1']
| | |
| | | Button - '' (L348, T300, R371, B322)
| | | ['Button2']
| | |
| | | Button - '' (L371, T300, R394, B322)
| | | ['Button3']
| | |
| | | Button - '' (L394, T300, R417, B322)
| | | ['Button4']
| | |
| | | Button - '' (L417, T300, R440, B322)
| | | ['Button5']
| | |
| | | Button - '' (L440, T300, R463, B322)
| | | ['Button6']
| | |
| | | Button - '' (L463, T300, R486, B322)
| | | ['Button7']
| | |
| | | Button - '' (L494, T300, R517, B322)
| | | ['Button8']
| | |
| | | Button - '' (L517, T300, R540, B322)
| | | ['Button9']
| | |
| | | Button - '' (L540, T300, R563, B322)
| | | ['Button10']
| | |
| | | Button - '' (L571, T300, R594, B322)
| | | ['Button11']
| | |
| | | Button - '' (L594, T300, R617, B322)
| | | ['Button12']
| | |
| | | Button - '' (L625, T300, R648, B322)
| | | ['Button13']
| | |
| | | Button - '' (L648, T300, R671, B322)
| | | ['Button14']
| | |
| | | Button - '' (L679, T300, R702, B322)
| | | ['Button15']
| | |
| | | Button - '' (L702, T300, R725, B322)
| | | ['Button16']
| | |
| | | Button - '' (L733, T300, R756, B322)
| | | ['Button17']
| | |
| | | Button - '' (L756, T300, R779, B322)
| | | ['Button18']
| | |
| | | Button - '' (L787, T300, R810, B322)
| | | ['Button19']
| | |
| | | Button - '' (L810, T300, R833, B322)
| | | ['Button20']
| | |
| | | Button - '' (L833, T300, R856, B322)
| | | ['Button21']
| | |
| | | Button - '' (L856, T300, R879, B322)
| | | ['Button22']
| | |
| | | Button - '' (L879, T300, R902, B322)
| | | ['Button23']
| | |
| | | Button - '' (L902, T300, R925, B322)
| | | ['Button24']
| | |
| | | Button - '' (L925, T300, R948, B322)
| | | ['Button25']
| | |
| | | Button - '' (L948, T300, R971, B322)
| | | ['Button26']
| | |
| | | Button - '' (L979, T300, R1002, B322)
| | | ['Button27']
| | |
| | | Button - '' (L1002, T300, R1025, B322)
| | | ['Button28']
| | |
| | | Button - '' (L1025, T300, R1048, B322)
| | | ['回放(P)', '回放(P)Button', 'Button29']
| | |
| | | Button - '' (L1048, T300, R1071, B322)
| | | ['重复运行宏(R)...', '重复运行宏(R)...Button', 'Button30']
| | |
| | | Button - '' (L1071, T300, R1094, B322)
| | | ['保存录制宏(S)...Button', '保存录制宏(S)...', 'Button31']
|
| TitleBar - '' (L339, T252, R1647, B280)
| ['TitleBar']
| |
| | Menu - '系统' (L323, T257, R345, B279)
| | ['系统', '系统Menu', 'Menu', '系统0', '系统1', 'Menu0', 'Menu1']
| | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")
| | |
| | | MenuItem - '系统' (L323, T257, R345, B279)
| | | ['系统2', '系统MenuItem', 'MenuItem', 'MenuItem0', 'MenuItem1']
| | | child_window(title="系统", control_type="MenuItem")
| |
| | Button - '最小化' (L1508, T250, R1555, B280)
| | ['最小化Button', '最小化', 'Button32']
| | child_window(title="最小化", control_type="Button")
| |
| | Button - '最大化' (L1555, T250, R1601, B280)
| | ['最大化', '最大化Button', 'Button33']
| | child_window(title="最大化", control_type="Button")
| |
| | Button - '关闭' (L1601, T250, R1648, B280)
| | ['关闭Button', '关闭', 'Button34']
| | child_window(title="关闭", control_type="Button")
|
| Menu - '应用程序' (L323, T280, R1647, B299)
| ['应用程序', 'Menu2', '应用程序Menu']
| child_window(title="应用程序", auto_id="MenuBar", control_type="MenuBar")
| |
| | MenuItem - '文件(F)' (L323, T280, R375, B299)
| | ['文件(F)MenuItem', 'MenuItem2', '文件(F)']
| | child_window(title="文件(F)", control_type="MenuItem")
| |
| | MenuItem - '编辑(E)' (L375, T280, R428, B299)
| | ['编辑(E)MenuItem', '编辑(E)', 'MenuItem3']
| | child_window(title="编辑(E)", control_type="MenuItem")
| |
| | MenuItem - '搜索(S)' (L428, T280, R481, B299)
| | ['搜索(S)MenuItem', '搜索(S)', 'MenuItem4']
| | child_window(title="搜索(S)", control_type="MenuItem")
| |
| | MenuItem - '视图(V)' (L481, T280, R535, B299)
| | ['视图(V)', 'MenuItem5', '视图(V)MenuItem']
| | child_window(title="视图(V)", control_type="MenuItem")
| |
| | MenuItem - '编码(N)' (L535, T280, R591, B299)
| | ['编码(N)', 'MenuItem6', '编码(N)MenuItem']
| | child_window(title="编码(N)", control_type="MenuItem")
| |
| | MenuItem - '语言(L)' (L591, T280, R643, B299)
| | ['语言(L)MenuItem', 'MenuItem7', '语言(L)']
| | child_window(title="语言(L)", control_type="MenuItem")
| |
| | MenuItem - '设置(T)' (L643, T280, R696, B299)
| | ['设置(T)MenuItem', '设置(T)', 'MenuItem8']
| | child_window(title="设置(T)", control_type="MenuItem")
| |
| | MenuItem - '工具(O)' (L696, T280, R752, B299)
| | ['工具(O)', '工具(O)MenuItem', 'MenuItem9']
| | child_window(title="工具(O)", control_type="MenuItem")
| |
| | MenuItem - '宏(M)' (L752, T280, R798, B299)
| | ['宏(M)', '宏(M)MenuItem', 'MenuItem10']
| | child_window(title="宏(M)", control_type="MenuItem")
| |
| | MenuItem - '运行(R)' (L798, T280, R852, B299)
| | ['运行(R)', 'MenuItem11', '运行(R)MenuItem']
| | child_window(title="运行(R)", control_type="MenuItem")
| |
| | MenuItem - '插件(P)' (L852, T280, R905, B299)
| | ['MenuItem12', '插件(P)', '插件(P)MenuItem']
| | child_window(title="插件(P)", control_type="MenuItem")
| |
| | MenuItem - '窗口(W)' (L905, T280, R963, B299)
| | ['窗口(W)MenuItem', '窗口(W)', 'MenuItem13']
| | child_window(title="窗口(W)", control_type="MenuItem")
| |
| | MenuItem - '?' (L963, T280, R983, B299)
| | ['?MenuItem', '?', 'MenuItem14']
| | child_window(title="?", control_type="MenuItem")
| |
| | MenuItem - 'X' (L1625, T280, R1647, B299)
| | ['MenuItem15', 'XMenuItem', 'X']
| | child_window(title="X", control_type="MenuItem")
Process finished with exit code 0
接下来我们则需要这些控件信息操作应用程序中的控件来实现自动化,大家可以自己将上面代码拷贝操作下
作者:经历一个春