安装
1.安装Python
2.下载SendKeys并安装 (http://pypi.python.org/pypi/SendKeys )
setup.py --install
3.下载pywinauto并安装 (http://pypi.python.org/pypi/pywinauto/0.4.0 )
setup.py --install
4. 研究pywinauto包中的文档及例子
启动应用程序
gWORD2003 = ur"C://Program Files//Microsoft Office//OFFICE11//WINWORD.EXE"
app = application.Application()
app.start_(gWORD2003)
连接到已运行的应用程序
app = application.Application().connect_(title_re = AppName)
如何标识一个窗口
1. 使用窗口标题
gWizardStr = “Wizard”
MainDlg = app[gWizardStr]
窗口标题也可以直接当成一个变量形式使用 (不建议):
MainDlg = app.Wizard
2. 使用正则表达式匹配
dlg = app.window_(title_re = ".* Page Setup", class_name = "#32770")
3. 直接取最上层窗口
MainDlg=app.top_window_()
如何标识一个控件
匹配的顺序为:
a. Title
b. Friendly class
c. Title + Friendly class
使用Title比较简单,如控制Next按钮,下面两种方式有相同的功能:
Dialog.Next.Click()
Dialog[“Next”].Click()
Friendly class对于一般的控件比较简单,如:
Dialog.Button1.Click()
Dialog.ComboBox1.Select(1)
注意Button,Button0及Button1都是代表第一个Button. 关于顺序,也要注意如果存在嵌入窗口,则其内部的子控件顺序是依据其在主窗口的顺序而定的。所以使用如下打印出所有控件的标识很有帮助:
WindowSpecification.print_control_identifiers()
对于自定义的控件,Friendly class 可以通过Visual Studio带的Spy++来查看:
相应的代码为:
canvas = pwin.Afx100000008
如何操控Mouse
示例:
def AdjustSizeOnPreview(WizardDlg,ShiftX,ShiftY):
Offset = 10
OrgRect = WizardDlg.WiaPreviewControl1.Rectangle()
WizardDlg.WiaPreviewControl1.PressMouse(coords = (Offset,Offset))
WizardDlg.WiaPreviewControl1.MoveMouse(coords = (Offset+ShiftX,Offset+ShiftY))
WizardDlg.WiaPreviewControl1.ReleaseMouse()
如何发送按键信息
Pywinauto使用SendKeys来进行按键处理,可以参考:
http://www.rutherfurd.net/python/sendkeys/
1. 发送快捷键
MainWin.TypeKeys("%F") #按Alt+F
Key | Meaning |
+ | SHIFT |
^ | CTRL |
% | ALT |
多个按键时可以使用间隔时间:
MainWin.TypeKeys("%IPS",pause=0.5) #在Word2003打开从扫描仪导入图片的窗口
注意,TypeKeys并不是安全地将按键发送到目标窗口,所以尽量减少使用或者
测试时减小其它操作干扰。
2. 使用SendMessage实现
如何操作菜单
如果窗口有指定菜单项,则可以很容易地使用它:
pwin.MenuSelect("File->Open")
有时菜单项是用来勾选,并不能直接响应事件,则可以使用如下方式:
sMenu=App[Title].MenuItem("File->Save")
sMenu.Click()
*上面的例子针对有些MenuItem并不会响应MenuSelect()方法。
*有些Application并不会将菜单项指定给主UI,如Word,这样就不能直接使用菜单方法,而是使用快捷键的方式。下图是Word主UI的展开:
附1.PyWinAuto中的主要类之静态图
附2.枚举窗口所有控件及菜单项
def ShowMenuItems(MenuItem,Tabs=""):
if None==MenuItem:
return
Tabs = Tabs+"/t"
for menu in MenuItem.Items():
if(2048!=menu.Type()):
print Tabs,menu.Text()," [ID:",menu.ID(),"]"
subMenu=menu.SubMenu()
if None != subMenu:
ShowMenuItems(subMenu,Tabs)
def ShowMenuAndControls(app):
for win in app.Windows_():
print "Dialog:",win.WindowText()
print "Position:",win.Rectangle()
ShowMenuItems(win.Menu());
if 0<len(win.Children()):
for control in win.Children():
print "Control ID:",control.ControlID()
print "/t Control Type:",control.FriendlyClassName()
print "/t TEXT:",control.WindowText()
print "/t RECT:",control.Rectangle()
if control.IsEnabled():
print "/t Status:Enabled"
else:
print "/t Status:Disabled"
if control.IsVisible():
print "/t Status:Visible"
else:
print "/t Status:Unvisible"