您现在的位置是:首页 > 数码 > 

python 操作 windows 控件

2025-07-19 06:08:45
python 操作 windows 控件 这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官方的文档,发现这个东西使用起来还真是非常方便

python 操作 windows 控件

这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官方的文档,发现这个东西使用起来还真是非常方便,下面我也以notepad为例来说明一下它的简单操作。

安装

.ctypes (如果你是python2.或者2.4)

检测你是否安装正确

>>> from pywinauto import application

>>> app = application.Application.start()

>>> TypeKeys(%FX)

都安装好了以后,我们来正式进入pywinauto的世界

一、启动程序

from pywinauto import application

app = application.Application.start( )

start() 函数里也可以接路径程序名

使用spylite查看notepad的信息

里面的窗口类名与标题文本相关重要,以后的查窗口基本上都要用的到

现在我们来点击“帮助->关于记事本”操作

MenuSelect( 帮助->关于记事本 .decode( gb212 ))

这里的app是你刚才实例的对象,otepad是类名,可以从spylite中看到,MenuSelect方法可以自动检索otepad上的菜单选项,

decode(‘gb212’)方法是把中文强制转换为unicode编码,对于非英文的操作系统都是要转换的,后面还有更简单的方法

二、查“关于记事本”的窗口

还是使用spylite来查看“关于记事本”的信息

窗口类名:#2770

标题文字:关于“记事本”

官方法文档中有以下两个方法

1. 通过top_dlg = _window_() 来获得最上面的window,但是官方并不推荐这种方式,目前来说这个“关于记事本”是最上面,但是也不能保证在测试的进程当中有什么意外的进程跑到了上面,一旦有新的进程,那么得到的就是一个错误的对象

2.通过find_dlg = app.window_(title_re = ‘’, class_name = ‘’) 方法获得,这也是为什么我上面说标题文本与窗口类名非常重要的原因,title_re和 class_name这两个可以单独使用也可以一块使用,因为有时没有标题文本,也有时一个窗口类名有多个对象,比如“Edit”有时当一个对话框中有多个输入框时会有多个Edit类名,对于“关于记事本”我们可以通过以下代码获得

about_dlg = app.window_(title_re = u关于, class_name = #2770)

中文要进行unicode编码,这里也可以通过decode(‘gb212’)方法实现,但是不如输入一个U省事~ 呵呵

我们print一下得到的about_dlg

说明我们得到的是一个application.WindowSpecification对象

三、在”关于记事本”窗口上到“确定”按钮(button)

在pywinauto中,对话框下面的是controller,button,checkbox,textbox等都是controller

我们可以使用print_control_identifiers() 方法来打印出该窗口中所有的controller

about_dlg.print_control_identifiers()

会得到以下的输出

Control Identifiers:

Static - (L12, T265, R78, B267)

0 1 Static Static0 Static1

Static - (L08, T280, R40, B1)

2 Static2

Static - Microsoft Windows (L50, T280, R695, B295)

Microsoft Windows Microsoft WindowsStatic Static

Static - \u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601: Service Pack 1) (L50, T295, R748, B10)

Static4 \u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601: Service Pack 1) \u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601: Service Pack 1)Static

Static - \u7248\u674\u6240\u6709 \xa9 2009 Microsoft Corporation\u002\u4fdd\u7559\u6240\u6709\u674\u5229\u002 (L50, T10, R710, B25)

Static5 \u7248\u674\u6240\u6709 \xa9 2009 Microsoft Corporation\u002\u4fdd\u7559\u6240\u6709\u674\u5229\u002 \u7248\u674\u6240\u6709 \xa9 2009 Microsoft Corporation\u002\u4fdd\u7559\u6240\u6709\u674\u5229\u002Static

Static - Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002 (L50, T25, R710, B85)

Static6 Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002 Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002Static Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002Static0 Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002Static1

Static - (L50, T85, R665, B415)

Static7 Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002Static2

SysLink - \u689\u66e Microsoft \u8f6f\u4ef6\u8bb8\u5ef\u6761\u6be\uff0c\u672c\u4ea7\u54c1\u4f7f\u7528\u674\u5c5e\u4e8e: (L50, T415, R665, B445)

