前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pywinauto桌面应用自动化入门篇

pywinauto桌面应用自动化入门篇

作者头像
懿曲折扇情
发布2022-10-28 15:03:22
4.5K0
发布2022-10-28 15:03:22
举报
文章被收录于专栏:建帅技术分享建帅技术分享

一、pywinauto windows桌面应用自动化

代码语言:javascript
复制
# 背景
由于项目中用到桌面应用自动化的程序,所以要探索如果去做桌面应用自动化,便有了下文。

桌面应用程序自动化,目前做过自动化里头相对来说比较麻烦一些,而且资料不够完善的一套,
因为好多遇到桌面应用自动化,好多都直接不做了。

pywinauto官网中文文档

image-1665310795224
image-1665310795224

二、环境安装

1.命令行安装方法

代码语言:javascript
复制
pip install pywinauto

2.环境检查

代码语言:javascript
复制
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")
image
image

三、元素定位工具介绍

1.Backend判断

我目前接触的是uia的

代码语言:javascript
复制
Pywinauto中backend有两种:win32和uia,默认为win32。可使用spy++和Inspect工具判断backend适合写哪种。
例如:如果使用Inspect的UIA模式,可见的控件和属性更多的话,backend可选uia,反之,backend可选win32。

2.工具介绍

inspect工具地址

image-1665311985453
image-1665311985453

我目前只用过Inspect

代码语言:javascript
复制
Spy++ (定位元素工具(win32))
Inspect(定位元素工具(uia))
UI Spy (定位元素工具)
Swapy(可简单生成pywinauto代码)

四、简单案例介绍

案例1(调试)

代码语言:javascript
复制
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")

案例2

本案例因为start方法无法启动应用程序,所以我这里使用了os.system去启动的应用程序

代码语言:javascript
复制
# coding=utf-8
"""
    @project: automation_tools
    @Author:gaojs
    @file: admin_test.py
    @date:2022/10/9 9:51
    @blogs: https://www.gaojs.com.cn
"""
import time
import os
from pywinauto import application


app = application.Application(backend="uia")
# 打开CAAdmin程序,由于别的方法启动失败所以这里使用os.system去启动
os.system("e: && cd E:\\NetCertCAAdmin_6\\ && chdir && CAAdmin.exe")
app.start(r"E:\NetCertCAAdmin_6\CAAdmin.exe")
time.sleep(5)
# app.connect(title='预定会议')
app.connect(title_re="Infosec", class_name="SWT_Window0")
app.window(title_re="Infosec", class_name="SWT_Window0").print_control_identifiers()

app.window(title_re="Infosec").menu_select("操作 -> 配置")
time.sleep(5)
# app.window(title_re="Infosec").child_window(title="驱动名称:")["gaojs_test"].click()
# app.window(title_re="Infosec")["登录"].click()
app.window(title_re="Infosec").Button3.click()

# app.window(title_re="Infosec").Button6.click()
image-1665310650752
image-1665310650752

五、常用元素定位接口

1.常用定位控件接口(重要)

代码语言:javascript
复制
# 通过层级查找控件相关方法
window(**kwargs) # 用于窗口的查找
child_window(**kwargs) # 可以无视层级的找后代中某个符合条件的元素===>【最常用】
parent() # 返回此元素的父元素,没有参数
children(**kwargs) # 返回符合条件的子元素列表,支持索引,是BaseWrapper对象(或子类)
iter_children(**kwargs) # 返回子元素的迭代器,是BaseWrapper对象(或子类)
descendants(**kwargs) # 返回符合条件的所有后代元素列表,是BaseWrapper对象(或子类)
iter_children(**kwargs) # 符合条件后代元素迭代器,是BaseWrapper对象(或子类)---> 存疑,是iter_descendants?

2.常用属性(重要)

代码语言:javascript
复制
# 常用的
class_name=None, # 类名
class_name_re=None, # 正则匹配类名
title=None, # 控件的标题文字,对应inspect中Name字段
title_re=None, # 正则匹配文字
control_type=None, # 控件类型,inspect界面LocalizedControlType字段的英文名
best_match=None, # 模糊匹配类似的title
auto_id=None, # inspect界面AutomationId字段,但是很多控件没有这个属性

# 不常用
parent=None,
process=None,# 这个基本不用,每次启动进程都会变化
top_level_only=True,
visible_only=True,
enabled_only=False,
handle=None,
ctrl_index=None,
found_index=None,
predicate_func=None,
active_only=False,
control_id=None,
framework_id=None,
backend=None,

3.控件可用的方法属性(重要)

