pywinauto使用指南

发布时间 2023-06-17 17:56:58作者: 夜深人静的时候coding

@

安装

pip install pywinauto

使用须知

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

https://www.cnblogs.com/wuxunyan/p/9366178.html

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_LWIN}cmd{VK_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"')

标题