流程分析

一、实例化、打开程序/连接程序

二、窗口指定、菜单/弹窗指定

三、控件指定、按钮指定

四、其他指定

五、鼠标/键盘等点击/输入操作

代码内容

# -*- coding: utf-8 -*-

'''
深入:

一、菜单选项

二、弹出菜单选项点击


继续持续深入pywin32比较好

'''



import pywinauto
from pywinauto.application import Application


# =============================================================================
# #自建函数  显示所有菜单及子菜单
# =============================================================================
def showMenus(dlg):
    for x in dlg.menu_items():                   #显示当前窗口菜单项
        print(x['text'])
        for y in x['menu_items']['menu_items']:  #从菜单项里遍历紫菜单项
            print('    '+ y['text'])


# =============================================================================
# #示例:启动无标题记事本
# =============================================================================
#app=Application()
#app.start('Notepad.exe')
#app.Notepad.draw_outline(colour='red')                    #当前dlg周围划线,单独输出可直观显示
#app.Notepad.print_control_identifiers(depth=100,filename='a.txt')     #当前dlg中所有控件输出:类名、标题名、位置等  
#app.Notepad.type_keys('SKJAKJFSDF')
#
#dlg=app['无标题 - 记事本']
#showMenus(dlg)      #自建函数输出窗口所有菜单及子菜单
#
#dlg.WindowText()    #返回对话框的标题文本
#
#
#app['无标题 - 记事本'].menu_select('编辑->替换(&R)...')    #当前dlg菜单检索
##app['替换'].print_control_identifiers()                  #当前dlg所有控件输出
#app['替换']['取消'].click()                               #app[dlg][ctl].click()  dlg和ctl都可以通过类、标题、句柄、等来绑定
#
#app['无标题 - 记事本'].Edit.type_keys('东风吹,战鼓擂',with_spaces=True)    #如果没有with_spaces 参数,则不会输入空格。请参阅SendKeys的文档,了解此方法,因为它是SendKeys的一个薄包装器。
#
#app['无标题 - 记事本'].menu_select('文件->退出')           #菜单检索
#app['记事本']['不保存'].close_click()                     #使用close_click()而不是click()更安全,因为close_click()会等待一段时间以给窗口时间关闭对话框。
  




# =============================================================================
# #示例:启动Tdxw2软件客户端
# =============================================================================
app=Application(backend='win32')
app.connect(path='D:\\02通达信金融终端软件客户端v7.46\\TdxW.exe')

dlg=app.window(title_re='通达信金融终端V7.46',class_name='TdxW_MainFrame_Class')
dlg.print_control_identifiers(filename='输出控件文件夹\\dlg_T.txt')
dlg.draw_outline()                                #周围划线,单独输出可直观显示

dlg_CD=dlg['#32770']
dlg_CD.print_control_identifiers(filename='输出控件文件夹\\dlg_CD.txt')
dlg_CD.draw_outline(colour='red')










#下面开始官方文档内容:
# =============================================================================
# #新开程序 或 链接已在运行程序
# =============================================================================

#新开程序
#appT2=Application().start('D:\\02通达信金融终端软件客户端v7.46\\TdxW.exe')


#链接已在运行程序
#参数path=''
#参数press=
#参数handle=
#参数组合 title_re='',class_name=''

#appT2=Application().connect(path='D:\\02通达信金融终端软件客户端v7.46\\TdxW.exe')


# =============================================================================
# #指定对话框    
# =============================================================================

#符号点. 等同于 列表[]
#dig=app.top_window()    #返回程序顶端窗口
#dig=app.window(title_re='.*记事本.*',class_name='')
#print(app.windows())    #返回所有对话框


# =============================================================================
# #指定控件
# =============================================================================

#app.dlg.control
#app['dlg']['control']

#当前会话中所有控件输出
#可选参数depth=          指定输出深度
#可选参数filename=''     指定输出目录
#app[dlg].print_control_identifiers(depth=,filename='')



# =============================================================================
# #隐式等待
# =============================================================================
#wait方法

#dlg.wait(“exists ready”, timeout = 5, retry_interval = 3)
#dlg.wait(wait_for, timeout = None, retry_interval = None)
#参数wait_for可传入五种参数, 可以组合传参,但要以空格隔开:
#exists: 窗口变成有效的句柄
#visible: 窗口可见,没有隐藏
#enabled: 窗口没有disable
#ready: visible + enable
#active: active
#参数timeout:设置超时时间,若在n秒内没有等到窗口在wait_for中传入的几种状态,则会抛出TimeoutError。
#参数retry_interval:超时后,间隔n秒再次重试。

#wait_not方法

#dlg.wait_not(wait_for_not,timeout = None,retry_interval = None)
#等待窗口不处于某种状态时。参数与wait传参一致。



# =============================================================================
# #通用操作
# =============================================================================

#dlg.popup_window()              #如果现实,则返回弹出窗口,如果没有弹出窗口则返回self


#dlg.WindowText()                #返回对话框的标题文本
#print(dlg.menu())               #返回对话框的菜单
#dlg.menu_items()                #返回对话框的所有菜单项及紫菜单项