SysLink \u689\u66e Microsoft \u8f6f\u4ef6\u8bb8\u5ef\u6761\u6be\uff0c\u672c\u4ea7\u54c1\u4f7f\u7528\u674\u5c5e\u4e8e: \u689\u66e Microsoft \u8f6f\u4ef6\u8bb8\u5ef\u6761\u6be\uff0c\u672c\u4ea7\u54c1\u4f7f\u7528\u674\u5c5e\u4e8e:SysLink

Static - kevin (L65, T445, R680, B460)

Static8 kevin kevinStatic kevinStatic0 kevinStatic1

Static - (L65, T460, R680, B475)

Static9 kevinStatic2

Button - \u786e\u5b9a (L672, T50, R747, B524)

Button \u786e\u5b9a \u786e\u5b9aButton

static,SysLink,button等是它类型,后面接的是title,都是unicode的,这里面就有没有title的controller,再后面的(L,T,R,B)是这个控件的位置,分别对应着左上右下

在”关于记事本”窗口上到“确定”按钮,可以通过app.window_()方法,传入的参数可以是title,也可以是class_name,所以我说这两个值相当重要,一直在用,这里的title支持正则表达式,非常方便

在app上先到about_dlg,然后再about_dlg上确定button

app.window_(title_re = u 关于“记事本” ).window_(title_re = u 确定 ),然后通过Click()方法来单击这个button

另外一种方法也是官方推荐的在非英文系统下的方法

OK = u 确定

about_dlg[OK].Click()

这个的意思就是在about_dlg下到u’确定’,看起来比上面要简练好理解,理解了这种方式,接下来还有更简单的,都不用about_dlg

直接 app[u 关于“记事本” ][u 确定 ].Click()

四、在记事本里写点东西

这个其实在校验pywinauto的时候已经做过了全用TypeKeys函数,但是这里如果要输入中文还是要u一下

TypeKeys(u杨彦星)

五、一个比较恶心的问题

在MenuSelect函数中不支持正则,完全是全文匹配,如我输入

dig = MenuSelect(编辑->替换.decode( gb212 )) 是不到对象的

必须要

dig = MenuSelect(编辑(E)->替换(R).decode( gb212 )) 这样才行,得把(R) (E)写上才行,但是奇怪的是上面的“帮助->关于记事本”就不用输入,所以说是一个挺恶心的问题,我也不知道这是为什么……

最后把上面的函数合并一下,跑下来应该会很快

#! /usr/bin/env python

#coding=gbk

import time

from pywinauto import application

app = application.Application.start( )

MenuSelect( 帮助->关于记事本 .decode( gb212 ))

time.sleep(.5)

#这里有两种方法可以进行定位“关于记事本”的对话框

#top_dlg = _window_() 不推荐这种方式,因为可能得到的并不是你想要的

