pywinauto的学习记录

  • 安装
  • 使用须知
  • 确定app的可访问技术
  • 启动应用程序
  • 辅助工具
  • 详细使用
  • 开启app
  • 连接已经打开的应用程序
  • 选择程序窗口
  • 窗口控件分类
  • 窗口控件基本属性获取方法
  • 获取控件的文本内容
  • 对窗口/控件的截图处理
  • 菜单的相关操作
  • 菜单控件
  • 菜单项控件
  • 等待机制
  • wait 系列
  • timings系列
  • 编辑类控件
  • 模拟用户键盘的操作
  • 键盘修饰符的使用
  • 鼠标用户操作
  • 访问系统通知区域
  • 结合selenium实现文件上传


第一次尝试这种方法记录自己学过的一些东西,后续会将一些重要的知识点慢慢记录进来,hello,my blog~

安装

pip installer 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、通过进程号连接

任务管理器 查看

python pywinauto 获取button上的文字 pywinauto获取控件文本_菜单项


PID即为进程号 :5460

app = Application(backend='uia').connect(process="XXX")

2、通过窗口句柄连接

app = Application(backend='uia').connect(handle="XXX")

或者通过inspect查看

python pywinauto 获取button上的文字 pywinauto获取控件文本_菜单项_02


ProcessID and NativeWindowHandle

选择程序窗口

1、根据窗口标题/类名选择

推荐使用

python pywinauto 获取button上的文字 pywinauto获取控件文本_ide_03

window = app["QQ"] # window = app["TXGuiFoundation"] 
window.print_control_identifiers()

2、根据窗口类名选择

python pywinauto 获取button上的文字 pywinauto获取控件文本_控件_04

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

官方文档

python pywinauto 获取button上的文字 pywinauto获取控件文本_控件_05

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系列

python pywinauto 获取button上的文字 pywinauto获取控件文本_ide_06

wait_until(10.5, .5, self.item_count, 10)#等待item_count函数的结果为5的时候开始停止等待。。。若超过10s,则超时报错

timings模块
Timings.defaults():将全局计时设为默认值
Timings.slow():将所有时间加倍(使脚本的执行速度降低)
Timings.fast():将所有计时除以2

编辑类控件

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、访问隐藏的通知区

python pywinauto 获取button上的文字 pywinauto获取控件文本_window_07

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

python pywinauto 获取button上的文字 pywinauto获取控件文本_ide_08

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"')

写在最后:
1、感谢b站某老师的视频讲解,内容很详细
2、刚开始学习,还有很多待补充的内容~ 记录下来防止遗忘,随时可翻看~ (若有错误,欢迎交流指正)