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

安装

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

检测你是否安装正确

>>> from pywinauto import application

>>> app = application.Application.start("notepad.exe")

>>> app.notepad.TypeKeys("%FX")

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

一、启动程序

1

2

from pywinautoimport application

app= application.Application.start('notepad.exe')

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

使用spy++lite查看notepad的信息

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

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

1

app.Notepad.MenuSelect('帮助->关于记事本'.decode('gb2312'))

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

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

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

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

窗口类名:#32770

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

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

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

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

1

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

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

我们print一下得到的about_dlg

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

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

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

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

1

about_dlg.print_control_identifiers()

会得到以下的输出

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Control Identifiers:

Static- '' (L312, T265, R738, B267)

'' '0' '1' 'Static' 'Static0' 'Static1'

Static- '' (L308, T280, R340, B313)

'2' 'Static2'

Static- 'Microsoft Windows' (L350, T280, R695, B295)

'Microsoft Windows' 'Microsoft WindowsStatic' 'Static3'

Static- '\u7248\u672c 6.1 (\u5185\u90e8\u7248\u672c 7601: Service Pack 1)' (L350, T295, R748, B310)

'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\u6743\u6240\u6709 \xa9 2009 Microsoft Corporation\u3002\u4fdd\u7559\u6240\u6709\u6743\u5229\u3002' (L350, T310, R710, B325)

'Static5' '\u7248\u6743\u6240\u6709 \xa9 2009 Microsoft Corporation\u3002\u4fdd\u7559\u6240\u6709\u6743\u5229\u3002' '\u7248\u6743\u6240\u6709 \xa9 2009 Microsoft Corporation\u3002\u4fdd\u7559\u6240\u6709\u6743\u5229\u3002Static'

Static- 'Windows 7 \u65d7\u8230\u7248 \u64cd\u4f5c\u7cfb\u7edf\u53ca\u5176\u7528\u6237\u754c\u9762\u53d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u5730\u533a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e03\u6216\u5df2\u9881\u5e03\u7684\u77e5\u8bc6\u4ea7\u6743\u6cd5\u4fdd\u62a4\u3002' (L350, T325, R710, B385)

'Static6' 'Windows 7 \u65d7\u8230\u7248 \u64cd\u4f5c\u7cfb\u7edf\u53ca\u5176\u7528\u6237\u754c\u9762\u53d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u5730\u533a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e03\u6216\u5df2\u9881\u5e03\u7684\u77e5\u8bc6\u4ea7\u6743\u6cd5\u4fdd\u62a4\u3002' 'Windows 7 \u65d7\u8230\u7248 \u64cd\u4f5c\u7cfb\u7edf\u53ca\u5176\u7528\u6237\u754c\u9762\u53d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u5730\u533a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e03\u6216\u5df2\u9881\u5e03\u7684\u77e5\u8bc6\u4ea7\u6743\u6cd5\u4fdd\u62a4\u3002Static' 'Windows 7 \u65d7\u8230\u7248 \u64cd\u4f5c\u7cfb\u7edf\u53ca\u5176\u7528\u6237\u754c\u9762\u53d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u5730\u533a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e03\u6216\u5df2\u9881\u5e03\u7684\u77e5\u8bc6\u4ea7\u6743\u6cd5\u4fdd\u62a4\u3002Static0' 'Windows 7 \u65d7\u8230\u7248 \u64cd\u4f5c\u7cfb\u7edf\u53ca\u5176\u7528\u6237\u754c\u9762\u53d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u5730\u533a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e03\u6216\u5df2\u9881\u5e03\u7684\u77e5\u8bc6\u4ea7\u6743\u6cd5\u4fdd\u62a4\u3002Static1'

Static- '' (L350, T385, R665, B415)

'Static7' 'Windows 7 \u65d7\u8230\u7248 \u64cd\u4f5c\u7cfb\u7edf\u53ca\u5176\u7528\u6237\u754c\u9762\u53d7\u7f8e\u56fd\u548c\u5176\u4ed6\u56fd\u5bb6/\u5730\u533a\u7684\u5546\u6807\u6cd5\u548c\u5176\u4ed6\u5f85\u9881\u5e03\u6216\u5df2\u9881\u5e03\u7684\u77e5\u8bc6\u4ea7\u6743\u6cd5\u4fdd\u62a4\u3002Static2'

SysLink- '\u6839\u636e Microsoft \u8f6f\u4ef6\u8bb8\u53ef\u6761\u6b3e\uff0c\u672c\u4ea7\u54c1\u4f7f\u7528\u6743\u5c5e\u4e8e:' (L350, T415, R665, B445)

'SysLink' '\u6839\u636e Microsoft \u8f6f\u4ef6\u8bb8\u53ef\u6761\u6b3e\uff0c\u672c\u4ea7\u54c1\u4f7f\u7528\u6743\u5c5e\u4e8e:' '\u6839\u636e Microsoft \u8f6f\u4ef6\u8bb8\u53ef\u6761\u6b3e\uff0c\u672c\u4ea7\u54c1\u4f7f\u7528\u6743\u5c5e\u4e8e:SysLink'

Static- 'kevin' (L365, T445, R680, B460)

'Static8' 'kevin' 'kevinStatic' 'kevinStatic0' 'kevinStatic1'

Static- '' (L365, T460, R680, B475)

'Static9' 'kevinStatic2'

