看到这个库的时候,单单从名字就感觉到两个字“简单”,特别容易理解它是用来做什么的,深入了解之后感觉的还是两个字“简单”。这对自动化测试来说便是一个天大的乐事,因为很多工具庞大复杂,仅仅是写一个hello world需要的环境,需要了解的东西比c++,java还难。

PyAutoGUI作为GUI自动化神器,简单高效、函数分类清晰,它被awesome-pythonawesome-python-cn收录

现在我就带你们走进PyAutoGUI~

1. PyAutoGui是什么?

  • PyAutoGui是一个跨平台GUI自动化库。
  • PyAutoGUI是一个Python模块,用于以编程方式控制鼠标和键盘。
  • PyAutoGUI 可实现控制鼠标、键盘、消息框、截图、定位等功能
  • PyAutoGUI 上能挂机刷宝箱,下能自动写文档

2. PyPutoGUI下载与安装

2.1. 安装python3

https://www.python.org/downloads/

2.2. 安装PyAutoGUI

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyautogui

可以从pip工具安装或从PyPI下载:

https://pypi.python.org/pypi/PyAutoGUI

PyAutoGUI依赖于pyscreezepymsgboxpytweening,上述命令会自动安装这3个库。安装完成后可以发现,在site-packages\pyautogui有6个文件,名字带java、osx、win、x11的是在不同平台的实现方案,再在__init__.py__main__.py中检测当前系统平台进行封装。其中,java平台的实现文件为空,猜测是未来计划支持的,先占个坑。

__init__.py
__main__.py
_pyautogui_java.py  # 空文件,猜测是未来支持
_pyautogui_osx.py
_pyautogui_win.py
_pyautogui_x11.py

3. 源代码下载

https://github.com/asweigart/pyautogui

4. 实战示例

PyAutoGUI设计简洁,相关符号经过内部import之后,被封装在pyautogui单个模块中,因此Python程序中只要import pyautogui之后便可通过.符号访问pyautogui中的函数、变量。pyautogui中函数大致分为通用功能、鼠标控制、键盘控制、消息窗口、截图5大类。 

4.1 通用功能

pyautogui.FAILSAFE = True  
# 启用自动防故障功能,左上角的坐标为(0,0),将鼠标移到屏幕的左上角,来抛出failSafeException异常 

pyautogui.PAUSE = 1  
# 调用在执行动作后暂停的秒数,只能在执行一些pyautogui动作后才能使用,建议用time.sleep 

pyautogui.size()  # 获取屏幕尺寸(分辨率×分辨率)
pyautogui.position() # 获取鼠标当前位置
pyautogui.onScreen(100,200) # 判断坐标是否在屏幕范围内
import pyautogui, sys


# 获取本机分辨率
print("本台计算机分辨率为:",pyautogui.size(),type(pyautogui.size()))   
 
# 获取当前鼠标位置
x, y = pyautogui.position()
print("目前光标的位置:",pyautogui.position(),type(pyautogui.position()))     
 
# 检查XY是否在允许的分辨率内
print(pyautogui.onScreen(0, 0))        # True
print(pyautogui.onScreen(1920, 1080))    # False

执行结果:
本台计算机分辨率为: Size(width=1920, height=1080) <class 'pyautogui.Size'>
目前光标的位置: Point(x=971, y=608) <class 'pyautogui.Point'>
True
False

 4.2 鼠标操作

鼠标的操作大致就三类,点击(click),移动(Move)和拖拽(drag)。

鼠标的点击也分为单击、双击、右击,滚轮操作等

pyautogui.move(100,100) #在当前位置鼠标向右移动100,向下移动100
#相当在当前位置移动x,y个像素
# 第一个参数为X方向上的移动,左负右正
# 第二个参数为Y方向上的移动,上负下正

pyautogui.moveTo(100, 200, duration=3, tween=pyautogui.easeInQuad)  # 以先快后慢的方式移动到100,200点,耗时3S
# 大致功能和move()相近,但是多了两个参数
# moveTo鼠标光标移至传递的X和Y整数坐标,duration为移动到目标点的指定耗时,tween为移动的方式
# X,Y的坐标假如为浮点数,则向下取整