about_dlg = app.window_(title_re = u关于, class_name = #2770)#这里可以进行正则匹配title

#about_dlg.print_control_identifiers()

app.window_(title_re = u 关于“记事本” ).window_(title_re = u 确定 ).Click()

MenuSelect( 帮助->关于记事本 .decode( gb212 ))

time.sleep(.5) #停0.5s 否则你都看不出来它是否弹出来了!

ABOUT = u 关于“记事本”

OK = u 确定

#about_dlg[OK].Click()

#app[ABOUT][OK].Click()

app[u 关于“记事本” ][u 确定 ].Click()

TypeKeys(u杨彦星)

dig = MenuSelect(编辑(E)->替换(R).decode( gb212 ))

Replace = u 替换

Cancle = u 取消

time.sleep(.5)

app[Replace][Cancle].Click()

dialogs = app.windows_()

先写这么多,以后再写点更多的应用~

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/819972.html

相关标签:无
上传时间: 2024-01-25 09:50:57
留言与评论(共有 19 条评论)
本站网友 市长
29分钟前 发表
T85
本站网友 朔州美食
18分钟前 发表
一个比较恶心的问题在MenuSelect函数中不支持正则,完全是全文匹配,如我输入dig = MenuSelect(编辑->替换.decode( gb212 )) 是不到对象的必须要dig = MenuSelect(编辑(E)->替换(R).decode( gb212 )) 这样才行,得把(R) (E)写上才行,但是奇怪的是上面的“帮助->关于记事本”就不用输入,所以说是一个挺恶心的问题,我也不知道这是为什么……最后把上面的函数合并一下,跑下来应该会很快#! /usr/bin/env python#coding=gbkimport timefrom pywinauto import applicationapp = application.Application.start( )MenuSelect( 帮助->关于记事本 .decode( gb212 ))time.sleep(.5)#这里有两种方法可以进行定位“关于记事本”的对话框#top_dlg = _window_() 不推荐这种方式,因为可能得到的并不是你想要的about_dlg = app.window_(title_re = u关于
本站网友 jiubo
10分钟前 发表
B25) Static5 \u7248\u674\u6240\u6709 \xa9 2009 Microsoft Corporation\u002\u4fdd\u7559\u6240\u6709\u674\u5229\u002 \u7248\u674\u6240\u6709 \xa9 2009 Microsoft Corporation\u002\u4fdd\u7559\u6240\u6709\u674\u5229\u002Static Static - Windows 7 \u65d7\u820\u7248 \u64cd\u4f5c\u7cfb\u7edf\u5ca\u5176\u7528\u627\u754c\u9762\u5d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u570\u5a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e0\u6216\u5df2\u9881\u5e0\u7684\u77e5\u8bc6\u4ea7\u674\u6cd5\u4fdd\u62a4\u002 (L50
本站网友 雪梨银耳汤
25分钟前 发表
在记事本里写点东西这个其实在校验pywinauto的时候已经做过了全用TypeKeys函数,但是这里如果要输入中文还是要u一下TypeKeys(u杨彦星)五
本站网友 海口写字楼
9分钟前 发表
然后再about_dlg上确定buttonapp.window_(title_re = u 关于“记事本” ).window_(title_re = u 确定 ),然后通过Click()方法来单击这个button另外一种方法也是官方推荐的在非英文系统下的方法OK = u 确定 about_dlg[OK].Click()这个的意思就是在about_dlg下到u’确定’,看起来比上面要简练好理解,理解了这种方式,接下来还有更简单的,都不用about_dlg直接 app[u 关于“记事本” ][u 确定 ].Click()四
本站网友 医保卡的使用
29分钟前 发表
python 操作 windows 控件 这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官方的文档,发现这个东西使用起来还真是非常方便,下面我也以notepad为例来说明一下它的简单操作
本站网友 三井
26分钟前 发表
class_name = ‘’) 方法获得,这也是为什么我上面说标题文本与窗口类名非常重要的原因,title_re和 class_name这两个可以单独使用也可以一块使用,因为有时没有标题文本,也有时一个窗口类名有多个对象,比如“Edit”有时当一个对话框中有多个输入框时会有多个Edit类名,对于“关于记事本”我们可以通过以下代码获得about_dlg = app.window_(title_re = u关于
本站网友 强剑
22分钟前 发表
B10) Static4 \u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601
本站网友 茂名房产
6分钟前 发表
也可以是class_name
本站网友 伊丽莎白鼠
4分钟前 发表
Service Pack 1) \u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601
本站网友 山外有山人外有人
22分钟前 发表
B10) Static4 \u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601
本站网友 中国成功
30分钟前 发表
T
本站网友 黑豆怎么吃最好
10分钟前 发表
B524) Button \u786e\u5b9a \u786e\u5b9aButton static,SysLink
本站网友 山药胡萝卜排骨汤
18分钟前 发表
R680
本站网友 森马代言人
30分钟前 发表
B524) Button \u786e\u5b9a \u786e\u5b9aButton static,SysLink
本站网友 笑场
8分钟前 发表
python 操作 windows 控件 这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官方的文档,发现这个东西使用起来还真是非常方便,下面我也以notepad为例来说明一下它的简单操作
本站网友 七星聚首
9分钟前 发表
查“关于记事本”的窗口还是使用spylite来查看“关于记事本”的信息窗口类名:#2770标题文字:关于“记事本”官方法文档中有以下两个方法1. 通过top_dlg = _window_() 来获得最上面的window,但是官方并不推荐这种方式,目前来说这个“关于记事本”是最上面,但是也不能保证在测试的进程当中有什么意外的进程跑到了上面,一旦有新的进程,那么得到的就是一个错误的对象2.通过find_dlg = app.window_(title_re = ‘’
本站网友 狐狸眼
1分钟前 发表
T445