【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)

这篇具有很好参考价值的文章主要介绍了【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.说明

pywinauto是一个用于自动化Python 模块,适合Windows系统的软件(GUI),可以通过Pywinauto遍历窗口(对话框)和窗口里的控件,也可以控制鼠标和键盘输入,所以它能做的事情比之前介绍的pysimplegui更多

2.安装

一般使用pip安装就行了

pip install pywinauto

官网文档:https://pywinauto.readthedocs.io/en/latest/

3.Application

我们要控制软件的第一件事就是启动一个Windows软件,每一个软件(进程)都是一个Application对象

实例化Application对象的时候可以传入一个backend参数,可选值为win32(默认)和 uia

win32对应的框架:MFC、VB6、VCL、简单的 WinForms 控件和大多数旧的遗留应用程序
uia对应的框架:WinForms、WPF、商店应用程序、Qt5、浏览器
如果无法知道要测试的软件是属于哪种框架,可以使用 Inspect(对应uia)Spy++(对应win32) 看看,你看哪个显示得更全就选哪个。Inspect和Spy++需要自己安装一下

下面是Application对象的主要方法

方法 常用参数 说明
start() cmd_line、timeout、retry_interval 通过cmd命令启动一个软件(进程)
connect() process、handle、path、timeout 连接一个进程,一般是使用进程号(任务管理器可以看到)
top_window() / 获取应用的顶层窗口
window() title、title_re、class_name、best_match 获取单个窗口(WindowSpecification)
windows() title、title_re、class_name 获取多个窗口(UIAWrapper)
is64bit() / 是否64位应用
cpu_usage interval CPU占用率
wait_cpu_usage_lower() threshold、timeout 等待CPU占率小于某个阈值
active()() / 搜索返回一个激活的窗口
kill() soft 结束进程
wait_for_process_exit() timeout、retry_interval 等待进程结束

举例,启动一个微信应用,通过进程号连接,进程号就是在任务管理器里详细信息看到的PID
【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作),测试,python,pywinauto,自动化,测试,GUI

from pywinauto import Application

app = Application(backend="uia")
# app.start(r"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe")
app.connect(process=6556)
print("is64bit:", app.is64bit())
print("cpu_usage:", app.cpu_usage())
app.wait_cpu_usage_lower()
# app.active()  # 如果指定时间内不激活则报错
print("kill:", app.kill())
print("wait_for_process_exit:", app.wait_for_process_exit())
4.WindowSpecification

我们要获取窗口,一个窗口都是一个WindowSpecification对象,可以通过Application对象的window()方法获取,参数可以是title、classname或者best_match等,这都可以在inspect.exe上看到,不过需要注意的是inspect看到的Name其实对应的是window()的title参数
【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作),测试,python,pywinauto,自动化,测试,GUI

WindowSpecification对象常用的方法如下

方法 常用参数 说明
maximize() / 最大化窗口
minimize() / 最小化窗口
restore() / 恢复窗口
close() / 关闭窗口
get_show_state() / 获取窗口状态,0正常1最大化2最小化
was_maximized() / 当前是否最大化
draw_outline() colour、thickness 给窗口画个框以便定位
print_control_identifiers() / 打印所有子窗口和子元素(会打印出对应的control_type)
child_window() title、control_type 获取子窗口
exists() timeout 窗口是否存在
wait() wait_for, timeout 等待窗口变成某个状态(exists、visible、enabled、ready、active)
wait_not() wait_for_not, timeout 等待窗口不处于某个状态(exists、visible、enabled、ready、active)

举个栗子

dlg = app.window(class_name="WeChatMainWndForPC")
# dlg = app.window(title="微信")
print("get_show_state:", dlg.get_show_state())
print("was_maximized:", dlg.was_maximized())
dlg.print_control_identifiers()
dlg.draw_outline()
dlg.maximize()
dlg.restore()
dlg.minimize()
dlg.close()
5.元素控件

一个窗口里一般都会有各种各样的元素,比如说按钮 (Button)、编辑栏(Edit)、树状视图(Tree View)、复选框(CheckBox)、对话框(Dialog)、工具栏(Toolbar)、状态栏(StatusBar)、列表框(ListBox)、窗格(Pane)、菜单(Menu)、菜单栏(MenuItem)、静态内容(Static)、工具提示(ToolTips)、列表控件(ListView)、单选框(RadioButton)、组合框(ComboBox)、选项卡控件(TabControl)、组框 (GroupBox)、弹出菜单(PopupMenu)、头部(Header)等

