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的更多相关文章

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

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

  2. 有关线上系统点击没有任何相应得问题思考,主要针对PC端应用程序

    1.问题得起因 前段时间,客户得某些机器上,点击应用系统得快捷方式,没有任何响应,不弹出程序主界面,也没有任何得报错提示,甚至程序得错误日志也没有任何输出. 当时,听说发生这种情况得时候,有点懵了,不 ...

  3. C语言PIC32 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天介绍下我新完成的为 ...

  4. C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...

  5. C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC18 Boot ...

  6. C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 前段时间完成的hype ...

  7. C语言RH850 F1L serial bootloader和C#语言bootloader PC端串口通信程序

                   了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程 ...

  8. C语言RH850 F1KM serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 今天我要介绍的RH85 ...

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

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

  10. pc端和android端应用程序测试有什么区别?(ps面试题)

    pc端和android端应用程序测试有什么区别?(ps面试题) [VIP7]大连-凭海临风(215687736) 2014/4/10 8:56:171.测试环境不同PC平台一般都是windows an ...

随机推荐

  1. JMS 服务器健康检查

    JMS所有服务器程序,包括Gateway.GatewayReferee.Proxy.TokenServer.以及编写的微服务器,都支持使用第三方工具进行健康检查. 使用telnet 进行健康检查 向任 ...

  2. 多种数据库获取最近一天记录的SQL整理

    多种数据库获取最近一天记录的SQL整理 背景 纯粹当笔记. 数据库种类太多,记不住,每次都需要现查,效率实在是太低了 将获取最近一天记录的SQL整理好 方便后续直接his用 简单总结 Oracle + ...

  3. [转帖]RabbitMQ学习笔记:内置Prometheus支持rabbit_prometheus插件

    从3.8.0开始,RabbitMQ提供内置的Prometheus和Grafana支持. rabbitmq_prometheus插件中提供了对Prometheus指标收集的支持.该插件以Promethe ...

  4. [转帖]Python基础之文件处理(二)

    https://www.jianshu.com/p/7dd08066f499 Python基础文件处理 python系列文档都是基于python3 一.字符编码 在python2默认编码是ASCII, ...

  5. [转帖]Centos7 nginx访问日志文件割接

    一.yum安装nginx 二.各文件路径( /etc/nginx/nginx.conf) 1.访问日志路径:access_log /var/log/nginx/access.log main; 2.p ...

  6. [转帖]关于Nacos默认token.secret.key及server.identity风险说明及解决方案公告

    https://nacos.io/zh-cn/blog/announcement-token-secret-key.html 近期Nacos社区收到关于Nacos鉴权功能通过token.secret. ...

  7. Linux的free命令与OOM的简单总结

    简介 查看操作系统配置最关键的几个命令是 lscpu 查看CPU信息 以及free 查看内存信息. 不过free信息有一个疑惑点 他的 free的值可能很小. 会让搭建产生误解. 这里简单说明一下. ...

  8. vim 复制代码的方法

    之前vim 复制代码 总是格式变错乱了 尤其是yaml文件 有的还带注释 非常痛苦 今天早上查了下 原来处理的方式非常简单  增加一个参数就可以了 方法为 1. vim 打开一个文件 2.输入 :se ...

  9. 强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C、与生成对抗网络的联系等详解

    强化学习从基础到进阶-常见问题和面试必知必答[6]:演员-评论员算法(advantage actor-critic,A2C),异步A2C.与生成对抗网络的联系等详解 1.核心词汇 优势演员-评论员(a ...

  10. 知识图谱项目实战(一):瑞金医院MMC人工智能辅助构建知识图谱--初赛实体识别【1】

    1.技术背景&赛题介绍: A Labeled Chinese Dataset for Diabetes中文糖尿病标注数据集详情请见. 数据集链接:瑞金医院MMC人工智能辅助构建知识数据源:知识 ...