python基于pywinauto实现PC端自动化
原文来自:https://www.cnblogs.com/xp1315458571/p/13892205.html
一、 pywinauto安装和启动
安装:
pip install pywinauto
启动(实例化程序):以微信示例
from pywinauto.application import Application # 常用方式一:连接已有微信进程(进程号在 任务管理器-详细信息 可以查看) app = Application(backend='uia').connect(process=8948) # 常用方式二:启动微信进程 (注意路径中特殊字符的转义,/和\,不注意有时会出错) app = Application(backend="uia").start(r'C:\Program Files (x86)\Tencent\WeChat\WeChat.exe')
结束:
# 结束进程 app.kill()
二、backend选择 和 控件查看工具inspect
1.backend选择和inspect介绍
我们安装好Pywinauto之后,首先要确定哪种可访问性技术(backend)可以用于我们的应用程序,在windows上受支持的有两种:
Win32 API (
backend= "win32"
) 默认的backendMS UI Automation (
backend="uia"
)
如果不能确定程序到底适用于那种backend,可以借助于GUI对象检查工具来做,常用的检查工具有Inspect.ex,Spy++ ,下载地址:https://github.com/blackrosezy/gui-inspect-tool
将inspect左上角的下拉列表中切换到“UI Automation”,然后鼠标点一下你需要测试的程序窗体,inspect就会显示相关信息,如下图所示。说明backend为uia
程序里面的任意一个部位其实都是控件,在inspect的控件树中都可以找到,是一层一层分级别的,可以一个个点开所有控件
2.打印元素
我们拿到控件后,是可以将该控件下的所有子控件及其属性以树形结构打印出来的:
# 拿到微信主窗口 win_main_Dialog = app.window(class_name='WeChatMainWndForPC')# 判断是否为dialog,一个微信是一个dialog,就是窗口 print(win_main_Dialog.is_dialog)# 给控件画个红色框便于看出是哪个 win_main_Dialog.draw_outline(colour = 'red')# 打印当前窗口的所有controller(控件和属性) win_main_Dialog. print_control_identifiers(depth=None, filename=None) # 源码内部函数名链式赋值了,都能用,一样的 # print_ctrl_ids = dump_tree = print_control_identifiers
depth:打印的深度,缺省时打印最大深度。
filename:将返回的标识存成文件(生成的文件与当前运行的脚本在同一个路径下)
eg:dlg. print_control_identifiers(filename =’a.txt’)
打印出来的文档树就是inspect中的控件树完全展开的样子,都是有层级的,和微信程序中的各个元素是一一对应的:
三、控件定位
3.1常规查找
# 直接找窗口 win_main_Dialog = app.window(class_name='WeChatMainWndForPC')# 主窗口下的某个窗口,不管层级的找 chat_list = win_main_Dialog.child_window(control_type='List', title='会话') first = chat_list.items()[0] # 第一个聊天项 列表支持items(),支持循环,支持索引 chat_list.scroll(direction='down', amount='page') # 向下滚动一页# 详情页修改备注操作 parent()和children()都是只往上或往下查找一个层级,所有满足的放进列表 details_page = win_main_Dialog.child_window(class_name='ContactProfileWnd') # 窗口下的某个窗口 we_id = details_page.child_window(title="微信号:", control_type="Text").parent().children()[1].window_text() # 窗口的爸爸的第二个儿子的文字 alia = details_page.child_window(title="微信号:", control_type="Text").parent().parent().children()[0].children()[0].window_text() edit_btn = details_page.child_window(title="备 注", control_type="Text").parent().children()[1] edit_btn.click_input() btn_modify_name_edit = edit_btn # 先ctrl+a选中所有然后再type_keys替换 btn_modify_name_edit.type_keys('^a').type_keys('备注名字', with_spaces=True)# descendants查找所有后代中满足的,不管层级,所有满足的放进列表 btn_return = win_main_Dialog.child_window(control_type='ToolBar').parent().descendants(control_type='Button') btn_return[0].click_input()
控件常见特征
3.2 快速定位
当你还在一层一层定位的时候,就纯的不行了,页面一定要打印出来,然后基于页面快速定位
快速定位 伪代码
四、控件自带的的方法
1. 点击和输入
# 左点击,可以点进源码,还有double_click_input,right_click_input等 edit_btn.click_input()# 先ctrl+a选中所有然后再type_keys替换,和我们选中然后修改一样的 edit_btn.type_keys('^a').type_keys('备注名字', with_spaces=True)
常用快捷键
2.对控件截图并保存
ctrl_qrcode = self.win_login.child_window(title='二维码', control_type='Image') if ctrl_qrcode.exists(): ctrl_qrcode.capture_as_image().save(img_path)
3.窗口的等待
窗口加载需要时间,我们又不能一直sleep就需要等待,等待窗口出现或者等待窗口关闭:
save_dialog.wait('ready',timeout=2) save_dialog.close() save_dialog.wait_not('visible')# 'exists':窗口是有效的句柄 # 'visible':窗口未隐藏,常用 # 'enabled':未禁用窗口 # 'ready':窗口可见并启用,常用 # 'active':窗口处于活动状态
4.窗口存在和关闭
self.chatwnd = wechat.app.window(class_name='ChatWnd') if self.chatwnd.exists():self.chatwnd.close()
5.其他
# 顶层窗口 dlg = app.top_window() # 点方法取值 print(dlg.class_name()) #'WeChatMainWndForPC' # 滚动 chat_list.scroll(direction='up', amount='page')
五、鼠标操作
导入:
from pywinauto import mouse
常见操作:
# 移动鼠标 mouse.move(coords=(x, y))# 指定位置,鼠标左击 mouse.click(button='left', coords=(40, 40))# 鼠标双击 mouse.double_click(button='left', coords=(140, 40))# 将属性移动到(140,40)坐标处按下 mouse.press(button='left', coords=(140, 40))# 将鼠标移动到(300,40)坐标处释放, mouse.release(button='left', coords=(300, 40))# 右键单击指定坐标 mouse.right_click(coords=(400, 400))# 鼠标中键单击指定坐标(很少用的到) mouse.wheel_click(coords=(400, 400))# 滚动鼠标 wheel_dist指定鼠标滚轮滑动,正数往上,负数往下。 mouse.scroll(coords=(1200,300),wheel_dist=-3)
示例:
# 以控件中心为起点,滚动 def mouse_scroll(control, distance):rect = control.rectangle()cx = int((rect.left+rect.right)/2)cy = int((rect.top + rect.bottom)/2)mouse.scroll(coords=(cx, cy), wheel_dist=distance) mouse_scroll(control=win_main_Dialog.child_window(control_type='List', title='联系人'), distance=-5)
六、键盘操作
和控件自己的type_keys方法效果一样,但是更快,那个是从前到后啪啪啪的输入,这个是一下就出来了那种
在发送文件和图片的时候可以使用键盘模块,复制粘贴,比啪啪啪输入路径再发送速度快多了
import keyboard import iofor line in io.StringIO(msg):keyboard.write(line.strip()) #keyboard.send('ctrl+enter') keyboard.write(chat_name) keyboard.send('enter') keyboard.send('ctrl+v')
python基于pywinauto实现PC端自动化相关推荐
- python实现电脑程序自动化_python基于pywinauto实现PC客户端自动化
一.前言 我们柠檬班的小可爱,在学完我们柠檬班自动化的课程之后,就掌握了接口自动化,web自动化,app自动化,这些工作中常用的自动化技能,在工作足以够应对90%以上的自动化需求了.不过近期也有部分小 ...
- python+pywinauto之PC端自动化一
所需软件安装: 1.下载 pywinauto 安装参考: https://jingyan.baidu.com/article/414eccf6a1a3906b421f0a59.html 下载地址: h ...
- 基于QT开发PC端文件加密工具
基于QT开发PC端文件加密工具 1.客户需求 某案子.该方案,通过外挂TF卡实现,本地教育资源的调取使用.按客户需求,把TF卡内的内容进行加密,并在软件中写好解密,确保资源文件只能在教育机中才能正常播 ...
- Python Fiddler 钉钉PC端群回放视频爬取
Python Fiddler 钉钉PC端群回放视频爬取 钉钉群里的回放视频被群管理员设置为不能下载,可是有时候又需要这些视频可以方便传阅和打开调倍速等等,而且还可以不用再打开PC端就可以直接看到视频多 ...
- 聊聊 PC 端自动化最佳方案 - WinAppDriver
点击上方 "AirPython",选择 "加为星标" 第一时间关注 Python 原创干货! 1. 前言 大家好,我是安果! 一提到自动化,可能大家想到的是 A ...
- 使用Python+SmsForwarder实现微信PC端通知消息
目录 一.目的 二.准备: 三.实现逻辑: 四.具体实现: 五.最终效果图: 针对有全屏且任务栏设置隐藏习惯,但是隐藏任务栏后情况,在电脑上看不到微信PC端新消息的问题进行以下方案解决,前提是电脑为W ...
- 基于webpack的PC端和mobile端开发以及生产环境的搭建
我们用webpack做单页面应用开发应该尝试过很多次了,如果在同一个项目需要支持PC端和移动端,做成多页面应用,开发时能根据请求的终端返回不同的内容,应该怎么做呢?以下描述的是我尝试的一种方案,并且以 ...
- APPium+Python编写真机移动端自动化脚本
前置条件 完成软件和环境的安装后就可以开始移动端自动化脚本的编写了. 连接设备 手机打开USB调试模式,连接手机.此时去命令窗口查看自己的设备是否已经连接. 让后打开Appium Server,进行配 ...
- PC端自动化工具开发:Pywinauto的安装及使用
目录 1.pywinauto简单介绍 2.pywinauto的安装 3. 通过启动windows自带记事本,检查是否可正常使用 1.pywinauto简单介绍 pywinauto是一组用于自动化测试脚 ...
最新文章
- Go环境搭建、Sublime Text 3 安装Go语言相关插件gosublime
- oracle java api_oracle java api
- Java基础-关于session的详细解释
- opencv中图像的基本结构 类型的定义
- 不同寻址方式的灵活应用——改变每个单词首字母大小写
- 深度学习和目标检测系列教程 22-300:关于人体姿态常见的估计方法
- 高手教你如何用香技巧香水达人教你用香省钱法 - 生活至上,美容至尚!
- [蓝桥杯2017初赛]Excel地址
- 宝塔执行sh文件_宝塔面板无法访问权限被锁 Linux面板
- eclipse导出war包放入服务器中
- javaweb实现教师和教室管理系统 java jsp sqlserver
- 拓端tecdat|SARIMA,神经网络,RNN-LSTM,SARIMA和RNN组合方法预测COVID-19每日新增病例
- Ubuntu下的LibTorrent库编译
- C语言发展史的点点滴滴
- Hadoop 启动 HDFS DataNode 时报错:Invalid dfs.datanode.data.dir
- PointConv:基于3D点云的深度卷积网络
- 免费高速的钉钉内网穿透——阿里出品必是精品(不限速,不限流量)
- 多益网络_网络安全的未来日益激烈的信息控制之战
- Linux安装JDK环境变量配置
- 2019税务师课件视频题库分享