# 缓动/渐变函数可以改变光标移动过程的速度和方向。通常鼠标是匀速直线运动,这就是线性缓动/渐变函数。

# PyAutoGUI有30种缓动/渐变函数,可以通过pyautogui.ease*?查看。

# 开始很慢,不断加速
pyautogui.moveTo(100, 100, 2, pyautogui.easeInQuad)

# 开始很快,不断减速
pyautogui.moveTo(100, 100, 2, pyautogui.easeOutQuad)

# 开始和结束都快,中间比较慢
pyautogui.moveTo(100, 100, 2, pyautogui.easeInOutQuad)

# 一步一徘徊前进
pyautogui.moveTo(100, 100, 2, pyautogui.easeInBounce)

# 徘徊幅度更大,甚至超过起点和终点
pyautogui.moveTo(100, 100, 2, pyautogui.easeInElastic)

# 按住左键,用2s时间移动到100,200点的位置
pyautogui.dragTo(100, 200, 2, button='left')   

# 按住左键,从当前位置向右移动100px,向下移动200px,用时2s  
pyautogui.drag(100, 200, 2, button='left') 

# 在pyautogui 1.0版本后,drag会取代dragRel       
pyautogui.dragRel(100, 200, 2, button='left')        

# 除了X,Y坐标以外多了三个参数
# duration:移动所耗时
# tween:移动的方式(先快后慢、先后快中间慢等)
# button: 使用的按键(LEFT、RIGHT)


pyautogui.click()    # 鼠标在当前位置进行点击
 
# clicks: 点击次数,默认1次。次数为2,等于一次双击操作
# interval: 两次点击间隔时长,默认0.0;大于1.0后。默认为点击一次
# duration: 所耗时长,默认0.0。
pyautogui.click(100, 200, clicks=2, interval=0.1, duration=3.0)  
# 耗时3S,将鼠标移动到100,200的位置,点击2次,两次点击间隔0.1S
 
# 也可以传入一个字符串。字符串格式可以为jpg、png等。类似于一个桌面找图,并点击
# 图片一定要和.py文件放在同一个目录下!
pyautogui.click('demo.png')
 
# 执行鼠标左键单击。
pyautogui.leftClick()
 
# 执行鼠标右键单击。
pyautogui.rightClick()
 
# 执行鼠标中键单击。
pyautogui.middleClick()

# 鼠标当前位置左击两下
pyautogui.doubleClick() 

# 鼠标在(100,150)位置左击两下
pyautogui.doubleClick(x=100, y=150, button="left") 

# 鼠标当前位置左击三下
pyautogui.tripleClick()

# 鼠标左键按下再松开
pyautogui.mouseDown() 
pyautogui.mouseUp()

# 按下鼠标右键
pyautogui.mouseDown(button='right') 

# 移动到(100, 200)位置,然后松开鼠标右键
pyautogui.mouseUp(button='right', x=100, y=200)

# scroll函数控制鼠标滚轮的滚动,amount_to_scroll参数表示滚动的格数。正数则页面向上滚动,负数则向下滚动
# pyautogui.scroll(clicks=amount_to_scroll, x=moveToX, y=moveToY)
pyautogui.scroll(5, 20, 2)

# 向上滚动10格
pyautogui.scroll(10) 

# 向下滚动10格
pyautogui.scroll(-10)

# 移动到(100, 100)位置再向上滚动10格
pyautogui.scroll(10, x=100, y=100) 
 

注意:点击一个图片,需要安装Pillow才能支持。

4.3 键盘操作

import pyautogui
 
pyautogui.typewrite('Hello world!') # 输入Hello world!字符串
pyautogui.typewrite('Hello world!', interval=0.25) # 每次输入间隔0.25秒,输入Hello world!
 
pyautogui.press('enter') # 按下并松开(轻敲)回车键
pyautogui.press(['left', 'left', 'left', 'left']) # 按下并松开(轻敲)四下左方向键
pyautogui.keyDown('shift') # 按下`shift`键
pyautogui.keyUp('shift') # 松开`shift`键
 
pyautogui.keyDown('shift')
pyautogui.press('4')
pyautogui.keyUp('shift') # 输出 $ 符号的按键
 