因为控件类型太多了不能一个一个学习,但是它们都有一个 element_info 的属性,访问之后会返回一个继承于ElementInfo的对象(UIAElementInfo或HwndElementInfo),比较重要的属性或方法如下

方法或属性 常用参数 说明
name / 元素的真实名(一般是title)
visible / 元素是否可见
rich_text / 元素的全名
rectangle / 返回元素的位置以及宽高
class_name / 类名
enabled / 元素是否处于可用状态
parent / 返回父元素
children() title、title_re、class_name、best_match 返回符合要求的子元素(列表)
iter_children() title、title_re、class_name、best_match 迭代符合要求的子元素(生成器)

这些元素除了有element_info可以获取一些元素的主要信息,它们还都被包装成一个Wrapper,所以也可以学一下BaseWrapper的常用方法和属性。其实BaseWrapper的方法基本上都是对ElementInfo进一步包装,我只列出部分方法,如下表

方法或属性 常用参数 说明
element_info / 返回当前元素的ElementInfo对象
from_point() x、y 通过坐标查找ElementInfo
class_name() / 类名,实际是调用element_info.class_name
friendly_class_name() / 友好的类名,同上
window_text() / 元素的文本,实际是调用element_info.rich_text
is_visible() / 元素是否可见,实际是调用element_info.visible
is_enabled() / 元素是否可用,实际是调用element_info.enabled
rectangle() / 元素的位置和宽高,实际是调用element_info.rectangle
process_id() / 进程号,实际是调用element_info.process_id
draw_outline() colour、thickness 给当前元素画个框
click_input() button、coords、double 鼠标操作,实际是调用mouse模块的_perform_click_input()
type_keys() / 键盘操作,实际是调用keyboard模块的send_keys()
dlg = app.window(class_name="WeChatMainWndForPC")
list_data = dlg.child_window(title="会话", control_type="List")
for item in list_data:
    print(type(item))
    element_info = item.element_info
    print(type(element_info))
    print("window_text:", )
    print("rich_text:", element_info.rich_text)
    print("name:", element_info.name)
    print("visible:", element_info.visible)
    print("rectangle:", element_info.rectangle)
    print("class_name:", element_info.class_name)
    print("enabled:", element_info.enabled)
    print("parent:", element_info.parent)
    print("children:", element_info.children())
    print("iter_children:", element_info.iter_children())
    if item.window_text() == "文件传输助手":
        item.click_input()
        item.type_keys("冰冷的希望")
        item.type_keys("{VK_RETURN}")
    print()

说明一下,每个控件元素都有对应的Wrapper,所以上面的方法也不一定都用,需要根据实际情况进行测试区分。另外,比较有用的click_input()type_keys()这两个方法分别用于操作鼠标和键盘(输入),下面我会单独拿出来说一下

6.鼠标操作

鼠标点击肯定离不开点击的位置,桌面就是一个坐标,左上角为坐标原点,往右是X轴正向,往下是Y轴正向。pywinauto提供了一个mouse模块用于鼠标操作,最核心的方法是_perform_click_input(),不过它是一个私有方法,我们调用的是基于它的封装方法,如下表

方法 参数
click() button、coords 单击鼠标某个键
double_click() button、coords 双击鼠标某个键
right_click() coords 单击鼠标右键
move() coords 移动鼠标
press() button、coords 按下鼠标
release() button、coords 放开鼠标
scroll() coords、wheel_dist 滚动鼠标滚轮
wheel_click() coords 单击鼠标滚轮

参数说明:
参数button的默认值都是“left”,即鼠标左键,可选值有left、right、middle、move、wheel、x
参数coords 的默认值都是元组(0, 0),元组里的两个整数分别是X、Y轴的值
参数wheel_dist表示滚动的距离,大于0是向上滚动,小于0是向下滑动

举个栗子

from pywinauto import Application, mouse

