【GUI自动化测试】控件、鼠标键盘操作与多场景自动化

文章目录

  • 一、控件的操作
    • [1.1 点击](#1.1 点击)
      • [1.1.1 click_input()](#1.1.1 click_input())
      • [1.1.2. right_click_input()](#1.1.2. right_click_input())
      • [1.1.3 right_click_input()](#1.1.3 right_click_input())
  • [二、 ⽂本](#二、 ⽂本)
      • [2.1 texts()](#2.1 texts())
      • [2.2 window_text()](#2.2 window_text())
  • 三、⿏标操作
  • 四、键盘操作
      • [4.1 输⼊⽂本](#4.1 输⼊⽂本)
      • [4.2 按键](#4.2 按键)
    • [4.3 自动化测试场景示例:微信发消息](#4.3 自动化测试场景示例:微信发消息)
  • 🚩总结

一、控件的操作

1.1 点击

1.1.1 click_input()

模拟鼠标左键单击操作

使⽤⽰例:

python 复制代码
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window("visible")

#点击最大化按钮
win.child_window(title="最大化", control_type="Button").click_input()

1.1.2. right_click_input()

模拟⿏标右键单击操作

使⽤⽰例:

python 复制代码
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window("visible")

win.right_click_input()

1.1.3 right_click_input()

模拟⿏标右键双击操作

使⽤⽰例:选中

python 复制代码
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")

menu = win["应用程序"]
#双击菜单栏--达到窗口最大化目的
menu.double_click_input()

二、 ⽂本

2.1 texts()

⽤于获取窗⼝或控件中的所有⽂本内容,返回⼀个列表,其中每个元素是⼀个字符串,表⽰窗⼝或控

件中的某个⽂本⽚段

⽰例1:获取窗⼝的标题

python 复制代码
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")

print(win.texts())

打印结果:

⽰例2:获取控件的标题

python 复制代码
# ⽰例2:获取控件的标题
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
print(file.texts())

2.2 window_text()

⽤于获取窗⼝或控件的主⽂本内容,通常是指窗⼝的标题或主要显⽰的⽂本。它返回⼀个字符串。

python 复制代码
from pywinauto import Application

app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")

win = app.window(title_re='.*Sublime Text.*')
win.wait("visible")
file = win.child_window(title="File", control_type="MenuItem")
# print(file.texts())

print(win.window_text())

三、⿏标操作

在使⽤pywinauto进⾏⾃动化测试时,我们通常会利⽤控件的点击⽅法来实现交互操作。这些⽅法不仅⽀持对控件的直接点击,还允许通过指定coords 参数来实现基于坐标的点击操作。

可以结合屏幕坐标系窗口边界来直观理解,示意图如下:

窗口的矩形 (L209, T230, R1430, B1217) 对应以下边界:

复制代码
屏幕顶部(Y=0)
  |
  |          窗口左上角 ➜ (L=209, T=230)
  |            +-----------------------------+
  |            |  窗口内部可操作区域         |
  |            |  (鼠标点击需在此范围内)    |
  |            |                             |
  |            +-----------------------------+
  |                        窗口右下角 ➜ (R=1430, B=1217)
  +----------------------------------------------------> 屏幕右侧(X增大方向)
  (X=0,屏幕最左侧)

例如,当我们尝试通过win.double_click_input(coords=(1043, 300)) 来点击Sublime Text 窗⼝的最⼤化按钮时,虽然语法上没有问题,但这种⽅法可能⽆法完全满⾜我们的需求,尤其是在需要更精确或更灵活的⿏标交互时。

python 复制代码
from pywinauto import Application
import time

# 启动Sublime Text
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")
time.sleep(3)  # 等待应用完全启动

# 定位窗口并等待可见
win = app.window(title_re=".*Sublime Text.*")
win.wait("visible", timeout=20)

# 打印窗口范围(确认有效区域)
print("窗口有效范围:", win.rectangle())  # 输出 (L209, T230, R1430, B1217)

# 修改坐标至窗口内的菜单栏位置(以"File"菜单为例,视觉反馈明显)
# X: 1043(在209-1430之间),Y: 300(在230-1217之间,对应菜单栏高度)
click_coords = (1043, 300)

# 提示即将执行操作
print(f"即将双击坐标:{click_coords}(窗口内有效区域)")

# 执行双击(点击"File"菜单,会弹出下拉菜单,效果明显)
win.double_click_input(coords=click_coords)

# 停留几秒,让用户看清效果
time.sleep(5)

⽰例:拖动滚动条

rectangle() :获取元素对应坐标,返回矩形尺⼨,具有top,left,right,bottom属性

mid_point():获取元素中间位置坐标,返回类型为元组,元组中两个整数分别是X、Y轴的值

mouse 模块常⻅操作:

python 复制代码
from pywinauto import Application
# app = Application(backend=' uia ' ) .start ( "mspaint.exe")app = Application(backend='uia ' ).connect(process=8572)win = app.window(title="无标题-画图")
win.wait( 'visible ' )
#定位滚动条
right_ScrollBar = win.child_window(title="垂直滚动条",
auto_id="NonclientVerticalScrollBar" ,control_type="ScrollBar")right_ScrollBar.wait( ' visible ' )
#获取滚动条中间位置
mid = right_scrollBar.rectangle( ).mid_point()#从中间位置下拉
mouse.scroll(coords=(mid.x , mid.y) , wheel_dist=500)
python 复制代码
from pywinauto import Application, mouse
import time

# 1. 启动Sublime(路径确认对的话不用改)
app = Application(backend="uia").start(r"D:\sublime_text\Sublime Text\sublime_text.exe")  # 先换win32 backend试试
time.sleep(5)  # 先等5秒,给足启动时间(比默认10秒更灵活)

# 2. 定位窗口:用"模糊匹配标题"(不管是3/4版本都能找到),延长超时到20秒
# title_re=".*Sublime Text.*" 表示"标题包含[Sublime Text]的所有窗口"
win = app.window(title_re=".*Sublime Text.*")
win.wait('visible', timeout=20)  # 等20秒,确保窗口显示

# (可选)调试:打印找到的窗口实际标题,确认没找错
# print("实际找到的窗口标题:", win.text())

try:
    while True:
        # 计算窗口中间点(确保滚动作用在Sublime窗口上)
        win_rect = win.rectangle()
        mid = win_rect.mid_point()

        # 向下滚动(wheel_dist=5,幅度小更易观察,比100合适)
        mouse.scroll(coords=(mid.x, mid.y), wheel_dist=5)
        time.sleep(3)

        # 向上滚动
        mouse.scroll(coords=(mid.x, mid.y), wheel_dist=-5)
        time.sleep(3)
except KeyboardInterrupt:
    print("程序已停止")

mouse 模块常⻅操作:

方法 功能描述
mouse.click(button='left', coords=(0, 0)) 单击指定的坐标
mouse.scroll(coords=(0, 0), wheel_dist=1) 滚动鼠标滚轮,wheel_dist表示滚动的距离,大于0是向上滚动,小于0是向下滑动。
mouse.double_click(button='left', coords=(0, 0)) 双击指定的坐标
mouse.right_click(coords=(0, 0)) 右键单击指定的坐标
mouse.move(coords=(0, 0)) 移动鼠标到指定坐标
mouse.wheel_click(coords=(0, 0)) 鼠标中键单击指定的坐标
mouse.press(button='left', coords=(0, 0)) 按下鼠标按钮
mouse.release(button='left', coords=(0, 0)) 释放鼠标按钮

⾃动化测试场景⽰例:抖⾳点赞

抖⾳客户端的定位某个空间层次太深,不好使用UISpy定位

python 复制代码
from pywinauto import Application, mouse
import time

try:
    # 连接到已运行的抖音进程(替换为实际PID)
    app = Application(backend="uia").connect(process=14488)
    win = app["抖音"]
    win.wait("visible", timeout=20)  # 等待窗口可见
    win.set_focus()  # 激活抖音窗口,确保操作生效

    # 循环3次:双击点赞 + 滑动到下一个视频
    for i in range(3):
        print(f"正在执行第 {i+1} 次操作...")
        
        # 获取窗口中心坐标(用于双击点赞和滚动)
        mid = win.rectangle().mid_point()
        
        # 1. 双击点赞(窗口中心区域,抖音双击屏幕可点赞)
        mouse.double_click(coords=(mid.x, mid.y))
        print("已执行双击点赞")
        time.sleep(1)  # 等待点赞动画完成
        
        # 2. 滑动到下一个视频(鼠标滚轮向下滚动,wheel_dist正数为向下)
        mouse.scroll(coords=(mid.x, mid.y), wheel_dist=500)
        print("已滑动到下一个视频")
        time.sleep(2)  # 等待视频加载完成

    print("所有操作执行完毕!")

except Exception as e:
    print(f"操作过程中出现错误:{e}")

四、键盘操作

在自动化测试中,pywinauto提供了强大的键盘操作功能,其中keyboard模块是核心组件之一。keyboard.send_keys()是一个通用的键盘输入方法,它可以直接将按键序列发送到当前具有焦点的窗口。然而,在实际的自动化场景中,我们通常需要针对特定的控件(如文本框、按钮等)进行精确的输入操作,而不是依赖于窗口的焦点状态。

为了满足这种需求,pywinauto对键盘输入功能进行了进一步的封装,引入了type_keys方法。type_keys是控件对象(例如Edit控件或Button控件)的专属方法,可以直接作用于指定的控件,确保输入内容精准无误。这种方法避免了因焦点切换导致的输入错误,特别适合在复杂的用户界面中进行自动化操作

语法:

python 复制代码
type_keys(
keys,#要输入的键序列,可以是普通字符、特殊键或组合键
pause = None,#每次按键后的延迟时间(秒)
with_spaces = False,#如果为True,则会在输入的字符串中保留空格。
with_newlines = False,#如果为True,则会在输入的字符串中保留换行符。

向当前焦点窗⼝⾃动键⼊键或发送⽂本。

4.1 输⼊⽂本

直接输入文本(支持Unicode 字符):

python 复制代码
from pywinauto import Application
app = Application(backend='uia ' ).connect(process=32936)win = app.window(title_re=' .*Sublime Text.* ')
win.wait( "visible")#输入文本内容
win.123("------type_keys------")#保留换行符
win.type_keys ( "------type_keys------\n",with_newlines=True)#保留空格
win.type_keys( " -----type keys----",with_spaces=True)#延迟输入,避免输入过快导致内容不完整
win.type_keys("一二三四五六七" , with_spaces=True)

4.2 按键

使用{VK_CoDE}格式表示虚拟键码,例如:

按键 代码
Enter {ENTER}
Tab {TAB}
Backspace {BACKSPACE}
Esc {ESC}
方向键 {UP}, {DOWN}, {LEFT}, {RIGHT}
F1-F9 {F1} - {F9}
Shift +
Ctrl ^
Alt %
python 复制代码
from pywinauto import Application
app = Application(backend='uia ' ).connect(process=32936)win = app.window(title_re=' .*Sublime Text.* ')
win.wait( "visible")#发送文本和回车
win.type_keys( "Hello world{ENTER} " , with_spaces=True)win.type_keys( "Hello bit" , with_spaces=True)

指定重复次数

  • 指定重复次数
    可以为特殊键指定重复计数。 {ENTER 2} 表示按两次Enter键

代码块

python 复制代码
# 发送文本和回车
win.type_keys("Hello World{ENTER 2}", with_spaces=True)
win.type_keys("Hello bit", with_spaces=True)
  • 转义特殊字符
    使用 {} 包裹特殊字符(如 {+}{%}{^})以避免被识别为修饰符

代码块

python 复制代码
win.type_keys("1+2=3")        # 错误: `+` 会被识别为 Shift
win.type_keys("1{+}2=3")      # 正确

4.3 自动化测试场景示例:微信发消息

1)⽤例设计

GUI⾃动化⽤例的设计主要基于UI(界⾯)测试和界⾯展⽰的功能来进⾏⽤例的设计。

python 复制代码
app = Application(backend="uia").connect(process=12275)
win = app.window(title="文件传输助手", handle=233444)
win.wait("visible")

# 找到输入控件
edit = win.child_window(title="输入", control_type="Edit")
edit.wait("ready")

# 点击消息框
edit.click_input()

# 输入文本信息
edit.type_keys("你在用Pywinauto吗")

# 点击发送
win.child_window(title="发送(S)", control_type="Button").click_input()

# 检查发送结果
win.child_window(title="猫", control_type="ListItem").texts()

2)代码实现

以⽤例"验证⽤⼾输⼊⽂本后点击发送按钮,消息是否能成功发送并显⽰在聊天窗⼝中"为例

python 复制代码
# 连接到微信进程(请替换为实际的process值)
app = Application(backend="uia").connect(process=11111)
# 定位文件传输助手窗口(确保title正确)
win = app.window(title="文件传输助手", handle=233444)
win.wait("visible")

# 找到输入框控件
edit = win.child_window(title="输入", control_type="Edit")
edit.wait("ready")
edit.click_input()  # 点击输入框激活

# 准备一组有趣的消息
funny_messages = [
    "报告传输助手!今天发现一只会打字的猫🐱 它说想加你好友",
    "刚学会一个魔术------你看这条消息,3秒后会变成彩虹色🌈(骗你的哈哈)",
    "警告⚠️ 你的聊天框即将被可爱能量淹没------接收完毕!",
    "猜猜我今天吃了什么?答案是:你打不开的神秘外卖🥡",
    "系统提示:这条消息需要你笑一下才能显示完整😊 好了现在你可以看了~"
]

# 循环发送消息,增加互动感
for i, msg in enumerate(funny_messages):
    edit.type_keys(msg)  # 输入消息
    time.sleep(1)  # 假装在思考
    # 点击发送按钮
    win.child_window(title="发送(S)", control_type="Button").click_input()
    print(f"已发送第{i + 1}条趣闻")
    time.sleep(2)  # 模拟聊天间隔

# 最后来个互动提问
edit.type_keys("你觉得哪条最有趣?悄悄告诉我~")
win.child_window(title="发送(S)", control_type="Button").click_input()
print("所有消息发送完毕,等待回复中...")

🚩总结

相关推荐
YJlio1 小时前
《Sysinternals实战指南》16.5 Ctrl2Cap 工具详解:把 Caps Lock 变成 Ctrl 的键盘改造与回退方法
linux·运维·服务器·网络·python·学习·计算机外设
某林2121 小时前
从底层硬件死锁到 QoS 通信底层的全链路复盘
python·ros2·qos
Jutick1 小时前
WebSocket 连接没断,行情却停了:如何给实时数据流加双层 watchdog?
python
石头城的小石头1 小时前
【从0到1的鼠标位置显示记录器,基于python环境pycharm下编译实施,最终打包为exe,欢迎交流】
python·目标跟踪·pycharm·计算机外设·鼠标
用户8356290780511 小时前
Python 操作 Word 修订跟踪(Track Changes)
后端·python
花北城1 小时前
【C#】ABP框架服务端开发
开发语言·c#·abp
电商API_180079052471 小时前
Python 实现闲鱼商品列表批量采集,接口异常重试机制搭建
大数据·开发语言·数据库·爬虫·python
DogDaoDao1 小时前
深入理解 Qt:从原理到实战的全景指南
开发语言·qt·程序员
放下华子我只抽RuiKe51 小时前
FastAPI 全栈后端(四):认证与授权
开发语言·前端·javascript·python·深度学习·react.js·fastapi