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、通过进程号连接
任务管理器 查看

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 timesend_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_keyschrome_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、刚开始学习,还有很多待补充的内容~ 记录下来防止遗忘,随时可翻看~ (若有错误,欢迎交流指正)

pywinauto的初级入门相关推荐

  1. Jeecg 初级入门

    Jeecg 初级入门 1.部署jeecg 1.1.下载jeecg 请在jeecg 发布地址下载jeecg工程 1.2 导入myeclipse8.5 按照如下视图选择jeecg项目存放路径然后导入项目工 ...

  2. 【技术培训】招收Jeecg门徒 ---javaweb初级入门班

    招收Jeecg门徒[javaweb初级入门班] 最近准备带徒弟,带些人才出来,我带徒弟的理念是实践为王,在实践中掌握原理,积累经验. 我带徒弟的方向是JAVA WEB,掌握各种主流框架.(后期会开展j ...

  3. mui初级入门教程(六)— 模板页面实现原理及多端适配指南

    文章来源:小青年原创 发布时间:2016-07-26 关键词:mui,webview,template,os,多端适配 转载需标注本文原始地址: http://zhaomenghuan.github. ...

  4. Linux初级入门(第一次作业)

    Linux初级入门 在本科期间学过一些Linux的简单命令,再次接触Linux不仅巩固了知识还学习到了很多新的东西. 什么是操作系统? 操作系统,英文名称Operating System,简称OS,是 ...

  5. 【吴刚】电商网站详情页设计初级入门标准视频教程-吴刚-专题视频课程

    [吴刚]电商网站详情页设计初级入门标准视频教程-325人已学习 课程介绍         本套教程在学员有PS软件基础及对网页元素制作有了解的基础上,循序渐进,深入浅出,全篇干货,系统化的讲解电商网站 ...

  6. uni-app项目开发-----初级入门教程(从0到1制作打包自己的app)

    uni-app项目开发-----初级入门教程(从0到1制作打包自己的app) uni-app实现了一套代码,同时运行到多个平台.支持iOS模拟器.Android模拟器.H5.微信开发者工具.支付宝小程 ...

  7. Elasticsearch 使用初级入门 【入门篇】

    Elasticsearch 使用初级入门 整理中.... 1.下载 下载网址:https://www.elastic.co/cn/downloads/elasticsearch 2.安装 因为安全问题 ...

  8. 视频教程-【吴刚】电商活动站设计初级入门标准视频教程-UI

    [吴刚]电商活动站设计初级入门标准视频教程 业内知名UID.UED.用户体验.品牌策略与创意设计师,十三年行业职业教育培训经验,业内"UI视频第一人",教学总监.视觉设计讲师. A ...

  9. 【吴刚】电商活动站设计初级入门标准视频教程-吴刚-专题视频课程

    [吴刚]电商活动站设计初级入门标准视频教程-144人已学习 课程介绍         本套教程在学员有PS软件基础及对网页元素制作有了解的基础上,循序渐进,深入浅出,全篇干货,系统化的讲解电商活动站建 ...

最新文章

  1. 士兵杀敌(二)(线段树+树状数组)
  2. 线程的常用方法——currentThread方法||在main方法中直接调用run()方法,没有开启新的线程,以在run方法中的当前线程就是main线程||启动子线程,子线程会调用run方法
  3. pytorch 笔记: torch.nn.Embedding
  4. PMCAFF | 从200块到300万,史上最全自媒体报价单
  5. MongoDB工具介绍
  6. google浏览器调试
  7. Python中的具名元组类用法
  8. string字符串在java_java-String字符串的常用使用方法
  9. 【重点】LeetCode 146. LRU Cache
  10. 游戏筑基开发之字符串的注意点(C语言)
  11. Loadrunner请求自定义的http(json)文件and参数化
  12. JNDI:对java:comp/env的研究
  13. scrapy之spiders
  14. linux系统软路由软件,使用Linux+Zebra构建软路由系统
  15. 超带感的AR大屏互动,多元化应用场景!
  16. 关于SysinternalsSuite全部工具详解
  17. python抢购茅台抢购描述
  18. 展讯平台关机闹钟自动开机不响铃问题及提前开机时间设置
  19. 社招进京东真的很难吗?小伙毕业2年有幸获得京东内推,3面技术官直接拿下offer!
  20. CP/M:被遗忘的精灵

热门文章

  1. 关于JVM(基本常识)
  2. 【最优化】拉格朗日乘子法
  3. HTML5之Canvas
  4. Mybatis是什么?
  5. 前端面试心经一.题目
  6. 庄懂的技术美术入门课(美术向) Lesson1
  7. 创新实训项目分析——第十三篇
  8. pyaudio简介及安装
  9. RadioButton设置圆圈的大小样式
  10. Win7 Paimei 安装