app = Application(backend="uia")
app.connect(process=4352)
dlg = app.window(class_name="WeChatMainWndForPC")
list_data = dlg.child_window(title="会话", control_type="List")
for item in list_data:
    if item.window_text() == "文件传输助手":
        # item.click_input()
        rectangle = item.element_info.rectangle
        x = int((rectangle.left + rectangle.right) / 2)
        y = int((rectangle.top + rectangle.bottom) / 2)
        mouse.click(button='left', coords=(x, y))
        time.sleep(1)
        mouse.click("right", (x, y))
        time.sleep(1)
        mouse.move((x - 50, y))  # 往左边移动50个像素
        time.sleep(1)
        mouse.click(coords=(x, y))
        break
7.键盘操作

键盘操作主要是按下键盘上的按键,相关方法在keyboard模块,最最主要的是send_keys()方法,第一个参数keys就是我们需要按下的按键,其他参数比如说with_spaces、with_tabs、with_newlines、turn_off_numlock、set_foreground、vk_packet,一看就知道作用,而且都是布尔值,此处不进行举例

pywinauto支持的完整的按键可以在官方文档查看,https://pywinauto.readthedocs.io/en/latest/code/pywinauto.keyboard.html
下面我列举出的是一些比较常用的按键

按键 符号 说明
Shift VK_SHIFT 上档键
Ctrl VK_CONTROL、VK_LCONTROL、VK_RCONTROL Ctrl键、左右Ctrl键
Alt VK_MENU Alt键
Windows VK_LWIN、VK_RWIN 左右win键
Space VK_SPACE 空格键
backspace BACKSPACE 退格键
enter ENTER 回车键
esc ESC 退出键
table VK_TAB 制表键
left、right、up、down VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN 上下左右方向键
f1~f24 VK_F1、VK_F2…VK_F24 f1到f24
capslock CAPSLOCK 大写键

说明:
1.使用按键时需要搭配大括号,比如说按下回车键是 '{ENTER}' (是字符串)
2.在Windows平台默认是发送虚拟按键的,以VK_开头的按键,都是指虚拟按钮,如果不想使用虚拟按钮可以把VK_前缀去掉,把send_keys()的vk_packet参数改为False即可

单个按键按下抬起还不够,往往需要组合键,这时候就需要修饰符了,在大括号里可以使用downup控制按键什么时候按下和抬起,如果后面加上数字,表示按下多少次

list_data = dlg.child_window(title="会话", control_type="List")
for item in list_data:
    if item.window_text() == "文件传输助手":
        item.click_input()
        # item.type_keys("冰冷的希望")
        send_keys("   ")  # 随便输入字符串
        send_keys("{VK_CONTROL down} a {VK_CONTROL up}")  # 快捷键Ctrl+a(先按下Ctrl,再按下a,最后放开Ctrl)
        send_keys("{BACKSPACE}")  # 按下退格键删除文本
        send_keys("{. 6}")  # 按6次小数点
        send_keys("冰冷的希望{ENTER}")  # 输入文本,按下回车键

当然,很多时候使用downup修饰感觉不够简洁,所以pywinauto还提供了简化写法,使用+代替{VK_SHIFT},使用^代替{VK_CONTROL},使用%代替{VK_MENU}

send_keys('^a^c') # 按下Ctrl+a之后再按下Ctrl+c,即全选复制
send_keys('+{INS}') # 按下Shift+Ins键
send_keys('%{F4}') # 按下Alt+F4键

如果不想按下按钮,纯属想要输入纯字符串,那就需要取消转义了,注意修饰符和按钮的写法是不一样的文章来源地址https://www.toymoban.com/news/detail-677484.html

send_keys('{^}a{^}c{%}') # 输入字符串"^a^c%"而不是当成快捷键
send_keys('{{}ENTER{}}') # 输入字符串"{ENTER}"而不是按下回车键

