官方文档: https://pywinauto.readthedocs.io/en/latest/contents.html

[安装]

pip install pywinauto

[使用]

from pywinauto import application

# 创建应用程序对象并打开应用程序
app = application.Application()
app.start('your_application.exe') # 连接到应用程序窗口
app.connect(title='Window Title') # 获取窗口对象
window = app.window(title='Window Title') # 获取子控件
child = window.child_window(class_name='UIAutomationClassName') # 获取子控件的UI元素信息
element_info = child.uia_element_info # 打印UI元素信息
print(element_info)

1.其中的点击事件,需要使用click_input代替click(无法正常使用)

2.其中涉及的鼠标和键盘的相关事件,推荐使用单独包

from pywinauto import mouse, keyboard

3.元素的操作对象是一个dialog, 所以应用需要指定

app.window(title='', class_name='')
可以指定名称或类名称

4.查找元素

win.child_window(title='', control_type='',found_index=0)
注: 如果存在多个元素, 则可以通过索引指定:found_index

指定名称和控件类型

常见控件类型:

Window: 窗口
ToolBar: 导航
Button: 按钮
ListItem: 聊天列表
Text:聊天内容

5.查询所有Windows下的窗口元素

# 查询当前内置浏览器窗格信息
wins = pywinauto.findwindows.find_elements(backend='uia')
print('所有窗口:', wins)
# 查找指定窗口的进程,类名,窗口名称(任务栏中展示的名称)等情况
    pid = 0
for win in wins:
print('=======================')
print(dir(win))
print(win.name) # 窗口名称
# print(win.control_id) # 都是0
# print(win.process_id)
# print(win.automation_id)
print(win.class_name) # 类名
# print(win.control_id) # 都是0
print(win.runtime_id) # (id, 进程ID)
if win.class_name == 'Chrome_WidgetWin_0':
pid = win.runtime_id[1]
# 使用handle的方式链接窗口并执行操作
app2 = Application(backend='uia').connect(handle=pid)
# print(app2.window().print_control_identifiers()) app2.window().child_window(title='关闭', control_type='Button', found_index=0).click_input()
 

使用实例:

1)自动打开微信链接