代码语言:javascript
复制
# 以下几个只支持窗口模式的控件
dlg.close() # 关闭界面
dlg.minimize() # 最小化界面
dlg.maximize() # 最大化界面
dlg.restore() # 将窗口恢复为正常大小,比如最小化的让他正常显示在桌面
dlg.get_show_state() # 正常0,最大化1,最小化2
dlg.menu_select() # 菜单栏,eg:app.window.menu_select(Edit -> Replace)
dlg.exists(timeout=None, retry_interval=None) # 判断是否存在
        #timeout:等待时间,一般默认5s
        #retry_interval:timeout内重试时间
dlg.wait(wait_for, timeout=None, retry_interval=None) # 等待窗口处于特定状态
dlg.wait_not(wait_for_not, timeout=None, retry_interval=None) # 等待窗口不处于特定状态,即等待消失
        # wait_for/wait_for_not:
            # * 'exists' means that the window is a valid handle
            # * 'visible' means that the window is not hidden
            # * 'enabled' means that the window is not disabled
            # * 'ready' means that the window is visible and enabled
            # * 'active' means that the window is active
        # timeout:等待多久
        # retry_interval:timeout内重试时间
        # eg: dlg.wait('ready')

# 鼠标键盘操作,只列举了常用形式,他们有很多默认参数但不常用,可以在源码中查看
ctrl.click_input() # 最常用的点击方法,一切点击操作的基本方法(底层调用只是参数不同),左键单击,使用时一般都使用默认不需要带参数
ctrl.right_click_input() # 鼠标右键单击
ctrl.type_keys(keys, pause = None, with_spaces = False,) # 键盘输入,底层还是调用keyboard.send_keys
        # keys:要输入的文字内容
        # pause:每输入一个字符后等待时间,默认0.01就行
        # with_spaces:是否保留keys中的所有空格,默认去除0
ctrl.double_click_input(button ="left", coords = (None, None)) # 左键双击
ctrl.press_mouse_input(coords = (None, None)) # 指定坐标按下左键,不传坐标默认左上角
ctrl.release_mouse_input(coords = (None, None)) # 指定坐标释放左键,不传坐标默认左上角
ctrl.move_mouse_input(coords=(0, 0)) # 将鼠标移动到指定坐标,不传坐标默认左上角
ctrl.drag_mouse_input(dst=(0, 0)) # 将ctrl拖动到dst,是press-move-release操作集合

# 控件的常用属性
ctrl.children_texts() # 所有子控件的文字列表,对应inspect中Name字段
ctrl.window_text() # 控件的标题文字,对应inspect中Name字段
# ctrl.element_info.name
ctrl.class_name() # 控件的类名,对应inspect中ClassName字段,有些控件没有类名
# ctrl.element_info.class_name
ctrl.element_info.control_type # 控件类型,inspect界面LocalizedControlType字段的英文名
ctrl.is_child(parent) # ctrl是否是parent的子控件
ctrl.legacy_properties().get('Value') # 可以获取inspect界面LegacyIAccessible开头的一系列字段,在源码uiawraper.py中找到了这个方法,非常有用

# 控件常用操作
ctrl.draw_outline(colour='green') # 空间外围画框,便于查看,支持'red', 'green', 'blue'
ctrl.print_control_identifiers(depth=None, filename=None) # 以树形结构打印其包含的元素,详见打印元素
        # depth:打印的深度,缺省时打印最大深度。
        # filename:将返回的标识存成文件(生成的文件与当前运行的脚本在同一个路径下)
ctrl.scroll(direction, amount, count=1,) # 滚动
        # direction :"up", "down", "left", "right"
        # amount:"line" or "page"
        # count:int 滚动次数
ctrl.capture_as_image() # 返回控件的 PIL image对象,可继续使用其方法如下:
        # eg: ctrl.capture_as_image().save(img_path)
ret = ctrl.rectangle() # 控件上下左右坐标,(L430, T177, R1490, B941),可输出上下左右
        # eg: ret.top=177
            # ret.bottom=941
            # ret.left=430
            # ret.right=1490
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、pywinauto windows桌面应用自动化
  • 二、环境安装
    • 1.命令行安装方法
      • 2.环境检查
      • 三、元素定位工具介绍
        • 1.Backend判断
          • 2.工具介绍
          • 四、简单案例介绍
            • 案例1(调试)
              • 案例2
              • 五、常用元素定位接口
                • 1.常用定位控件接口(重要)
                  • 2.常用属性(重要)
                    • 3.控件可用的方法属性(重要)
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档