python 利用PyAutoGUI快速构建自动化操作脚本


Posted in Python onMay 31, 2021

一、背景

大家好,我是安果!

我们经常遇到需要进行大量重复操作的时候,比如:网页上填表,对 web 版本 OA 进行操作,自动化测试或者给新系统首次添加数据等

这些操作的特点往往是:数据同构,大多是已经有了的结构化数据;操作比较呆板,都是同一个流程的点击、输入;数据量大,极大消耗操作人精力

那么能不能自动化呢?

二、自动化的方案

如果你在 web 上进行操作, Python 的 Selenium 可以满足要求。如果需要对 GUI 界面进行操作,你恐怕得试验下“按键精灵”能不能满足要求。对新系统添加初始数据,SQL 导出导入是最高效的方式,不过可能需要进行一些较复杂的处理。

曾经多次遇到要求一条条手动输入旧数据的系统升级活动。

但以上都存在一些问题, Selenium 比较复杂,按键精灵功能上不太完善, SQL 需要一定的知识基础

这里推荐一个更好的解决方案:PyAutoGUI 

其实 PyAutoGUI 最主要好处就是比较简单,应急使用的话可以很快构建一个可用的自动化操作脚本。毕竟,数据处理任务本来就比较急迫,没有时间使用复杂知识,来构建一个完善的脚本

三、思路和知识点

现在来说一下基本思路与相关知识点

  • PyAutoGUI 就是模拟键盘、鼠标在界面上进行操作。
  • 这里只使用它的 click 功能来模拟鼠标点击。
  • 为了获取需要点击的位置,设计了一个鼠标坐标获取的程序。
  • ASCII 码的输入比较简单。再解决汉字输入问题,就使得系统基本可用了。

本文以在 web 界面批量新增数据记录为例,讲解如何自动化操作。这个例子只是演示之用,非常简单,大家自行理解、迁移。

python 利用PyAutoGUI快速构建自动化操作脚本

四、操作步骤

4.1 初识 PyAutoGUI

简单地说, PyAutoGUI 就是模拟键盘、鼠标在界面上进行操作的包。安装时直接使用如下语句:pip install pyautogui即可。

编写一个简单的测试程序:

import pyautogui as pag

pag.PAUSE = 1.5
pag.click(63,191) 

以上程序导入库,定义了每步骤的暂停时间 1.5 秒(用来留给操作时间),然后在屏幕左起 63 像素,上起 191 像素这个点上点击了鼠标。

4.2 坐标系

PyAutoGUI 默认的坐标系从屏幕左上角开始,x 轴向右增大,y 轴向下增大。所以显示器上每个点都有自己的位置。

引申一下,当知道界面上每个按钮的位置时,点击这些点,就是执行相应的操作了。

当然,这一切的前提是界面不变。大多数应用的界面、按钮位置不会变来变去。如果你有这方面需求,可以参考下 locateOnScreen() 函数。这个函数根据你提供的图片,在屏幕上找到像素匹配的地方。这样就不怕按钮动来动去了。

为了获取屏幕的坐标系,写了一个简单的程序,用来获取鼠标在屏幕上的坐标。大家可以自行下载运行。

import pyautogui as pag 
import os 

try:
    while True:
        os.system('cls')
        a = '%4d,%4d'%pag.position()
        print(a)
except Exception as e:
    print(e) 

运行以上程序,移动鼠标到各个按钮上,就可以看到相应的坐标。

python 利用PyAutoGUI快速构建自动化操作脚本

4.3 点击

PyAutoGUI 的点击很简单:

pyautogui.click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0)

其中x,y是坐标,clicks 是点击次数,interval 是点击间隔,button 指代三个鼠标按钮的哪一个,duiation 是点击之间的间隔。

写如下程序,来进行任务、时间和新建按钮之间的跳转。

pag.click(63,191)
pag.click(328,191)
pag.click(384,461)
pag.click(374,191)

4.4 输入

