您的位置:首页 > 编程语言 > Python开发

python自动化工具之pywinauto(二)

2017-10-07 16:24 1541 查看

python自动化工具之pywinauto(二)

python自动化工具之pywinauto二
pywinauto的使用各控件的操作
如何匹配控件

如何操作控件

pywinauto的使用——各控件的操作

对于常见的窗口程序,需要点点填填的控件有输入框(Edit)、按钮(Button)、复选框(CheckBox)、单选框(RadioButton)、下拉列表(ComboBox).

关于各个控件的函数方法,可以查阅官网 Methods available to each different control type

下面结合程序讲一下各个控件的用法。




要进行文件格式转换,一般需要三步:

1. 选择源文件

2. 转换参数配置

3. 选择输出文件位置

在这里,就是现在文件名后面的编辑框中填入源文件的位置,然后勾选自动扩帧复选框,然后点击转换按钮,最后会弹出一个另存为的文件对话框来选择目标文件位置。

目的明确了,接下来就是如何干的问题了。分两步:

1. 找到控件

2. 操作控件

如何让程序找到控件呢?

如何匹配控件

最简单的方法就是通过空间特征进行匹配。窗体也可以看成是一个大控件。匹配窗口的方法除了前面提到的window()方法,还可以通过中括号加窗口名。如:

dlg_spec = app.window(title=r'EXE/EXE 转 MP4')   # 1
dlg_spec = app[r'EXE/EXE 转 MP4']    # 2


除了title,还可以使用class或者title+class或者相近的text和类来匹配控件。

另外一种方法就是我们知道了这个程序的层次结构,然后类似寻到DOM元素一样一层一层的匹配。

那么如何找到这个层次结构呢。pywinauto提供了print_control_identifiers()函数来显示该窗体下所有控件的结构。

dlg_spec = app[r'EXE/EXE 转 MP4']
dlg_spec.print_control_identifiers()


输出如下:

Control Identifiers:

