pywinauto使用指南
Posted 夜深人静的时候coding
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pywinauto使用指南相关的知识,希望对你有一定的参考价值。
@
安装
pip install pywinauto
使用须知
确定app的可访问技术
1、win32 API(backend=“win32”)
一般是MFC、VB6、VCL,简单的WinForms控件和大多数旧的应用程序
2、MS UI Automoation API(backend=“uia”)
一般是WinForms、WPF、Store app,Qt5,浏览器
启动应用程序
1、Applicant
作用范围:单个进程
2、desktop
作用范围:跨进程
辅助工具
spy++ / inspect.exe
详细使用
开启app
启动notepad
from pywinauto.application import Application
app = Application(backend=\'uia\').start("notepad.exe")
启动qq
from pywinauto.application import Application
app = Application(backend=\'uia\').start(r"D:\\\\Program Files\\\\Tencent\\\\QQ\\\\Bin\\\\QQScLauncher.exe")
或者
import pywinauto
app = pywinauto.Application(backend=\'uia\').start(r"D:\\\\Program Files\\\\Tencent\\\\QQ\\\\Bin\\\\QQScLauncher.exe")
连接已经打开的应用程序
1、通过进程号连接
任务管理器 查看
PID即为进程号 :5460
app = Application(backend=\'uia\').connect(process="XXX")
2、通过窗口句柄连接
app = Application(backend=\'uia\').connect(handle="XXX")
或者通过inspect查看
ProcessID and NativeWindowHandle
选择程序窗口
1、根据窗口标题/类名选择
推荐使用
window = app["QQ"] # window = app["TXGuiFoundation"]
window.print_control_identifiers()
2、根据窗口类名选择
window = app.TXGuiFoundation
window.print_control_identifiers()
获取当前窗口的坐标
print(app["QQ"].rectangle())
窗口控件分类
类别 | 名称 |
---|---|
状态栏 | StatusBar |
按钮 | Button |
单选框 | RadioButton |
组合框 | ComboBox |
复选框 | CheckBox |
组框 | GroupBox |
编辑栏 | Edit |
列表框 | ListBox |
弹出菜单 | PopupMenu |
工具栏 | Toolbar |
树状视图 | Tree View |
菜单栏 | MenuItem |
菜单 | Menu |
窗格 | Pane |
静态内容 | Static |
对话框(窗口) | Dialog |
头部内容 | Header |
列表显示控件 | ListView |
选项卡控件 | TabControl |
工具提示 | ToolTips |
窗口控件基本属性获取方法
1、获取控件类型:wrapper_object()
2、获取控件支持的方法:print(dir(a.wrapper_object()))
3、获取控件的子元素:children()
4、获取控件类名:class_name()
5、以字典的形式返回控件的属性:get_properties()
【以上全部可以用inspect直接查看获取】
获取控件的文本内容
file.texts()
对窗口/控件的截图处理
方法:capture_as_image()`
pic = app[title_notepad].capture_as_image()
print(pic)
pic.save(\'01.png\')
菜单的相关操作
菜单控件
1、通过下标选择菜单项
menu = window[\'menu\']
print(menu.items())#获取菜单的子菜单项
m = menu.item_by_index(1)
print(m)
2、通过路径选择菜单项
menu = window[\'menu\']
print(menu.items())#获取菜单的子菜单项
m = menu.item_by_path("文件->新建连接...")
print(m)
菜单项控件
m.click_input()#点击
等待机制
wait 系列
wait and wait_not
官方文档
window.wait(wait_for=\'ready\',timeout=10,retry_inteval=1)
wait_cpu_usage_lower()
等待该进程的cpu使用率低于某个阈值
参数:
threshold:该进程的cpu占用率低于某个阈值
timeout:超时时间
retry_inteval:重试时间间隔
app = pywinauto.Application(backend=\'uia\').connect(process=16972)
app.wait_cpu_usage_lower(threshold=5,timeout=10,retry_inteval=1)
timings系列
wait_until(10.5, .5, self.item_count, 10)#等待item_count函数的结果为5的时候开始停止等待。。。若超过10s,则超时报错
timings模块
Timings.defaults():将全局计时设为默认值
Timings.slow():将所有时间加倍(使脚本的执行速度降低)
Timings.fast():将所有计时除以2
编辑类控件
作者介绍得很清楚——实例notepad
import pywinauto
#1.运行记事本程序
app = pywinauto.Application().start(\'notepad.exe\')
#2.窗体选择
title_notepad = u\'无标题-记事本\'
print(app[title_notepad].print_control_identifiers())
#3.选择一个菜单项
app[title_notepad].menu_select(\'帮助->关于记事本\')
print(dir(app[title_notepad].wrapper_object()))
time.sleep(0.2)
#4.点击新弹出窗体的确定按钮
out_note = u\'关于记事本\'
button_name_ok = \'确定\'
app[out_note][button_name_ok].click()
#5.将当前窗口截图保存
pic = app[title_notepad].capture_as_image()
print(pic)
pic.save(\'01.png\')
#6.在记事本中输入一些文本
dlg = app[title_notepad]
dlg[\'Edit\'].type_keys("我是方法1\\n",with_spaces=True,with_newlines=True)
app.title_notepad.Edit.type_keys("我是方法2\\n",with_spaces=True,with_newlines=True)
app.title_notepad.Edit.type_keys(\'pywinauto works!\\n\',with_spaces=True,with_newlines=True)
app.title_notepad.Edit.type_keys(\'hello word !\\n\',with_spaces=True,with_newlines=True)
#7.替换操作
app[title_notepad].menu_select(\'编辑(&E) -> 替换(&R)..\')
app[\'替换\'].print_control_identifiers()
app[\'替换\'][\'Edit1\'].type_keys("word")
app[\'替换\'][\'Edit2\'].type_keys("baby")
app[\'替换\'].Button3.click() #全部替换
app[\'替换\'].Button4.click() #取消
#8.退出
app[title_notepad].menu_select(\'文件(&F) -> 退出(&X)\')#现在的top窗口为\'记事本\'
## app.top_window().print_control_identifiers()
app.top_window().Button2.click()
模拟用户键盘的操作
send_keys()
按键 | 对应参数 |
---|---|
F5 | send_keys(“VK_F5”)/send_keys(“F5”) |
普通字母 | send_keys(‘A’) |
回车键 | send_keys(“VK_RETURN”) |
esc键 | send_keys(“VK_ESCAPE”) |
tab键 | send_keys(“VK_TAB”) |
caps Lock | send_keys(“VK_CAPITAL”) |
shift | send_keys(“VK_SHIFT”) |
ctrl键 | send_keys(“VK_CONTROL”) |
Alt键 | send_keys(“VK_MENU”) |
空格键 | send_keys(“VK_SPACE”) |
退格键 | send_keys(“VK_BACK”) |
左win键 | send_keys(“VK_LWIN”) |
右win键 | send_keys(“VK_RWIN”) |
案例:通过案件打开CMD进入python
from pywinauto.keyboard import *
import time
send_keys("VK_LWIN")
time.sleep(0.1)
send_keys("cmd")
send_keys("VK_RETURN")
#以上三行可以写成一行命令:send_keys("VK_LWINcmdVK_RETURN")
time.sleep(1)
send_keys("python")
send_keys("VK_RETURN")
键盘修饰符的使用
修饰符 | 按键 |
---|---|
“+” | shift |
“^” | ctrl |
“%” | alt |
“^s” | ctrl+s |
from pywinauto.keyboard import *
send_keys("^a") #全选
鼠标用户操作
操作 | 方法 |
---|---|
单击 | click |
双击 | double_click |
右击 | right_click |
中间点击 | wheel_click |
按下鼠标 | press |
释放鼠标 | replace |
鼠标移动 | move |
滚动鼠标 | scroll |
from pywinauto import mouse
mouse.click(coords=(475,20))#默认单击左键,coords:像素
mouse.scroll(coords=(1919,257),wheel_dist=-3)#wheel_dist:为正向上滚动,为负向下滚动
访问系统通知区域
1、通过explorer
app = pywinauto.Application(backend=\'uia\').connect(path="explorer")
# app["任务栏"].print_control_identifiers()
# task = app["任务栏"]["用户提示通知区域"]
task = app["任务栏"].child_window(title="用户提示通知区域", auto_id="1504", control_type="ToolBar")
# task.print_control_identifiers()
task.child_window(title="扬声器: 静音", auto_id="7820AE73-23E3-4229-82C1-E41CB67D5B9C", control_type="Button").click()
#task.Button19.click() #通过button点击
2、访问隐藏的通知区
app = pywinauto.Application(backend=\'uia\').connect(path="explorer")
task = app["任务栏"].child_window(title="通知 V 形", auto_id="1502", control_type="Button")
task.click()
#隐藏窗口为桌面上的新的窗口
app["通知溢出"].print_control_identifiers()
wechat = app["通知溢出"].child_window(title="微信", auto_id="0A61FEA6-FC1E-4277-47CE-70846CAB39F7", control_type="Button")
wechat.click()
结合selenium实现文件上传
上传网址:https://www.layui.com/demo/upload.html
import time
from selenium import webdriver
import pywinauto
from pywinauto.keyboard import send_keys
chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument(\'--headless\') #无头浏览模式
browser = webdriver.Chrome(chrome_options=chrome_options)
url = \'https://www.layui.com/demo/upload.html\'
browser.get(url)
browser.find_element_by_xpath(\'//button[@id="test1"]\').click()
time.sleep(10)
app = pywinauto.Desktop()#显示桌面的所有app
# app["打开"].print_control_identifiers()
#选择文件地址输入的工具框
app["打开"].wait(\'ready\', 10, 1)
app["打开"][\'Toolbar3\'].click()
send_keys(\'C:\\\\Users\\\\ASUS\\\\Desktop\')
send_keys("VK_RETURN")
#输入单个文件
#选中文件名输入框
app["打开"]["文件名(&N):Edit"].type_keys(\'"01.jpg"\')
app["打开"]["打开(&O)"].click()
#输入多个文件(利用键盘)
send_keys(\'"02.jpg"\')
send_keys(\'"03.jpg"\')
标题
以上是关于pywinauto使用指南的主要内容,如果未能解决你的问题,请参考以下文章