pip install pywinauto
(1)我们安装好Pywinauto之后,首先要确定哪种可访问性技术(backend)可以用于我们的应用程序,在windows上受支持的有两种:
可以使用pywinauto进行连接,使用backend=”uia”进行连接,例如:
from pywinauto.application import Application
# 方式:连接已有进程
app = Application(backend='uia').connect(process=pid)
# pid 参数由 下面的get_pid()函数获取
(2)使用inspect.exe对所获取的窗口进行查看
,该exe请自行寻找获取,如果没有,请联系我。
查看我自己编的的一个QT小程序,以后就自动化操作该程序
如下图所示。controltype显示的说明backend为uia
程序里面的任意一个部位其实都是控件,在inspect的控件树中都可以找到,是一层一层分级别的,可以一个个点开所有控件,后续会把控件信息进行打印,供大家查看和分析。
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程序有更深入的了解,欢迎询问