TEXE2FLVForm - 'EXE/EXE 转 MP4'    (L202, T55, R496, B562)
['EXE/EXE 转 MP4TEXE2FLVForm', 'TEXE2FLVForm', 'EXE/EXE 转 MP4']
child_window(title="EXE/EXE 转 MP4", class_name="TEXE2FLVForm")
|
| TTrackBar - ''    (L273, T189, R470, B204)
| ['TTrackBar', '下载安装相关视频编码器TTrackBar']
| child_window(class_name="TTrackBar")
|
| TGroupBox - '图像缩小输出时处理方法'    (L212, T460, R483, B522)
| ['图像缩小输出时处理方法', 'TGroupBox', '图像缩小输出时处理方法TGroupBox', 'TGroupBox0', 'TGroupBox1']
| child_window(title="图像缩小输出时处理方法", class_name="TGroupBox")
|    |
|    | RadioButton - '部分画面鼠标自动跟随(动态显示光标附近图像)'    (L232, T501, R470, B515)
|    | ['RadioButton', '部分画面鼠标自动跟随(动态显示光标附近图像)RadioButton', 'RadioButton1', '部分画面鼠标自动跟随(动态显示光标附近图像)', 'RadioButton0']
|    | child_window(title="部分画面鼠标自动跟随(动态显示光标附近图像)", class_name="TRadioButton")
|    |
|    | RadioButton - '全画面缩放(文字可能会变不清晰)'    (L232, T480, R409, B495)
|    | ['全画面缩放(文字可能会变不清晰)', 'RadioButton2', '全画面缩放(文字可能会变不清晰)RadioButton']
|    | child_window(title="全画面缩放(文字可能会变不清晰)", class_name="TRadioButton")
|
| RadioButton - '部分画面鼠标自动跟随(动态显示光标附近图像)'    (L232, T501, R470, B515)
| ['RadioButton', '部分画面鼠标自动跟随(动态显示光标附近图像)RadioButton', 'RadioButton1', '部分画面鼠标自动跟随(动态显示光标附近图像)', 'RadioButton0']
| child_window(title="部分画面鼠标自动跟随(动态显示光标附近图像)", class_name="TRadioButton")
|
| RadioButton - '全画面缩放(文字可能会变不清晰)'    (L232, T480, R409, B495)
| ['全画面缩放(文字可能会变不清晰)', 'RadioButton2', '全画面缩放(文字可能会变不清晰)RadioButton']
| child_window(title="全画面缩放(文字可能会变不清晰)", class_name="TRadioButton")
|
| Edit - '扩帧的作用是让鼠标移动更加平滑,文件也会变大一些\r\n如要扩帧建议扩帧后不要超过15帧/秒\r\n'    (L225, T298, R477, B319)
| ['自动扩帧Edit0', '自动扩帧Edit', '自动扩帧Edit1', 'Edit', 'Edit1', 'Edit0']
| child_window(title="扩帧的作用是让鼠标移动更加平滑,文件也会变大一些\r\n如要扩帧建议扩帧后不要超过15帧/秒\r\n", class_name="TMemo")
|
| Edit - '除非对FLV的编码器非常熟悉,完全知道自己想要什\r\n么,否则请不要修改默认的编码器设置\r\n'    (L214, T115, R483, B143)
| ['Edit2', '浏览Edit']
| child_window(title="除非对FLV的编码器非常熟悉,完全知道自己想要什\r\n么,否则请不要修改默认的编码器设置\r\n", class_name="TMemo")
|
| Button - '转换(&Z)'    (L300, T529, R362, B551)
| ['Button', '转换(&Z)', 'Button0', 'Button1', '转换(&Z)Button']
| child_window(title="转换(&Z)", class_name="TButton")
|
| Button - '关闭(&C)'    (L370, T529, R432, B551)
| ['关闭(&C)', '关闭(&C)Button', 'Button2']
| child_window(title="关闭(&C)", class_name="TButton")
|
| Button - '浏览'    (L434, T88, R483, B106)
| ['Button3', '浏览', '浏览Button']
| child_window(title="浏览", class_name="TButton")
|
| Edit - ''    (L259, T88, R429, B107)
| ['EXE/EXE 转 MP4Edit', 'Edit3']
| child_window(class_name="TEdit")
|
| Edit - '5'    (L286, T273, R307, B292)
| ['自动扩帧Edit2', 'Edit4']
| child_window(title="5", class_name="TEdit")
|
| CheckBox - '自动扩帧'    (L219, T277, R280, B292)
| ['CheckBox1', '自动扩帧', '自动扩帧CheckBox', 'CheckBox', 'CheckBox0']
| child_window(title="自动扩帧", class_name="TCheckBox")
|
| Button - '下载安装相关视频编码器'    (L273, T166, R409, B184)
| ['下载安装相关视频编码器Button', '下载安装相关视频编码器', 'Button4']
| child_window(title="下载安装相关视频编码器", class_name="TButton")
|
| ComboBox - 'AAC(推荐)'    (L273, T221, R409, B240)
| ['ComboBox1', 'ComboBox0', '下载安装相关视频编码器ComboBox', 'ComboBox']
| child_window(title="AAC(推荐)", class_name="TComboBox")
|
| ComboBox - 'H264(AVC X264) 推荐'    (L273, T146, R409, B165)
| ['ComboBox2', 'EXE/EXE 转 MP4ComboBox']
| child_window(title="H264(AVC X264) 推荐", class_name="TComboBox")
|
| TGroupBox - '输出图像尺寸'    (L212, T331, R483, B454)
| ['输出图像尺寸TGroupBox', 'TGroupBox2', '输出图像尺寸']
| child_window(title="输出图像尺寸", class_name="TGroupBox")
|    |
|    | CheckBox - '输出时画面保持原长宽比例'    (L286, T433, R436, B447)
|    | ['CheckBox2', '输出时画面保持原长宽比例CheckBox', '输出时画面保持原长宽比例']
|    | child_window(title="输出时画面保持原长宽比例", class_name="TCheckBox")
|    |
|    | ComboBox - ''    (L314, T410, R457, B429)
|    | ['设置为 宽度:ComboBox', 'ComboBox3']
|    | child_window(class_name="TComboBox")
|    |
|    | ComboBox - '1/2'    (L314, T369, R396, B388)
|    | ['ComboBox4', '按倍数缩小为ComboBox']
|    | child_window(title="1/2", class_name="TComboBox")
|    |
|    | Edit - '300'    (L402, T388, R429, B407)
|    | ['设置为 宽度:Edit0', '设置为 宽度:Edit', 'Edit5', '设置为 宽度:Edit1']
|    | child_window(title="300", class_name="TEdit")
|    |
|    | Edit - '400'    (L314, T388, R341, B407)
|    | ['设置为 宽度:Edit2', 'Edit6']
|    | child_window(title="400", class_name="TEdit")
|    |
|    | RadioButton - '设置为 宽度:'    (L232, T392, R308, B406)
|    | ['设置为 宽度:', '设置为 宽度:RadioButton', 'RadioButton3']
|    | child_window(title="设置为 宽度:", class_name="TRadioButton")
|    |
|    | RadioButton - '按倍数缩小为'    (L232, T372, R314, B386)
|    | ['RadioButton4', '按倍数缩小为RadioButton', '按倍数缩小为']
|    | child_window(title="按倍数缩小为", class_name="TRadioButton")
|    |
|    | RadioButton - '原始大小'    (L232, T351, R287, B366)
|    | ['原始大小', '原始大小RadioButton', 'RadioButton5']
|    | child_window(title="原始大小", class_name="TRadioButton")
|
| CheckBox - '输出时画面保持原长宽比例'    (L286, T433, R436, B447)
| ['CheckBox2', '输出时画面保持原长宽比例CheckBox', '输出时画面保持原长宽比例']
| child_window(title="输出时画面保持原长宽比例", class_name="TCheckBox")
|
| ComboBox - ''    (L314, T410, R457, B429)
| ['设置为 宽度:ComboBox', 'ComboBox3']
| child_window(class_name="TComboBox")
|
| ComboBox - '1/2'    (L314, T369, R396, B388)
| ['ComboBox4', '按倍数缩小为ComboBox']
| child_window(title="1/2", class_name="TComboBox")
|
| Edit - '300'    (L402, T388, R429, B407)
| ['设置为 宽度:Edit0', '设置为 宽度:Edit', 'Edit5', '设置为 宽度:Edit1']
| child_window(title="300", class_name="TEdit")
|
| Edit - '400'    (L314, T388, R341, B407)
| ['设置为 宽度:Edit2', 'Edit6']
| child_window(title="400", class_name="TEdit")
|
| RadioButton - '设置为 宽度:'    (L232, T392, R308, B406)
| ['设置为 宽度:', '设置为 宽度:RadioButton', 'RadioButton3']
| child_window(title="设置为 宽度:", class_name="TRadioButton")
|
| RadioButton - '按倍数缩小为'    (L232, T372, R314, B386)
| ['RadioButton4', '按倍数缩小为RadioButton', '按倍数缩小为']
| child_window(title="按倍数缩小为", class_name="TRadioButton")
|
| RadioButton - '原始大小'    (L232, T351, R287, B366)
| ['原始大小', '原始大小RadioButton', 'RadioButton5']
| child_window(title="原始大小", class_name="TRadioButton")


