基于pywinauto的自动化测试(一)

一、 pywinauto安装和使用

1.安装:

pip install pywinauto

2.backend选择和控件查看工具inspect

1)我们安装好Pywinauto之后,首先要确定哪种可访问性技术(backend)可以用于我们的应用程序,在windows上受支持的有两种:

  • Win32 API (backend= "win32") 默认的backend
  • MS UI Automation (backend="uia")

可以使用pywinauto进行连接,使用backend=”uia”进行连接,例如:

from pywinauto.application import Application

# 方式:连接已有进程

app = Application(backend='uia').connect(process=pid)


# pid 参数由 下面的get_pid()函数获取

(2)使用inspect.exe对所获取的窗口进行查看

 ,该exe请自行寻找获取,如果没有,请联系我。

查看我自己编的的一个QT小程序,以后就自动化操作该程序

基于pywinauto的自动化测试(一)_第1张图片

如下图所示。controltype显示的说明backenduia

 程序里面的任意一个部位其实都是控件,在inspect的控件树中都可以找到,是一层一层分级别的,可以一个个点开所有控件,后续会把控件信息进行打印,供大家查看和分析。

基于pywinauto的自动化测试(一)_第2张图片

control_all = app.window(class_name="AppWidget")

# 打印控件信息
control_all.print_control_identifiers(depth=None, filename=None)

三、代码演示

完整代码如下:

from pywinauto.application import Application
import psutil

version = "xxx--测试平台"


def get_pid(name):
    """
     功能:根据进程名获取name的进程pid
    """
    pids = psutil.process_iter()
    print("[" + name + "]'s pid is:")
    for pid in pids:
        if(pid.name() == name):
            print(pid.pid)
            return pid.pid


pid = get_pid("python.exe")
print(pid)

# 方式一:连接已有进程
app = Application(backend='uia').connect(process=pid)
control_all = app.window(class_name="AppWidget")
control_all.print_control_identifiers(depth=None, filename=None)

最后的输出结果 

Dialog - 'python'    (L791, T144, R1511, B915)

['python', 'Dialog', 'pythonDialog']