Button- '\u786e\u5b9a' (L672, T503, 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

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

1

2

OK= u'确定'

about_dlg[OK].Click()

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

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

四、在记事本里写点东西

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

1

app.notepad.TypeKeys(u"杨彦星")

五、一个比较恶心的问题

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

dig = app.Notepad.MenuSelect("编辑->替换".decode('gb2312')) 是找不到对象的

必须要

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#! /usr/bin/env python

#coding=gbk

import time

from pywinautoimport application

app= application.Application.start('notepad.exe')

app.Notepad.MenuSelect('帮助->关于记事本'.decode('gb2312'))

time.sleep(.5)

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

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

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

#about_dlg.print_control_identifiers()

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

app.Notepad.MenuSelect('帮助->关于记事本'.decode('gb2312'))

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

ABOUT= u'关于“记事本”'

OK= u'确定'

#about_dlg[OK].Click()

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

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

app.Notepad.TypeKeys(u"杨彦星")

dig= app.Notepad.MenuSelect("编辑(E)->替换(R)".decode('gb2312'))

Replace= u'替换'

Cancle= u'取消'

time.sleep(.5)

app[Replace][Cancle].Click()

dialogs= app.windows_()

转自:

http://my.oschina.net/yangyanxing/blog/167042

window上记事本python_在中文windows下使用pywinauto进行窗口操作相关推荐

  1. python 操作 windows 控件_在中文windows下使用pywinauto进行窗口操作(一)

    这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官 ...

  2. window上记事本python_[Python] wxPython 高防Windows10记事本 (end...)

    1.开始 接触Python 也有一段时间了,o.o ,断断续续加起来没几天. 一般新学习一门新语言,除了必先输出一个 Hello World 外,都会以模拟 Windows 记事本来写一个结合自己想法 ...

  3. windows里面安装linux系统,超简单!这样在Windows下安装Linux系统,操作更方便

    继Windows10的1607版本之后,微软开始推送WSL(Windows subSystem Linux)的更新(微软表示:我全都要!),也就是说,从此Windows下支持Linux作为子系统. 这 ...

  4. 从本地的win传文件到本地的linux上,pscp.exe实现本地windows下的文件下载(传输)到linux上...

    如果linux服务器为了安全考虑不安装ftp的话,那怎么把本地的文件传输到linux服务器上呢,或者如何吧服务器上的文件下载到本地呢?要用一个软件:pscp.exe 下载地址:http://www.c ...

  5. XShell 将Linux文件上传、下载到Windows下(rz上传、sz下载)

    安装:yum install lrzsz 1.rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具,所以要在Xshell连接属性中的设置上传协议为Zmodem和接受 ...

  6. Windows下ORACLE 10g安装与操作图解

    2007年10月21日 星期日 上午 06:16 刚刚接触ORACLE的人来说,从那里学,如何学,有那些工具可以使用,应该执行什么操作,一定回感到无助.所以在学习使用ORACLE之前,首先来安装一下O ...

  7. Windows下清除cmd命令窗口所有的内容

    直接输入cls,你窗口处所有的内容都会清除 linux下是clear命令,清除当前窗口的内容

  8. windows 下如何让一个窗口置顶?

    这个软件很好用,我用过,可以置顶,DeskPins 欢迎关注

  9. pyw3 windows 启动_用pywin32实现windows下某软件的自动操作

    因为要批量用某软件处理一批eps文件,所以要模拟鼠标及键盘动作,使其能够自动化操作. #-*-coding:utf-8-*- import os import time import win32gui ...

最新文章

  1. 幽默感七个技巧_如何通过三招,让自己成为一个有幽默感的说话高手?
  2. STL库容器vector at函数
  3. 麦块服务器显示连接已丢失,麦块服务器密码怎么设置
  4. ajax--跨域问题及三种简单的解决方案
  5. leecode第六十二题(不同路径)
  6. 网络运维系列:Ubnt ER-X初始化和开启硬件NAT
  7. python 科比投篮数据可视化及简单分析
  8. Windows如何对硬盘进行分区?
  9. 只需几步教你学会域名的使用方法
  10. 计算机软件又必须包括什么,计算机系统应包括硬件和软件两个子系统,硬件和软件又必须依次分别包括______?...
  11. 发光细胞:小鼠活体成像工具细胞原理于应用实例
  12. iPhone屏幕旋转机制详解
  13. DBCO-Raltitrexed-PEG DBCO-雷替曲塞-聚乙二醇
  14. 力荐 50 个最实用的免费机器学习数据集
  15. ORA-01918: user hr does not exist 解决办法
  16. php 热区,jquery如何使热区锚点随图片大小尺寸改变而变化
  17. 2k2实用球员_nba2kol2实用球员
  18. 《演讲之禅》读书笔记
  19. 高校“一卡通”解决方案
  20. 北向资金能预示大盘涨跌?【附Python源码】

热门文章

  1. STM32 L431浮点数性能测试
  2. Naive UI之Data Table
  3. 异构智联Wi-Fi6+蓝牙模组,重新定义多屏互联体验!
  4. c语言取字符数组最后几位
  5. Ubuntu下使用ffmpeg分割和合并视频文件
  6. 禁用/开启Thunderbird/雷鸟邮件客户端发信时的附件提醒功能
  7. html 首字变大,CSS设置首字放大效果(代码实例)
  8. 威洛特:狗狗哮喘会出现哪些症状,如何去有效预防?
  9. 从计算机硬件系统来看 不管计算机配置,上学期《组装与维修》期中考试试题...
  10. How to Root the Samsung Galaxy Note 2 (GT-N7100)