Pywinauto Guideline

    技术2022-05-20  53

    安装

    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,Button0Button1都是代表第一个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,这样就不能直接使用菜单方法,而是使用快捷键的方式。下图是WordUI的展开:

    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"                  


    最新回复(0)