#dlg.hide_from_taskbar()         #从Windows任务栏隐藏对话框
#dlg.is_in_taskbar()             #是否显示在Windows任务栏中
#dlg.show_in_taskbar()           #在Windows任务栏中显示该对话框


#dlg.get_show_state()            #获取显示状态 1恢复状态/2最小化/3最大化
#dlg.is_maximized()              #是否最大化
#dlg.is_minimized()              #是否最小化
#dlg.is_normal()                 #是否正常(没有最小化也没有最大化)
#
#dlg.maximize()                  #最大化
#dlg.minimize()                  #最小化
#dlg.restore()                   #窗口恢复之前状态
#
##dlg.menu()                     #返回控件的菜单
##dlg.menu_item(path='')         #返回参数path指定的菜单项
##dlg.menu_items()               #返回对话框的菜单项,如果没有菜单项则返回空列表
##dlg.menu_select()              #查找路径指定的菜单项 参数 ——>
#
#dlg.move_mouse(coords=(0,0))    #移动鼠标
#dlg.move_window(x=500,y=500)    #移动窗口到位置
#dlg.minimize()
#
#dlg.popup_window()               #如果现实,则返回弹出窗口,如果没有弹出窗口则返回self
#


#dlg.force_close()                #强制关闭对话框并返回结果
#dlg.close()                      #关闭对话框
#dlg.close_alt_f4()               #按alt+F4关闭窗口
#dlg.close_click()                #执行应该使窗口消失的单击操作,与click()的唯一区别是点击操作之前和之后有额外的延迟。



# =============================================================================
# #系统托盘
# =============================================================================
#
#from pywinauto.application import Application
#
#appS=Application().connect(path='explorer')
#systray_icons= appS.ShellTrayWnd
#systray_icons.draw_outline()
#systray_icons.print_control_identifiers(filename='systray.txt')
#
#
##systray_icons['Start'].draw_outline(colour='blue')             #开始
#
#systray_icons['MSTaskSwWClass'].draw_outline(colour='blue')    #正在运行程序
#systray_icons['TrayNotifyWnd '].draw_outline(colour='red')      #任务栏右下角区域
#systray_icons['StartButton'].draw_outline(colour='blue')       #右下角上拉键
#systray_icons['TrayClockWClass'].draw_outline(colour='red')    #时钟





# =============================================================================
# #鼠标控制
# =============================================================================

#pywinauto.mouse.click(button='left',coords=(0,0))    #单击指定坐标
#pywinauto.mouse.double_click(button='left',coords=(0,0))    #双击指定坐标
#pywinauto.mouse.move(coords=(0,0))    #鼠标移动到指定坐标
#
#pywinauto.mouse.press(button='left',coords=(0,0))    #指定位置按下鼠标左键
#pywinauto.mouse.release(button='left',coords=(100,200))  #指定位置释放鼠标左键
#
#pywinauto.mouse.right_click(coords=(0,0))    #右键点击指定位置
#
#pywinauto.mouse.scroll(coords=(500,500),wheel_dist=-100)    #中键滚动到指定坐标
#pywinauto.mouse.wheel_click(coords=(0, 0))    #中键单击指定坐标




# =============================================================================
# #鼠标点击
# =============================================================================
#click()                    #点击Button控件
#check_by_click()           #通过click()方法勾选checkbox
#uncheck_by_click()         #通过click()方法取消勾选checkbox
#get_check_state()          #返回checkbox的勾选状态(0没勾选,1勾选,2不定)
#is_checked                 #(勾选返回true,为勾选返回false,不定返回None)
#check()                    #勾选checkbox
#uncheck()                  #不勾选checkbox
#invoke()                   #点击(uia mode)
#toggle()                   #勾选checkbox(uia mode)





# =============================================================================
# #键盘操作
# =============================================================================
#type_keys('')

'''
SHIFT                            +      
CTRL                             ^      
ALT                               %
空格键                            {SPACE}
 
BACKSPACE                        {BACKSPACE}、{BS}   or   {BKSP}      
BREAK                            {BREAK}      
CAPS   LOCK                      {CAPSLOCK}      
DEL   or   DELETE                {DELETE}   or   {DEL}      
DOWN   ARROW                     {DOWN}      
END                              {END}      
ENTER                            {ENTER}   or   ~      
ESC                              {ESC}      
HELP                             {HELP}      
HOME                             {HOME}      
INS   or   INSERT                {INSERT}   or   {INS}      
LEFT   ARROW                     {LEFT}      
NUM   LOCK                       {NUMLOCK}      
PAGE   DOWN                      {PGDN}      
PAGE   UP                        {PGUP}      
PRINT   SCREEN                   {PRTSC}      
RIGHT   ARROW                    {RIGHT}      
SCROLL   LOCK                    {SCROLLLOCK}      
TAB                              {TAB}      
UP   ARROW                       {UP}     
+                                {ADD}      
-                                {SUBTRACT}      
*                                {MULTIPLY}      
/                                {DIVIDE}
F1                               {F1} 
F2                               {F2} 
F3                               {F3} 
.....
F15                              {F15} 
F16                              {F16} 
'''