看到这个库的时候,单单从名字就感觉到两个字“简单”,特别容易理解它是用来做什么的,深入了解之后感觉的还是两个字“简单”。这对自动化测试来说便是一个天大的乐事,因为很多工具庞大复杂,仅仅是写一个hello world需要的环境,需要了解的东西比c++,java还难。
PyAutoGUI作为GUI自动化神器,简单高效、函数分类清晰,它被awesome-python、awesome-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依赖于pyscreeze、pymsgbox、pytweening,上述命令会自动安装这3个库。安装完成后可以发现,在site-packagespyautogui有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)4.2 鼠标 *** 作目前光标的位置: Point(x=971, y=608) True False
鼠标的 *** 作大致就三类,点击(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:UsersAdmindemo.png') # 截全屏并设置保存图片的位置和名称 im = pyautogui.screenshot(r'C:UsersAdmindemo.pn') # 截全屏并设置保存图片的位置和名称 print(im) # 打印图片的属性 # 不截全屏,截取区域图片。截取区域region参数为:左上角XY坐标值、宽度和高度 pyautogui.screenshot(r'C:UsersAdminregion_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:UsersAdminregion_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:UsersAdminregion_demo.png') # 这步与上面的四行代码作用一样 print(x, y) # 打印结果为150 200 # 匹配屏幕所有与目标图片的对象,可以用for循环和list()输出 pyautogui.locateAllonScreen(r'C:UsersAdminregion_demo.png') for pos in pyautogui.locateAllonScreen(r'C:UsersAdminregion_demo.png'): print(pos) # 打印结果为Box(left=0, top=0, width=300, height=400) a = list(pyautogui.locateAllonScreen(r'C:UsersAdminregion_demo.png')) print(a) # 打印结果为[Box(left=0, top=0, width=300, height=400)]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)