pyautogui.hotkey('ctrl', 'v') # 组合按键(Ctrl+V),粘贴功能,按下并松开'ctrl'和'v'按键
 
# pyautogui.KEYBOARD_KEYS数组中就是press(),keyDown(),keyUp()和hotkey()函数可以输入的按键名称
pyautogui.KEYBOARD_KEYS = ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.',
              '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@',
              '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
              'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~',
              'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback',
              'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch',
              'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal',
              'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10',
              'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22',
              'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul',
              'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2',
              'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack',
              'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9',
              'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print',
              'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select',
              'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab',
              'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command',
              'option', 'optionleft', 'optionright']

4.4 消息窗口

import pyautogui

pyautogui.alert(text='这样很危险哦?', title='警告框', button='OK')

import pyautogui

pyautogui.confirm(text='您确认要删除我吗?', title='确认框', buttons=['OK', 'Cancel'])

import pyautogui

pyautogui. prompt(text='请告诉我你明天来吗?!', title='消息框' , default='')

import pyautogui

pyautogui. password(text='请输入密码:', title='密码消息框', default='', mask='*')

 

 4.5. 图像操作

import pyautogui
 
pyautogui.screenshot(r'C:\Users\Admin\demo.png') # 截全屏并设置保存图片的位置和名称
im = pyautogui.screenshot(r'C:\Users\Admin\demo.pn') # 截全屏并设置保存图片的位置和名称
print(im) # 打印图片的属性
 
# 不截全屏,截取区域图片。截取区域region参数为:左上角XY坐标值、宽度和高度
pyautogui.screenshot(r'C:\Users\Admin\region_demo.png', region=(0, 0, 300, 400))
 
pix = pyautogui.screenshot().getpixel((220, 200)) # 获取坐标(220,200)所在屏幕点的RGB颜色
positionStr = ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(3) + ')'
print(positionStr) # 打印结果为RGB:( 60, 63, 65)
pix = pyautogui.pixel(220, 200) # 获取坐标(220,200)所在屏幕点的RGB颜色与上面三行代码作用一样
positionStr = ' RGB:(' + str(pix[0]).rjust(3) + ',' + str(pix[1]).rjust(3) + ',' + str(pix[2]).rjust(3) + ')'
print(positionStr) # 打印结果为RGB:( 60, 63, 65)
 
# 如果你只是要检验一下指定位置的像素值,可以用pixelMatchesColor(x,y,RGB)函数,把X、Y和RGB元组值穿入即可
# 如果所在屏幕中(x,y)点的实际RGB三色与函数中的RGB一样就会返回True,否则返回False
# tolerance参数可以指定红、绿、蓝3种颜色误差范围
pyautogui.pixelMatchesColor(100, 200, (255, 255, 255))
pyautogui.pixelMatchesColor(100, 200, (255, 255, 245), tolerance=10)
 
# 获得文件图片在现在的屏幕上面的坐标,返回的是一个元组(top, left, width, height)
# 如果截图没找到,pyautogui.locateOnScreen()函数返回None
a = pyautogui.locateOnScreen(r'C:\Users\Admin\region_demo.png')
print(a) # 打印结果为Box(left=0, top=0, width=300, height=400)
x, y = pyautogui.center(a) # 获得文件图片在现在的屏幕上面的中心坐标
print(x, y) # 打印结果为150 200
x, y = pyautogui.locateCenterOnScreen(r'C:\Users\Admin\region_demo.png') # 这步与上面的四行代码作用一样
print(x, y) # 打印结果为150 200
 
# 匹配屏幕所有与目标图片的对象,可以用for循环和list()输出
pyautogui.locateAllOnScreen(r'C:\Users\Admin\region_demo.png')
for pos in pyautogui.locateAllOnScreen(r'C:\Users\Admin\region_demo.png'):
  print(pos)
# 打印结果为Box(left=0, top=0, width=300, height=400)
a = list(pyautogui.locateAllOnScreen(r'C:\Users\Admin\region_demo.png'))
print(a) # 打印结果为[Box(left=0, top=0, width=300, height=400)]

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