child_window(title="python", auto_id="xxx--测试平台", control_type="Window")

   |

   | TitleBar - ''    (L-31965, T-31997, R-31774, B-31961)

   | ['TitleBar']

   |    |

   |    | Menu - '系统'    (L-31989, T-31989, R-31956, B-31956)

   |    | ['系统', 'Menu', '系统Menu', '系统0', '系统1']

   |    | child_window(title="系统", auto_id="MenuBar", control_type="MenuBar")

   |    |    |

   |    |    | MenuItem - '系统'    (L-31989, T-31989, R-31956, B-31956)

   |    |    | ['系统2', 'MenuItem', '系统MenuItem']

   |    |    | child_window(title="系统", control_type="MenuItem")

   |    |

   |    | Button - '还原'    (L-31985, T-31999, R-31914, B-31961)

   |    | ['Button', '还原', '还原Button', 'Button0', 'Button1']

   |    | child_window(title="还原", control_type="Button")

   |    |

   |    | Button - '最大化'    (L-31914, T-31999, R-31844, B-31961)

   |    | ['Button2', '最大化Button', '最大化']

   |    | child_window(title="最大化", control_type="Button")

   |    |

   |    | Button - '关闭'    (L-31844, T-31999, R-31773, B-31961)

   |    | ['关闭', 'Button3', '关闭Button']

   |    | child_window(title="关闭", control_type="Button")

   |

   | Static - '姓名:'    (L831, T174, R885, B190)

   | ['姓名:', 'Static', '姓名:Static', 'Static0', 'Static1']

   | child_window(title="姓名:", control_type="Text")

   |

   | Edit - ''    (L886, T174, R986, B194)

   | ['姓名:Edit', 'Edit', 'Edit0', 'Edit1']

   |

   | Static - '工号:'    (L1061, T174, R1115, B190)

   | ['Static2', '工号:', '工号:Static']

   | child_window(title="工号:", control_type="Text")

   |

   | Edit - ''    (L1116, T174, R1216, B194)

   | ['工号:Edit', 'Edit2']

   |

   | Static - '部门: '    (L1291, T174, R1345, B190)

   | ['部门: ', 'Static3', '部门: Static']

   | child_window(title="部门: ", control_type="Text")

   |

   | Edit - ''    (L1341, T174, R1441, B194)

   | ['部门: Edit', 'Edit3']

   |

   | Static - '外网IP:'    (L831, T214, R885, B230)

   | ['Static4', '外网IP:', '外网IP:Static']

   | child_window(title="外网IP:", control_type="Text")

   |

   | Edit - ''    (L886, T214, R986, B234)

   | ['外网IP:Edit', 'Edit4']

   |

   | Static - '用户名:'    (L1061, T214, R1115, B230)

   | ['用户名:', 'Static5', '用户名:Static']

   | child_window(title="用户名:", control_type="Text")

   |

   | Edit - ''    (L1116, T214, R1216, B234)

   | ['Edit5', '用户名:Edit']

   |

   | Static - '密码: '    (L1291, T214, R1345, B230)

   | ['Static6', '密码: ', '密码: Static']

   | child_window(title="密码: ", control_type="Text")

   |

   | Edit - ''    (L1341, T214, R1441, B234)

   | ['密码: Edit', 'Edit6']

   |

   | Button - '录入信息'    (L1341, T254, R1416, B277)

   | ['录入信息Button', 'Button4', '录入信息']

   | child_window(title="录入信息", control_type="Button")

   |

   | Table - ''    (L843, T394, R1459, B694)

   | ['Table', '按类型查找Table']

   |    |

   |    | Pane - ''    (L0, T0, R0, B0)

   |    | ['Pane']

   |    |

   |    | Header - '号码'    (L844, T395, R884, B432)

   |    | ['Header', '号码', '号码Header', 'Header0', 'Header1']

   |    | child_window(title="号码", control_type="Header")

   |    |

   |    | Header - '姓名'    (L884, T395, R944, B432)

   |    | ['Header2', '姓名Header', '姓名', '姓名0', '姓名1']

   |    | child_window(title="姓名", control_type="Header")

   |    |

   |    | Header - '工号'    (L944, T395, R1094, B432)

   |    | ['Header3', '工号', '工号Header', '工号0', '工号1']

   |    | child_window(title="工号", control_type="Header")

   |    |

   |    | Header - '部门'    (L1094, T395, R1244, B432)

   |    | ['Header4', '部门', '部门Header', '部门0', '部门1']

   |    | child_window(title="部门", control_type="Header")

   |    |

   |    | Header - '外网IP'    (L1244, T395, R1394, B432)

   |    | ['Header5', '外网IP', '外网IPHeader']

   |    | child_window(title="外网IP", control_type="Header")

   |    |

   |    | Header - '用户名'    (L1394, T395, R1544, B432)

   |    | ['Header6', '用户名', '用户名Header']

   |    | child_window(title="用户名", control_type="Header")

   |    |

   |    | Header - '密码'    (L1544, T395, R1694, B432)

   |    | ['Header7', '密码', '密码Header']

   |    | child_window(title="密码", control_type="Header")

   |

   | Static - '按类型查找'    (L831, T257, R922, B273)

   | ['Static7', '按类型查找', '按类型查找Static']

   | child_window(title="按类型查找", control_type="Text")

   |

   | ComboBox - ''    (L921, T254, R1032, B276)

   | ['ComboBox外网', '按类型查找ComboBox', 'ComboBox', 'ComboBox工号', 'ComboBox部门']

   |    |

   |    | ListBox - ''    (L0, T0, R0, B0)

   |    | ['ListBox']

   |    |    |

   |    |    | ListItem - '姓名'    (L0, T0, R640, B18)

   |    |    | ['ListItem', '姓名2', '姓名ListItem', 'ListItem0', 'ListItem1']

   |    |    | child_window(title="姓名", control_type="ListItem")

   |    |    |

   |    |    | ListItem - '工号'    (L0, T18, R640, B36)

   |    |    | ['ListItem2', '工号2', '工号ListItem']

   |    |    | child_window(title="工号", control_type="ListItem")

   |    |    |

   |    |    | ListItem - '部门'    (L0, T36, R640, B54)

   |    |    | ['ListItem3', '部门2', '部门ListItem']

   |    |    | child_window(title="部门", control_type="ListItem")

   |    |    |

   |    |    | ListItem - '外网'    (L0, T54, R640, B72)

   |    |    | ['ListItem4', '外网ListItem', '外网']

   |    |    | child_window(title="外网", control_type="ListItem")

   |

   | Edit - ''    (L831, T297, R941, B317)

   | ['按类型查找Edit', 'Edit7']

   |

   | Button - '查找'    (L956, T294, R1031, B317)

   | ['查找', 'Button5', '查找Button']

   | child_window(title="查找", control_type="Button")

   |

   | Button - '查找全部'    (L1116, T294, R1191, B317)

   | ['查找全部', '查找全部Button', 'Button6']

   | child_window(title="查找全部", control_type="Button")

该代码首先能获取到CS结构的控件信息,才能使用pywinauto进行控制,今天首先分享到这里,后后续在继续分享如何去操作 

*************************************************************************************************************

互联网行情不是特别好,测试工程师更是面临着巨大的职场危机,希望大家能不限于对业务的熟悉,多方面学习及掌握一些技能。

若自动化测试技术或QT程序有更深入的了解,欢迎询问

你可能感兴趣的:(qt,windows,python)