PC端应用程序自动化测试——pywinauto、pywin32、pyautogui
1 前言
PC 端自动化测试使用到的 python 模块主要有 pywinauto、win32gui、pyautogui,主要功能如下:
- pywinauto:主要使用到 Application 类,用于应用程序管理(打开与关闭应用等)、窗口管理(最小化、最大化、关闭窗口)
- pywin32:包含 win32gui、win32api、win32con 3个子模块,用于窗口管理(定位窗口、显示和关闭窗口、获取窗口位置等)
- pyautogui:屏幕控制(截屏等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽等)、键盘控制(编辑、按键等)
在 pycharm 中运行以下代码,以安装上述包:
install.py
import os
# https://pypi.douban.com/simple # 豆瓣镜像
# https://pypi.tuna.tsinghua.edu.cn/simple # 清华镜像
mirror = " -i https://pypi.douban.com/simple"
os.system("python -m pip install --upgrade pip" + mirror) # 更新 pip
os.system("pip install pywinauto" + mirror) # 安装 pywinauto
os.system("pip install pypiwin32" + mirror) # 安装 pypiwin32 和 pywin32
os.system("pip install pyautogui" + mirror) # 安装 pyautogui
注意:安装 pywin32 模块时,使用的是 pypiwin32,否则在导入包时会报错。
查看窗口标题、窗口类、窗口边界坐标、子窗口标题、子窗口类、鼠标位置等信息,可以使用 inspect.exe 和 UISpy.exe 等工具。
2 pywinauto
pywinauto 模块主要用于应用控制(打开、关闭应用等)窗口控制(最大化、最小化窗口等),也可以等位到控件,并对控件进行操作,如点击、编辑等。
对于 pywinauto 模块,主要使用其中的 Application 类,需要导入包,并定义一个 Application 类的对象。
from pywinauto.application import Application
app = Application(backend="win32")
说明:backend 属性有2个取值:win32 和 uia,win32 为默认值,backend 取值不同,接口调用差异较大。
2.1 应用控制
# 打开应用
app.start(app_path)
app.start(r"C:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe")
# 连接应用
app.connect(path=app_path)
app.connect(path=r"C:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe")
# 关闭应用
app.kill()
说明:待连接的应用必须是已经打开的应用,连接应用是为了将 app 对象与目标应用绑定,以实现对目标应用的控制。
2.2 窗口控制
(1)定位窗口
# 定位到窗口(class_name:窗口类名,title:窗口标题)
dlg = app.window(class_name, title)
dig = app.class_name
dlg = app[title]
# 判断窗口是否存在
dlg.exists()
(2)获取窗口信息
app.Notepad.print_control_identifiers()
输出如下:
Notepad - '无标题 - 记事本' (L629, T124, R1359, B749)
['Notepad', '无标题 - 记事本Notepad', '无标题 - 记事本']
child_window(title="无标题 - 记事本", class_name="Notepad")
|
| Edit - '' (L638, T187, R1350, B711)
| ['无标题 - 记事本Edit', 'Edit']
| child_window(class_name="Edit")
|
| StatusBar - '' (L638, T711, R1350, B740)
| ['StatusBar UTF-8', '无标题 - 记事本StatusBar', 'StatusBar 第 1 行,第 1 列', 'StatusBar 100%', 'StatusBar Windows (CRLF)', 'StatusBar']
| child_window(class_name="msctls_statusbar32")
(3)最小化、最大化、恢复、关闭窗口
# 最小化窗口
dlg.minimize()
# 最大化窗口
dlg.maximize()
# 恢复窗口
dlg.restore()
# 关闭窗口
dlg.close()
2.3 控件控制
由于 windows 上一些控件的 class_name、title 等信息通常缺失,较难定位到具体控件,但记事本的各窗口和控件信息较全,本节以记事本为例,介绍控件的简单操作。
from pywinauto.application import Application
from time import sleep
app = Application(backend="win32")
app = app.start(r"C:\WINDOWS\system32\notepad.exe") # 启动记事本
# app = app.start(r"notepad.exe") # backend 取值为 win32 时,可以这样写
sleep(1)
app.Notepad["Edit"].TypeKeys(u"您好,记事本,我是 pywinauto") # 定位到输入框,并输入文本
sleep(1)
app.Notepad.MenuSelect(u'文件->另存为(&A)...') # 另存为
sleep(1)
app[u'另存为']['Edit'].TypeKeys(u"xxx.txt") # 输入文件名
sleep(1)
app[u'另存为'][u'保存'].Click() # 保存
sleep(1)
if app[u'另存为'].exists():
app[u'确认另存为'][u"是"].Click() # 替换原文件
3 pywin32
pywin32 包含 win32gui、win32api、win32con 3个子模块,主要用于窗口管理(定位窗口、显示和关闭窗口、窗口前置、窗口聚焦、获取窗口位置等),通常用的较多的是 win32gui,因此本文仅对此子模块进行介绍。在应用时,需要导入如下包:
import win32gui
import win32con
3.1 定位窗口
hwnd = win32gui.FindWindow(lpClassName=None, lpWindowName=None) # 查找窗口,不找子窗口,返回值为0表示未找到窗口
hwnd = win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) # 查找子窗口,返回值为0表示未找到子窗口
hwnd = win32gui.FindWindow("Notepad", u"无标题 - 记事本")
拓展:可以通过判断 hwnd 是否为0,确定窗口是否存在。
3.2 显示窗口
(1)显示方式
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
# SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。
# SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。
# SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。
# SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。
# SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
# SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。
# SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。
# SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
# SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
# SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。
# SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。
(2)判断窗口是否最小化
# 若最小化,则将其显示
if win32gui.IsIconic(hwnd):
win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL)
(3)关闭窗口
win32gui.PostMessage(hwnd, win32con.WM_CLOSE, 0, 0)
(4) 窗口置前并获得焦点
win32gui.SetForegroundWindow(hwnd) # 设置前置窗口
win32gui.SetFocus(hwnd) # 设置聚焦窗口
3.3 屏幕信息
(1)获取窗边界
left, top, right, bottom = win32gui.GetWindowRect(hwnd) # 获取窗口边界
(2)屏幕缩放比
import win32api, win32con, win32print, win32gui
def get_screen_scale_rate():
x = win32api.GetSystemMetrics(0) # 屏幕缩放后的宽度分辨率
hDC = win32gui.GetDC(0)
w = win32print.GetDeviceCaps(hDC, win32con.DESKTOPHORZRES) # 屏幕真实的宽度分辨率
return w/x
注意:在获取屏幕缩放比时,不要和 pyautogui 包同时使用,否则 x=w。
4 pyautogui
pyautogui 模块主要用于屏幕控制(获取屏幕尺寸、截屏等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽、滚动等)、键盘控制(编辑、按键等)。在使用此模块时,需要导入如下包:
import pyautogui
4.1 屏幕控制
(1)获取屏幕分辨率
screenWidth, screenHeight = pyautogui.size()
(2)截屏
pyautogui.screenshot("my_screenshot.png", region=(100,100,500,500)) # region 为截屏区域,忽略表示截全屏
img = pyautogui.screenshot()
img.save('my_screenshot.png')
(3) 查找图片
coords = pyautogui.locateOnScreen('target_capture.png') # 在当前屏幕中查找指定图片(图片是当前屏幕某个区域的截图)
x, y = pyautogui.center(coords) # 获取定位到的图中间点坐标
x, y = locateCenterOnScreen('target_capture.png') # 返回查找到的截图中心坐标
说明:此方法通常用于定位到控件。
4.2 鼠标控制
(1)获取鼠标位置与移动鼠标
# 获取鼠标位置
x, ypyautogui.position()
# 移动鼠标(x, y 为绝对位置,xOffset, yOffset 为相对偏移量,tween:渐变函数)
pyautogui.moveTo(x=100, y=100, duration=2, tween=pyautogui.linear)
pyautogui.moveRel(xOffset=None, yOffset=10, duration=0.0, tween=pyautogui.linear) # 相对原来的位置移动
(2)点击
# 单击鼠标(x, y 为点击位置,clicks:点击次数,interval:点击间隔,botton:取值有'left', 'middle', 'right',对应鼠标的左、中、右,duration:点击持续时间,tween:渐变函数)
pyautogui.click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0, tween=pyautogui.linear)
pyautogui.click(x, y) # 单击
pyautogui.rightClick(x, y) # 右击
pyautogui.middleClick(x, y) # 中击
pyautogui.doubleClick(x, y) # 双击
(3) 拖拽
# 鼠标拖拽
pyautogui.dragTo(x=427, y=535, duration=3, button='left')
# 鼠标相对拖拽
pyautogui.dragRel(xOffset=100, yOffset=100, duration=3, button='left', mouseDownUp=False)
(4)滚动
pyautogui.scroll(-500) # 向下滚 500 格
4.3 键盘控制
# 输入文本
pyautogui.typewrite(message='Hello world!', interval=0.25)
# 按键
pyautogui.press('esc')
pyautogui.press(['left', 'left', 'left']) # 依次按多个按键
# 组合热键(从左到右依次按下按键,再从右到左依次松开按键)
pyautogui.hotkey('ctrl', 'c')
常用按键说明如下:
ctrl、shift、alt、esc、backspace、win:同键盘
capslock、numlock、scrolllock、insert、delete、home、end、pageup、pagedown、pause、printscreen:同键盘
f1、f2、f3、...、f12:同键盘
enter、return、\n:Enter键
tab、\t:Tab键
up、down、left、right:箭头键
声明:本文转自PC端应用程序自动化测试——pywinauto、pywin32、pyautogui
PC端应用程序自动化测试——pywinauto、pywin32、pyautogui的更多相关文章
- 聊聊 PC 端自动化最佳方案 - Pywinauto
1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...
- 有关线上系统点击没有任何相应得问题思考,主要针对PC端应用程序
1.问题得起因 前段时间,客户得某些机器上,点击应用系统得快捷方式,没有任何响应,不弹出程序主界面,也没有任何得报错提示,甚至程序得错误日志也没有任何输出. 当时,听说发生这种情况得时候,有点懵了,不 ...
- C语言PIC32 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天介绍下我新完成的为 ...
- C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...
- C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC18 Boot ...
- C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 前段时间完成的hype ...
- C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程 ...
- C语言RH850 F1KM serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天我要介绍的RH85 ...
- pywinauto之PC端windows自动化测试
pywinauto是一个用纯Python编写的GUI自动化库,并为Windows GUI精心开发.最简单的是,它允许您将鼠标和键盘操作发送到Windows和Linux上的对话框和控件,而到目前为止,仅 ...
- pc端和android端应用程序测试有什么区别?(ps面试题)
pc端和android端应用程序测试有什么区别?(ps面试题) [VIP7]大连-凭海临风(215687736) 2014/4/10 8:56:171.测试环境不同PC平台一般都是windows an ...
随机推荐
- 【Gerrit】 快捷操作
A:添加Reviewers V+B:Pachset刷到最新 D:Download patch J.K:文件移动选中 R:文件Reviewed状态修改 S:五星状态修改,可用于分类管理 U:返回上层 I ...
- Pickle反序列化学习
什么是Pickle? 很简单,就是一个python的序列化模块,方便对象的传输与存储.但是pickle的灵活度很高,可以通过对opcode的编写来实现代码执行的效果,由此引发一系列的安全问题 Pick ...
- 海思Hi35xx 实现本地和远程升级程序的方法
前言 嵌入式linux设备要进行软件升级有很种多方式方法,总的来说可以分为本地升级和远程升级. 本地升级包括升级工具升级,存储介质升级等,远程升级是指通过网络进行程序升级. 这里介绍一种同时至此本地和 ...
- K8S增加限制后的启动时间验证
K8S增加限制后的启动时间验证 背景 前段时间看了下JVM载linux上面的启动时间, 进行过一些验证. 最近想着能够验证一下K8S上面的启动相关的信息 所以就整理了一下. 虽然没有特别好的结论, 但 ...
- [转帖]shell编程之循环语句
目录 一.循环语句 for循环 for语句的结构 嵌套循环 while语句的结构 while语句应用示例 until语句的结构 until语句示例 二.跳出循环 continue跳出循环 break跳 ...
- [转帖]harbor-db restarting问题
现象: 在安装harbor后,启动时发现harbor-db 一直是restarting,/harbor-jobservice,/harbor-core 这两是starting 状态,如下图 解决: 1 ...
- [转帖]一文带你搞懂xxl-job(分布式任务调度平台)
https://zhuanlan.zhihu.com/p/625060354 前言 本篇文章主要记录项目中遇到的 xxl-job 的实战,希望能通过这篇文章告诉读者们什么是 xxl-job 以及怎么使 ...
- 关于sar的学习
关于sar的学习 背景 公司一套基于某冷门Python架构的系统前几天出现异常卡顿. 当时安装的时候必须使用ubuntu系统. 所以当时默认安装的ubuntu1804, 本来想尝试使用一下sar查看卡 ...
- [转帖]比 Python 快 35000 倍!LLVM&Swift 之父宣布全新编程语言 Mojo:编程被颠覆了
https://www.infoq.cn/article/GFfVLVpkIGOcKYB85Opb "Mojo 可能是近几十年来最大的编程语言进步." 近日,由 LLVM 和 Sw ...
- 多模态 GPT-V 出世!36 种场景分析 ChatGPT Vision 能力,LMM 将全面替代大语言模型?
LMM将会全面替代大语言模型?人工智能新里程碑GPT-V美国预先公测,医疗领域/OCR实践+166页GPT-V试用报告首发解读 ChatGPT Vision,亦被广泛称为GPT-V或GPT-4V,代表 ...