到了这里,关于【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker 简单使用及安装常用软件

    子命令分类 子命令 Docker 环境信息 info、version 容器生命周期管理 Create、exec、kill、pause、.restart、rm、run、start、stop、unpause 镜像仓库命令 login、logout、pull、push、search 镜像管理 build、images、import、load、rmi、save、tag、commit 容器运维操作 attach、export、inspect、port、ps、rename、s

    2024年04月28日
    浏览(36)
  • 软件测试/测试开发丨Selenium的常用元素定位方法

    Selenium是一个流行的开源框架,目前在 Web 自动化方面运用最为广泛的一个开源、无浏览器要求、可支持多语言、设计测试用例非常灵活的自动化测试框架。支持多种编程语言,并且能够模拟用户操作,例如点击、输入、提交等等。 在Selenium中,元素定位是一个非常重要的步骤

    2024年01月16日
    浏览(67)
  • 自动化测试(二)selenium八大获取元素方法及对象操作

    目录 webdriver API 脚本实例 元素的定位 1. 通过id定位: 2. 通过name方式定位 3. 通过tag name(标签名)定位 4. 通过class name (类名)方式定位 5. 通过CSS 方式定位 6. 通过xpath方式定位 7. link text定位 8. Partial link text 定位 操作测试对象  鼠标点击与键盘输入 submit 提交表单 text 获取

    2024年02月03日
    浏览(47)
  • python ui自动化测试元素定位常用语法

    第一部分是css样式定位方法 选择器 示例 示例说明 CSS . class .intro 选择所有class=\\\"intro\\\"的元素 1 # id #firstname 选择所有id=\\\"firstname\\\"的元素 1 * * 选择所有元素 2 element p 选择所有p元素 1 element,element div,p 选择所有div元素和p元素 1 element   element div p 选择div元素内的所有p元素 1 element

    2024年02月13日
    浏览(51)
  • 【APP渗透测试】Android APK常用测试工具(Drozer)安装及使用方法介绍

    本篇文章主要介绍 Drozer Android测试工具的安装以及简单使用,后续会持续更新更多使用方法。 Drozer 是 MWR Labs 开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一。其官方文档说道: Drozer允许你一个普通Android应用的身份与其他应用和操作系统交互。 在Web世界

    2024年02月16日
    浏览(48)
  • 手机APP性能测试工具PerfDog性能狗安装教程及简单使用

            PerfDog是一个由腾讯研发的主流性能测试软件。可以提高软件和游戏的运行效率,支持iOS/安卓在移动平台上的性能测试和分析,快速定位和分析性能问题等。无需安装,即插即用,减少繁琐的测试障碍,安卓设备不需要ROOT,iOS设备也不需要越狱,有效解决安卓和i

    2024年02月11日
    浏览(53)
  • 不用编程超简单的自动化测试工具:Airtest安装使用入门篇

    很多刚入行或从其他行业转行做测试的同学,日复一日每天做点工已经点得疲惫和麻木,觉得做测试和在厂子里打螺丝没太大区别。也想着做一做自动化测试,奈何自己看着代码就头痛,当初就是因为不喜欢编程才选择的做测试。亦或者由于从其他行业转行过来的,隔行如隔

    2024年02月04日
    浏览(55)
  • 【渗透测试】漏洞扫描AWVS安装使用教程,三分钟手把手教会,非常简单

    Acunetix Web Vulnerability Scanner(简称AWVS)是一个 自动化 的Web漏洞扫描工具,它可以扫描任何通过 Web浏览器访问 和 遵循HITP/HTTPS 规则的Web站点。 AWVS原理是基于 漏洞匹配方法 ,通过 网络爬虫 测试你的网站安全,检测流行安全 AWVS可以检测什么漏洞,它有什么优势? AWVS可以通过

    2024年01月25日
    浏览(65)
  • 【MFC】03.常用复杂控件的使用-笔记

    对话框-类向导:初始化函数中,热键需要在最开始的时候就注册进去: 注册热键: 在这之前,先去定义一个宏,代表你这个快捷键。 相应消息: 类向导-添加消息处理:WM_HOTKY消息 全局消息钩子:在所有页面上都可以使用该热键 给空间添加变量m_IP 设置 清除: 获取 添加变

    2024年02月14日
    浏览(39)
  • Android常用控件Spinner的使用(详解)

    在Android开发过程中,Spinner下拉控件是比较常用的控件,它可以以下拉框和dialog的方式进行展示。默认是下拉框方式。 上图可以看出实现Spinner的方式有两种:一、ArrayAdater 数组适配器 二、自定义适配器。 下面是bind的两个参数 String:在这里不一定是String,也可以是int ,flo

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包