有个朋友最近问我有没有推荐 GUI 桌面应用自动化的技术,我只能回答他:不好意思,这个真有,他是 pyautogui。主要有三大特征:
熟悉 web 自动化测试的大佬应该都懂,当采用 js 调用原生控件进行文件上传的时候,最常用的是使用 pywin32 等系统交互库。
当看到 pywin32 那丑陋的 api 封装只能爆粗口。就为了输入一个文件地址,需要整这么多莫名其妙的代码(看不懂没关系,只需要看代码行数就够了):
我们来看看使用 pyautogui 多么简单:
上面的代码在 mac ,linux 和 windows 上是通用的,只是在 mac 和 linux 下需要安装额外的依赖。
windows 安装不需要其他依赖,直接使用了 python 自带的 ctypes 模块:
mac 安装需要 PyObjC 模块:
linux 需要依赖 python3-Xlib 或者 python-xlib(python2):
linux 如果没有安装相关 python 库可能会报错。 Debian 系发行版(其他发行版自行了解)你可能需要输入:
pyautogui 并不需要去解析各平台的控件结构,他的元素定位都是基于坐标的。所以不论你是通过手工截图测量,还是通过自动化工具获取,只要你能拿到坐标,你就能进行元素操作。
1,获取坐标
2, 鼠标移动
参数说明:
3, 鼠标拖拽, 移动到指定的坐标
4, 百发百中的射箭游戏
效果:
5, 相对移动
相对移动的小游戏:
效果:
6,点击
通过 click 进一步封装了 leftClick, rightClick, middleClick, doubleClick, tripleClick
7, scroll
窗口滚动,但是封装的滚动感觉比较鸡肋,他是以鼠标点击次数为单位的,所以不知道会滚动到什么位置。
使用 drag 和 dragTo 会更加方便一点,还是以坐标为依据,通过操作鼠标中键来实现窗口滚动,比如这个例子是 scroll 和 drag 的对比:
效果:
1, 输入框输入
注意:pyautogui 并不支持输入框自动聚焦,所有输入之前先要点击输入框位置。
2,按下键盘 press
相当于鼠标操作的 click, 可以输入键盘上的按键, 比如 shift 键,enter 键。所有的按键可以查看源码当中的 KEYBOARD_KEYS 或者 KEY_NAMES。
参数:
所有按键列表:
3, 热键 hotkey
4, keyUp, keyDown
这是 press 的分解动作,相当于鼠标的 mouseUp 和 mouseDown。上面热键的操作方式可以分解成:
坐标定位这种方式为通用性打下了基础,让 pyautogui 可以轻松做到跨平台。但是实际操作过程中很难清除的知道某个要操作的控件的确切位置,因为每次打开相同的页面都有可能是变动的。pyautogui 给出的解决方案非常简单粗暴,使用图像识别,返回在屏幕中的坐标位置,在通过坐标进行处理。
1,locateCenterOnScreen
返回被识别图像的中心坐标。参数说明:
现阶段图像识别的结果并不理想,基于图像识别的使用还存在以下问题:
识别不到指定元素;
识别精度不够;
查找速度比较慢
需要用到重型的 opencv 库, 或许可以尝试换用其他库。
需要提前准备被识别的图片,如果操作元素多,手动处理素材会怀疑人生。
所以 uiautogui 适合的场景是跨平台的少量原生控件交互,如果要对原生应用控件大量操作,还是换用其他工具比较合适。
基于图像识别的具体例子:
效果:
pyautogui 现阶段最欠缺的是无法获取窗口。但是可以通过 PyGetWindow 等工具进行集成。你可以通过官网 roadmap 和 常见问答 查看今后的发展路径。
原文:https://www.cnblogs.com/momoon/p/12204960.html