您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Gui桌面应用测试,没有比这更简单上手的工具了

时间:2020-07-12 11:41:34  来源:  作者:

有个朋友最近问我有没有推荐 GUI 桌面应用自动化的技术,我只能回答他:

不好意思,这个真有,他是pyautogui。

主要有三大特征:

◆ 纯纯的 Python, 源码一览无余;

◆ 跨平台,linux, windows, mac 他都能上;

◆ 操作简单,会代码就能上手。

Gui桌面应用测试,没有比这更简单上手的工具了

 

一、WeB自动化文件上传,不要太简单

熟悉web自动化测试的大佬应该都懂,当采用js调用原生控件进行文件上传的时候,最常用的是使用 pywin32 等系统交互库。

Gui桌面应用测试,没有比这更简单上手的工具了

 

当看到pywin32那丑陋的api封装只能爆粗口。

就为了输入一个文件地址,需要整这么多莫名其妙的代码(看不懂没关系,只需要看代码行数就够了):

Gui桌面应用测试,没有比这更简单上手的工具了

 

我们来看看使用 pyautogui 多么简单:

#输入文件名
pyautogui.write(r'd:demo.txt')
# 回车
pyautogui.press('enter', presses=2)

二、跨平台的使用和安装

上面的代码在mac ,linux和windows上是通用的,只是在mac和linux下需要安装额外的依赖。

windows安装不需要其他依赖,直接使用了python自带的ctypes模块:

pip install pyautogui

mac安装需要PyObjC模块:

pip3 install pyobjc-core
pip3 install pyobjc
pip3 install pyautogui

linux需要依赖python3-Xlib或者python-xlib(python2):

pip3 install python3-xlib
pip3 install pyautogui

linux如果没有安装相关python库可能会报错。

Debian系发行版(其他发行版自行了解)你可能需要输入:

sudo apt-get install scrot
sudo apt-get install python3-tk
sudo apt-get install python3-dev

三、基于坐标和图像的设计哲学

pyautogui并不需要去解析各平台的控件结构,他的元素定位都是基于坐标的。

所以不论你是通过手工截图测量,还是通过自动化工具获取,只要你能拿到坐标,你就能进行元素操作。


鼠标操作

1、获取坐标

import pyautogui as ui
# 获取屏幕大小
size = ui.size()
# 获取现在鼠标位置
p = ui.position()
# 坐标是否超出屏幕范围
if_on = ui.onScreen(*p)

2、鼠标移动

ui.moveTo(x/2, y/2, duration=2, tween=easeInCirc)

参数说明:

◆ x, y 坐标

◆ duration 持续秒数,默认是瞬间完成

◆ tween 特效,一般没什么用

3、鼠标拖拽, 移动到指定的坐标

ui.dragTo(500, 500)

4、百发百中的射箭游戏

import random
import time
import pyautogui as ui

x, y = ui.position()
target = (800, 800)

for i in range(10):
 rand_x = random.randint(0, x)
 rand_y = random.randint(0, y)
 # 随机生成位置
 print(rand_x, rand_y)
 ui.moveTo(rand_x, rand_y)
 # 移动到目标位置
 ui.dragTo(target, duration=0.2)
 time.sleep(1)

效果:

Gui桌面应用测试,没有比这更简单上手的工具了

 

5、相对移动

ui.move(-500, duration=1)
ui.move(yOffset=-400, duration=1)
ui.move(500, duration=1)
ui.move(yOffset=400, duration=1)

相对移动的小游戏:

start = 20
add_point = 10
duration = 0.5
for i in range(10):
 if i % 2 == 0:
 ui.drag(start, duration=duration)
 ui.drag(yOffset=start, duration=duration)
 else:
 ui.drag(-start, duration=duration)
 ui.drag(yOffset=-start, duration=duration)
 start += add_point

效果:

Gui桌面应用测试,没有比这更简单上手的工具了

 


6、点击

ui.click(x=None,
 y=None,
 clicks=1, # 点击次数
 interval=0.0, # 间隔时间
 button='right', # 右键
 duration=0.0) # 持续时间

通过click进一步封装了leftClick,rightClick,middleClick,doubleClicktripleClick

7、scroll

窗口滚动,但是封装的滚动感觉比较鸡肋,他是以鼠标点击次数为单位的,所以不知道会滚动到什么位置。