输入 ASCII 字符和键盘击键、热键分别如下:

  • 输入 ASCII 字符串是typewrite(message='test message.',interval=0.5)
  • 退出键是press('esc')
  • 按下是KeyDown('ctrl')
  • 松开是KeyUp('ctrl')
  • 组合键是hotkey('ctrl','v')。

至于汉字,稍微复杂点。

4.5 汉字输入

涉及汉字,无法用 ASCII 方案解决,需要导入包 pyperclip ,这个包封装了系统剪贴板,大家知道怎么回事了吧。

import pyperclip 

#以下读入内容,就是把内容存入剪贴板。
pyperclip.copy('需要输入的汉字')
#以下输出内容,就是粘贴。
pag.hotkey('ctrl','v')

其实就是用 pyperclip 模拟拷贝,用热键 Ctrl+v 粘贴,实现了非 ASCII 字符的输入。

4.6 集成起来

下面,把整个程序集成起来看:

import pyautogui as pag
import pyperclip

pag.PAUSE = 1.5
pag.FAILSAFE = True

to = ['测试任务1','测试任务2','测试任务3','测试任务4','测试任务5',\
      '测试任务6','测试任务7','测试任务8','测试任务9','测试任务10']

for t in to:
    pag.click(63,191)
    pyperclip.copy(t)
    pag.hotkey('ctrl','v')
    pag.click(328,191)
    pag.click(384,461)
    pag.click(374,191)

以上程序,根据 to 列表内容,把操作分解为点击和粘贴,实现了自动化操作的目的。大部分编码都很好理解,能跟鼠标操作一一对应起来。可能存在难度的是数据源的问题,总不能把所有数据都写入程序吧?

五、数据源

相较于复杂的现实数据源,最好的方式就是把数据转成 csv 文件。这样许多 Excel 都可以另存成这个文件,其本身又是基于文本的,可读可写,比较方便。其他诸如 SQL 数据库、 XML 数据也可以导出转换为 csv 文件。

假设现在有了 csv 格式数据源 data.csv ,需要这样操作。

to = []

with open('data.csv')as f:
    lines = f.readlines()

for line in lines:
    to.append(tuple(line.split(',')))

以上代码比较简单,把 csv 中存成的数据存储到 to 这个数组里,每行数据都是一个元组,调用的时候,如4.6部分代码所示,使用 for 循环加上元组下标即可。

六、总结

本文使用 PyAutoGUI 包,对各种鼠标点击、输入之类的机械重复操作进行自动执行,可大幅提高工作效率。这里只使用了 click 功能和 pyperclip 包的 copy 功能。主要是为了简化编程,让大家在紧张和繁琐的操作中,快速编写一个自动化执行的小脚本。

以上就是python 利用PyAutoGUI快速构建自动化操作脚本的详细内容,更多关于python 用PyAutoGUI构建自动化操作脚本的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中实现对list做减法操作介绍
Jan 09 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
Python机器学习之SVM支持向量机
Dec 27 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
python实现词法分析器
Jan 31 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
对Python 简单串口收发GUI界面的实例详解
Jun 12 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
pandas中DataFrame数据合并连接(merge、join、concat)
Pandas加速代码之避免使用for循环
pandas提升计算效率的一些方法汇总
May 30 #Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
You might like
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP完整的日历类(CLASS)
2006/11/27 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
关于laravel 日志写入失败问题汇总
2019/10/17 PHP
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
浅谈vue的踩坑路
2017/08/31 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
[01:50]2014DOTA2西雅图邀请赛 专访欢乐周宝龙
2014/07/08 DOTA
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python实现批量修改文件名实例
2015/07/08 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
消防战士优秀事迹材料
2014/02/13 职场文书
企业后勤岗位职责
2014/02/28 职场文书
高中升旗仪式演讲稿
2014/09/09 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
房产遗嘱范本
2015/08/06 职场文书
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
Redis基本数据类型Set常用操作命令
2022/06/01 Redis