Python自动化脚本开发技术汇总及研究方向
我最近一直在研究Python在Windows、Mac OS和Linux国产化桌面操作系统下自动化操作脚本开发,国产化操作系统主要适配UOS和麒麟系列。Python本身跨平台,但是不同平台下Python库实现各不相同,这里我介绍几款比较优秀的Python自动化库。
PyAutoGUI
PyAutoGUI是一个纯Python的GUI自动化工具,通过它可以让程序自动控制鼠标和键盘的一系列操作来达到自动化的目的。PyAutoGUI优点是跨平台,支持WIN/Mac/Linux,这已经很难得了,非常优秀了!
PyAutoGUI安装很简单:
pip install pyautogui
下面是PyAutoGUI常用的方法函数:
- pyautogui.position():可获取当前鼠标坐标
x, y = pyautogui.position()
- pyautogui.move():以鼠标当前位置移动x,y个像素
pyautogui.move(x=None, y=None, duration=0.0, tween=pyautogui.easeInQuad)
#按下鼠标,填写坐标的话,就pyautogui.mouseDown():按下鼠标
pyautogui.mouseDown(x=None, y=None, button='', duration=0.0)
#按下鼠标,填写坐标的话,就是移动到某个坐标下按下
# x,y为移动到某点按下,不填的话默认当前位置按下
# button按下的点击项,默认左按下 # duration整体指令运行的时间。
- pyautogui.mouseUp():松开鼠标
- pyautogui.dragRel():在鼠标当前位置点击后相对移动
pyautogui.dragRel(xOffset=20, yOffset=100, duration=3, tween=pyautogui.easeInQuad, button='left')
# 在鼠标当前位置点击后相对移动,结束后自动松开
# xOffset,yOffset为移动的距离
# duration整个移动的耗时
# tween移动的速度+轨迹
# button设置点击项,默认左击
- pyautogui.dragTo():从当前位置拖拽到指定坐标轴
pyautogui.dragTo(x=None, y=None, duration=0.0, tween=pyautogui.easeInQuad, button="left") # 鼠标从当前位置拖拽到指定坐标
# x,y为坐标,鼠标移动到指定的坐标(x,y)
# duration整个移动的耗时
# tween移动的速度+轨迹
# button设置点击项,默认左击
- pyautogui.keyDown('') :按下某个键
pyautogui.keyDown('shift') # 按下shift键
- pyautogui.keyUp('') :松开键盘
pyautogui.keyUp('shift') # 松开shift键
- pyautogui.press(' '):输入内容
pyautogui.press("这是输入的内容")
- pyautogui.typewrite():缓慢输入
pyautogui.typewrite("message", interval=2) # 缓慢输入
# message:为输入的内容
# interval:设置每两个字符输入的时间间隔,单位s
- pyautogui.hotkey():多键组合使用
pyautogui.hotkey('ctrl', 'a') # 多键组合使用
- pyautogui.alert():alert弹框
a = pyautogui.alert(text='test', title='pyautogui') # alert弹框
# text:弹框内容
# title:弹框标题
- pyautogui.confirm():confirm弹框
a = pyautogui.confirm(text='test', title='pyautogui') # alert弹框,点击确定返回ok,点击取消返回cancel
# text:弹框内容
# title:弹框标题
- pyautogui.screenshot():截图
img = pyautogui.screenshot() # 默认截取全屏
img.save("./img/gui.png") # 截取后的图片保存位置
- pyautogui.scroll():垂直滚动,负数为向下滚动,正数为向上滚动
- pyautogui.hscroll() :水平滚动
- pyautogui.vscroll() :垂直滚动,负下正上
PyGetWindow
一个简单的跨平台模块,用于获取和控制应用程序窗口上的GUI信息。PyGetWindow跨平台,在Windows下实现很棒,在Mac和Linux下只实现了其中部分功能,目前最新版本v0.0.7。
为什么这里要介绍PyGetWindow,它本身不会实现自动代填功能,但是实现GUI自动代填时,非常麻烦的是要获取窗口焦点、标题等信息,PyGetWindow主要用来获取窗口标题。
AppKit / Quartz
Python在Windows下实现模拟自动化操作要比在Mac和Linu下要容易的多,因为在Windows下有pywin32和pyhook,功能非常强大,而Mac下这方面的库很少,这里就要借助AppKit和Quartz,下面会有一段代码,是用来在Mac获取窗口信息的,至于Linux下目前还在研究中。
if platform.system() == 'Darwin':
from AppKit import NSWorkspace
from Quartz import (
CGWindowListCopyWindowInfo,
kCGWindowListOptionOnScreenOnly,
kCGNullWindowID
)
curr_app = NSWorkspace.sharedWorkspace().frontmostApplication()
curr_pid = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationProcessIdentifier']
curr_app_name = curr_app.localizedName()
options = kCGWindowListOptionOnScreenOnly
上面这段代码在Mac下能够获取当前活动状态下的所有窗口。
windowList = CGWindowListCopyWindowInfo(options, kCGNullWindowID)
for window in windowList:
pid = window['kCGWindowOwnerPID']
windowNumber = window['kCGWindowNumber']
ownerName = window['kCGWindowOwnerName']
geometry = window['kCGWindowBounds']
windowTitle = window.get('kCGWindowName', u'Unknown')
if curr_pid == pid:
w = geometry['Width']
h = geometry['Height']
通过遍历上面所有窗口,就能够获取当前应用的窗口信息,因为这里能获取到窗口标题,并且能够获取窗口的宽和高,通过这些特性基本上就能够定位你要的窗口,再配合PyAutoGUI就实现模拟代填等自动化操作。
完整代码我可以分享出来。
除了上述介绍的PyAutoGUI、PyGetWindow、AppK、Quartz,在Mac下还有AppleScript也可以实现自动化操作,AppleScript功能非常强大,可以打开某个应用,还能获取窗口上的元素信息,包括窗口上菜单和文本信息,都可以获取到,在Python里有对应的applescript库支持,我觉得AppleScript是研究自动化操作方面非常重要的一个方向。
Mac和Linux平台下自动化操作,还可以借助expect shell脚本,比如通过expect shell脚本可以实现ssh自动化登录的,Shell中根据匹配到的回显,Send(输入)相应的信息。
#!/usr/bin/expect
set timeout 30
spawn ssh -p 22 root@192.168.10.171
expect {
"(yes/no)?"
{send "yes\n";exp_continue}
"password:"
{send "123456\n"}
}
interact
以上技术点是我最近从事Python开发研究的方面,后面还会继续深耕,分享干货,共同学习,共同进步。
___END___