pyautogui.scroll(10) # 向上滚动 10 个 clicks
>>> pyautogui.scroll(-10) # # 向下滚动 10 个 clicks
>>> pyautogui.scroll(10, x=100, y=100) # 移动到位置再滚动

使用drag和dragTo会更加方便一点,还是以坐标为依据,通过操作鼠标中键来实现窗口滚动。

比如这个例子是scroll和drag的对比:

x, y = ui.size()
ui.scroll(-100)
time.sleep(1)
ui.scroll(100)
time.sleep(1)
ui.dragTo(y=y, button='middle') # 滚动到窗口底部

效果:

Gui桌面应用测试,没有比这更简单上手的工具了

 

键盘操作

1、输入框输入

# 输入yuz, 每个字母时间间隔 0.2 s
pyautogui.write("yuz",interval=0.2)

注意:pyautogui 并不支持输入框自动聚焦,所有输入之前先要点击输入框位置。

2、按下键盘 press

press('enter', presses=1, interval=0.0)

相当于鼠标操作的 click, 可以输入键盘上的按键, 比如 shift 键,enter 键。

所有的按键可以查看源码当中的 KEYBOARD_KEYS 或者 KEY_NAMES。

参数:

◆ presses, 操作按键次数

◆ interval, 每次按键的间隔时间

所有按键列表:

Gui桌面应用测试,没有比这更简单上手的工具了

 

3、热键 hotkey

ui.hotkey('ctrl', 'shift', 'esc')

4、keyUp, keyDown

这是press的分解动作,相当于鼠标的mouseUp和mouseDown。

上面热键的操作方式可以分解成:

ui.keyDown('ctrl') # 按下 ctrl
ui.keyDown('shift') # 按下 shift
ui.keyDown('esc') # 按下 esc
ui.keyUp('esc') # 释放 ctrl
ui.keyUp('shift') # 释放 shift
ui.keyUp('ctrl') # 释放 esc

图像识别

坐标定位这种方式为通用性打下了基础,让pyautogui可以轻松做到跨平台。

但是实际操作过程中很难清除的知道某个要操作的控件的确切位置,因为每次打开相同的页面都有可能是变动的。

pyautogui 给出的解决方案非常简单粗暴,使用图像识别,返回在屏幕中的坐标位置,在通过坐标进行处理。

1、locateCenterOnScreen

返回被识别图像的中心坐标。

参数说明:

◆ 必传参数,图片路径;

◆ confidence, 识别精度,需要安装 opencv 才能使用;

◆ grayscale, 灰度级别,能够提升识别速度

locateCenterOnScreen('img/seven.png', confidence=0.7, grayscale=True)

现阶段图像识别的结果并不理想,基于图像识别的使用还存在以下问题:

◆ 识别不到指定元素;

◆ 识别精度不够;

◆ 查找速度比较慢

◆ 需要用到重型的opencv库, 或许可以尝试换用其他库。

◆ 需要提前准备被识别的图片,如果操作元素多,手动处理素材会怀疑人生。

所以uiautogui适合的场景是跨平台的少量原生控件交互,如果要对原生应用控件大量操作,还是换用其他工具比较合适。

基于图像识别的具体例子:

import time
import pyautogui as ui

time.sleep(3)

seven = ui.locateCenterOnScreen('img/seven.png', confidence=0.7, grayscale=True)
mult = ui.locateCenterOnScreen('img/multipy.png', confidence=0.7, grayscale=True)
two = ui.locateCenterOnScreen('img/two.png', confidence=0.7, grayscale=True)
equal = ui.locateCenterOnScreen('img/equal.png', confidence=0.7, grayscale=True)

ui.click(*seven)
ui.click(*mult)
ui.click(*two)
ui.click(*equal)

效果:

Gui桌面应用测试,没有比这更简单上手的工具了

 

4、后期可以期待的

pyautogui现阶段最欠缺的是无法获取窗口。

但是可以通过PyGetWindow等工具进行集成。

你可以通过官网roadmap和常见问答查看今后的发展路径。

本文由柠檬班雨泽老师原创,转载需注明出处!



Tags:Gui桌面应用   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
有个朋友最近问我有没有推荐 GUI 桌面应用自动化的技术,我只能回答他:不好意思,这个真有,他是pyautogui。主要有三大特征:◆ 纯纯的 python, 源码一览无余;◆ 跨平台,linux, window...【详细内容】
2020-07-12  Tags: Gui桌面应用  点击:(62)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条