import random
import time from pywinauto import mouse, keyboard
import pywinauto.findwindows
from pywinauto.application import Application
import pyautogui # 连接方式1)
# app = Application(backend='uia').connect(process=19004) # 连接方式2)
app = Application(backend='uia').connect(path=r'D:\software\WeChat\WeChat.exe') # 该窗口中的对话框, 方便查看当前的窗口或窗格情况
# print(app.windows())
# Chrome_WidgetWin_0 # 打开
# app = Application(backend='uia').start('D:\software\WeChat\WeChat.exe')
# time.sleep(5)
# 拿到微信主窗口
win_main_dialog = app.window(title='微信', class_name='WeChatMainWndForPC') # 判断是否未dialog, 一个微信就是一个dialog -->窗口
# print(win_main_dialog.is_dialog) # print(win_main_dialog.wrapper_object()) # 给空间画一个红色框便于看出
win_main_dialog.draw_outline(colour='red') # 打印当前所有空间和属性
# win_main_dialog.print_control_identifiers(depth=None, filename=None) time.sleep(1) def get_element_position(ele):
"""获取元素的中心点位置"""
element_position = ele.rectangle()
# 算出中心点位置
center_position = (int((element_position.left + element_position.right) / 2),
int((element_position.top + element_position.bottom) / 2))
return center_position def send_msg():
# 找到文件传输助手
file_helper_ele = win_main_dialog.child_window(title="文件传输助手已置顶", control_type="ListItem")
mouse.click(button='left', coords=get_element_position(file_helper_ele)) # 获取输入框元素, 并模拟输入
edit_ele = win_main_dialog.child_window(title="文件传输助手", control_type="Edit")
time.sleep(2)
edit_ele.type_keys("hello")
keyboard.send_keys("{ENTER}") def click_buttons():
'''分别进行点击'''
win_main_dialog.child_window(title="聊天", control_type="Button").click_input()
time.sleep(2)
win_main_dialog.child_window(title="通讯录", control_type="Button").click_input()
time.sleep(2)
win_main_dialog.child_window(title="朋友圈", control_type="Button").click_input()
time.sleep(2) def gui():
# 使用pyautogui方式是比较固定(坐标)的方式
pyautogui.click(x=622, y=183, clicks=1, interval=0.1)
time.sleep(random.randint(3, 5))
pyautogui.click(x=756, y=78, clicks=1, interval=0.1) '''
depth: 打印深度, 缺省最大深度
filenmae: 返回的标识存成文件, 可以指定 eg:a.txt
''' # 查找主窗口下的某个窗口
# chat_list = win_main_dialog.child_window(control_type='List', title='会话')
# first = chat_list.items()[0] # 第一个聊天项, 支持循环, 索引
# chat_list.scroll(direction='down', amount='page') # 向下滚动一页 # first.focus() def main():
# 找到聊天框
chat_list_ele = win_main_dialog.child_window(title="聊天", control_type="Button")
mouse.click(button='left', coords=get_element_position(chat_list_ele))
time.sleep(1)
# 找到指定聊天人
ln = win_main_dialog.child_window(title="Learning已置顶", control_type="ListItem")
mouse.click(button='left', coords=get_element_position(ln)) time.sleep(1)
# 找到指定链接并点击
lk = win_main_dialog.child_window(title=r"https://www.cnblogs.com/xingxia", control_type="ListItem")
mouse.click(button='left', coords=get_element_position(lk)) time.sleep(random.randint(3, 5))
# 关闭内置浏览器 # 1) 查询当前内置浏览器窗格信息
wins = pywinauto.findwindows.find_elements(backend='uia')
print('所有窗口:', wins)
pid = 0
for win in wins:
print('=======================')
print(dir(win))
print(win.name) # 窗口名称
# print(win.control_id) # 都是0
# print(win.process_id)
# print(win.automation_id)
print(win.class_name) # 类名
# print(win.control_id) # 都是0
print(win.runtime_id) # (id, 进程ID)
if win.class_name == 'Chrome_WidgetWin_0':
pid = win.runtime_id[1] app2 = Application(backend='uia').connect(handle=pid)
# print(app2.window().print_control_identifiers()) app2.window().child_window(title='关闭', control_type='Button', found_index=0).click_input() if __name__ == '__main__':
main() # 自动化主流程
# send_msg() # 发送消息
# click_buttons()
# gui()

说明:

1.其中元素定位软件需要借助: inspect.exe 或者 UISpy

PC端的自动化, 除了可以使用pywinauto之外,还有其他的工具可以选择, 例如:uiautomation

对比PyWinAuto和uiautomation

PyWinAuto和uiautomation都是自动化测试工具,它们都可以模拟用户的操作来测试应用程序的功能。但是PyWinAuto是一个Python库,可以跨平台使用,而uiautomation是一个Windows平台的测试工具。除此之外,PyWinAuto提供更多的GUI操作函数和更好的文档支持,而uiautomation则更加适合对Windows应用程序进行测试。

安装

pip install uiautomation

github: https://github.com/yinkaisheng/Python-UIAutomation-for-Windows