仔细找了一下,文件名后面的编辑框的属性为

| Edit - ''    (L259, T88, R429, B107)
| ['EXE/EXE 转 MP4Edit', 'Edit3']


所以我们可以通过控件的text或者title来查找控件。如:

edit = dlg_spec['']   # 1
edit = dlg_spec['Edit2']    # 2
edit = dlg_spec.Edit2   # 3


注意,对于输入控件Edit,一般不建议使用text内容绑定,因为Edit的text内容会发生变化。另外,绑定的控件也可能不唯一。对于title,我这里可能理解不够,属性显示的是Edit3,但实际上绑定的时候用的却是Edit2,也就是数字要减一

如何操作控件

前面已经讲了如何找到一个控件,接下来就是怎么操作它了。对于Edit控件,要么就是向里面写内容,要么就是读里面的内容。

在这里,我们需要向Edit3写入要转换文件的路径(r’E:\test test .exe’),这里的文件名我特意在中间加了空格。

edit.set_text(r'E:\test test .exe')     # 1
edit.type_keys(r'E:\test test .exe',with_spaces = True) # 2


上述代码第一种方法是直接设置edit的text,而第二种是在里面模拟键盘输入(如果字符串中没有空格,可以省略后面的参数),殊途同归。




但是实际上,使用第二种方法输入并没有什么效果,因为该编辑框设置了禁止输入(自己手动敲键盘,发现编辑框没有反应)。(这里埋了一个雷,在我们成功将路径写入编辑框的那刻,已经踩着了这颗雷。)

接着配置转换参数。




现在是10帧/秒,建议扩帧后不超过15帧/秒。所以也就没有必要扩帧了。

接着直接模拟点击转换吧。

dlg_spec.Button0.click()


不出所料,弹出“另存为”对话框。




假设我们按照默认的路径存储,那么这里只需要点击“保存”就可以了。

app['另存为']['保存'].click()


注意,所有窗口都应该在app中索引。

执行完上述语句后,发现弹出错误提示。




* 触着的雷终于爆炸了,哈哈!!!*

此路不通,欲知结果如何,接听下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息