PC自动化之pywinauto的更多相关文章

  1. Windows GUI程序自动化之pywinauto

    一. pywinauto知识点总结 官方英文版文档网址:https://pywinauto.readthedocs.io/en/latest/index.html 1.1 pywinauto的安装与配 ...

  2. eclipse 集成jdk

    最近想整合一个工具,eplise中包含了 pc 自动化可用的一套环境,让其他测试人员,下载下来就可以用,不需要在进行安装其他东西,jdk安装也不需要,这事可有些犯难,eplise集成了svn和test ...

  3. airtest+poco多脚本、多设备批处理运行测试用例自动生成测试报告

    一:主要内容 框架功能及测试报告效果 airtest安装.环境搭建 框架搭建.框架运行说明 airtest自动化脚本编写注意事项 二:框架功能及测试报告效果 1. 框架功能: 该框架笔者用来作为公司的 ...

  4. Python+Selenium - 文件上传

    如下图,从系统点击上传功能,打开到这种如下图页面的才适合本文介绍的处理方法 处理方法一 pywinauto库 优点:可以选择多个文件,路径中有中文也支持 缺点:只能Windows平台使用 安装 pip ...

  5. python 实现 PC 客户端自动化快速入门:pywinauto !

    本文转载自:http://www.lemfix.com/topics/420 一.前言 ​ 我们柠檬班的小可爱,在学完我们柠檬班自动化的课程之后,就掌握了接口自动化,web自动化,app自动化,这些工 ...

  6. 聊聊 PC 端自动化最佳方案 - Pywinauto

    1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...

  7. Pywinauto自动化操作PC微信提取好友微信号

    声明:https://zhuanlan.zhihu.com/p/29944988#! /usr/bin/env python #coding=utf-8 #pywinauto自动化操作微信号 #by ...

  8. python+pywinauto之PC端自动化一

    所需软件安装: 1.下载 pywinauto 安装参考: https://jingyan.baidu.com/article/414eccf6a1a3906b421f0a59.html 下载地址: h ...

  9. pywinauto之PC端windows自动化测试

    pywinauto是一个用纯Python编写的GUI自动化库,并为Windows GUI精心开发.最简单的是,它允许您将鼠标和键盘操作发送到Windows和Linux上的对话框和控件,而到目前为止,仅 ...

  10. Macaca自动化测试之PC端测试

    Macaca是一套完整的自动化测试解决方案.由阿里巴巴公司开源: http://macacajs.github.io/macaca/ 特点: 同时支持PC端和移动端(Android.iOS)自动化测试 ...

随机推荐

  1. vscode新建html文件并快速生成标准的html代码

    1.打开vscode,点击Open Folder 2.选择目标文件夹,新建一个扩展名为.html的文件: 3.在第一行输入 !(英文状态下),按tab键,新建成功.界面如下图所示:

  2. 【YashanDB知识库】自关联外键插入数据时报错:YAS-02033 foreign key constraint violated parent key not found

    问题现象 使用如下的sql语句创建自关联外键表: drop table self_f_key; create table self_f_key(t1 number primary key not nu ...

  3. Java实现英语作文单词扫盲程序

    来自背英语四级单词的突发奇想: 是否可以通过Java语言实现一个随机抽取作文中单词进行复习的程序. 首先,展示下成果: 点击查看代码 package Demo; import java.util.Ar ...

  4. BOM – 操作 Query

    前言 ASP.NET Core 写过一篇关于操作 query 的 ASP.NET Core – 操作 Uri 和 Query. 前端偶尔也会需要做出 query. URLSearchParams 之前 ...

  5. ASP.NET Core Library – MailKit SMTP Client

    前言 以前写的 SMTP Client 相关文章: Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 ) ASP.NET Email ...

  6. SQL server temporal table 学习笔记

    refer: https://blog.csdn.net/Hehuyi_In/article/details/89670462 https://docs.microsoft.com/en-us/sql ...

  7. 线段树与离散化技巧 Mayor's posters——poj 2528

    问题描述: 有一堵海报墙,从左到右一共有10000000个小块,墙上贴了许多海报,每张海报的高度与墙的高度相同,宽度不同,新帖的海报会将原有的海报覆盖,问当所有人把海报贴完是,墙上可以看到几张海报 输 ...

  8. SpringBoot注解大全(详细)

    1. @ActiveProfiles 用来声明活动的profile–@ActiveProfiles("prod"(这个prod定义在配置类中)) @RunWith(SpringRu ...

  9. 【赵渝强老师】Flink的DataSet算子

    Flink为了能够处理有边界的数据集和无边界的数据集,提供了对应的DataSet API和DataStream API.我们可以开发对应的Java程序或者Scala程序来完成相应的功能.下面举例了一些 ...

  10. 使用BPF之前和之后生成直方图过程的对比

    以bitehist为例: 使用BPF之前: 1.在内核中:开启磁盘IO事件的插桩观测. 2.在内核中,针对每个事件:向perf缓冲区写入一条记录.如果使用了跟踪点技术(推荐方式),记录中会包含关于磁盘 ...