最近在搞SAP的自动化。因为公司没考虑预算,不能用RPA。 首先用SAP自带的录制工具,不太行,各种弹框没法处理。 思来想去,打算用python来整。先用tracker来录制,创建业务流程还好,但是一旦要处理弹框,上传附件,就有点吃力了。 然后用了python的一些库来对付。 pyperclip 剪切板 pymouse 鼠標操作 pykeyboard 鍵盤曹祖 win32com win32gui pyautogui pywinauto uiautomation pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。 pythoncom是pywin32库的一部分,运行脚本后,即可通过键盘的上下左右键控制鼠标移动了 pyhook 監聽輸入操作 pynput这个库让你可以控制和监控输入设备 这些库各有千秋,让我分別道来。
1.uiautomation的安装
pip install uiautomation
2.uiautomation的使用 在cmd中运行automation.py -t 3 #3秒后遍历最上层窗口的控件 -f, 抓取焦点处控件 -n, 显示控件的完整name -c, 遍历光标下的控件 -d,遍历的层级
import uiautomation as auto
window=auto.WindowControl(ClassName="CabinetWClass",searchDepth=1) #控制面板窗口 window.SwitchToThisWindow() # 切换窗口
Uiautomation元素获取方法如下 程序窗口:uiautomation.WindowControl 按钮:uiautomation.ButtonControl 文本:uiautomation.TextControl 输入窗口:uiautomation.EditControl 文档控件:uiautomation.DocumentControl 单选控件:uiautomation.CheckBoxControl 复选控件:uiautomation.ComboBoxControl 日历控件:uiautomation.CalendarControl
可以通过spy++来查看Control type
Uiautomation元素的属性
ClassName、Name、ProcessId、AutomationId、searchDepth 常用的操作有
DoubleClick()双击 Click()单击 RightClick()右键点击 SendKeys()发送字符
优点是,可以深层次遍历各个元素,你只需要提供元素名称,或者class,然后提供层数就可以了。 缺点是要层层遍历,性能变低,还需要开一个窗口,有时候窗口不是很稳定。基本上元素都會解析出來,不穩定是因爲有太多類似的。
pyautogui 模块主要用于屏幕控制(获取屏幕尺寸、截屏等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽、滚动等)、键盘控制(编辑、按键等)。如果有元素搞不定,可以用這個來截圖定位。 这个模块之前讲过,就不在这里重复了。
Python 没有自带访问 windows 系统 API 的库的,需要下载 pywin32,pywin32 是一个第三方模块库,主要的作用是方便 python 开发者快速调用 windows API 的一个模块库。它直接包装了几乎所有的 Windows API,可以方便地从 Python 直接调用 pywin32 安装:pip install pywin32
win32api :模块内定义了常用的一些 API函数,例如:MessageBox win32gui :模块内定义了一些有关 图形操作的API,例如:FindWindow win32con :模块内定义了 windows API 内的宏,即 宏常量。例如 MessageBox 内的 MB_OK win32file:提供了有关文件操作的API pywin32 包含 win32gui、win32api、win32con 3个子模块,主要用于窗口管理(定位窗口、显示和关闭窗口、窗口前置、窗口聚焦、获取窗口位置等),通常用的较多的是 win32gui
hld = win32gui.FindWindow(None,u"Adobe Acrobat") #返回窗口标题为Adobe Acrobat的句柄通过父窗口句柄获取子句柄#parent为父窗口句柄iddef get_child_windows(parent):
下面重点讲这个库
pywinauto 模块主要用于应用控制(打开、关闭应用等)窗口控制(最大化、最小化窗口等),也可以等位到控件,并对控件进行操作,如点击、编辑等。
对于 pywinauto 模块,主要使用其中的 Application 类,需要导入包,并定义一个 Application 类的对象。
start(self, cmd_line, timeout=app_start_timeout) # 默认超时时间为5sapp = Application(backend = 'uia').start(r"E:\Office\Office14\EXCEL.exe")
查找/调用窗口 通过工具spy++lite查看窗口的类名和标题文字...
这里先介绍官方文档的两种方法:
(1)通过top_dlg = app.top_window_() 来获取最上面的window(不推荐,如果有新进程,就会得到错误对象)
(2)通过find_dlg = app.window_(title_re = ‘ ’, class_name = ‘ ’) 方法获得,title_re和 class_name这两个可以单独使用也可以一块使用,因为有时没有标题文本,也有时一个窗口类名有多个对象;
(3)通过dlg_spec = app.window(title='')
或者app.window(title_re=’’)
如果需要处理菜单: MenuSelect方法自动检索Notepad上的菜单选项 例如:点击“帮助->关于记事本”操作; app.Notepad.MenuSelect('帮助->关于记事本')
项目在企业微信PC版样式有点兼容问题,如果不能在企业微信直接调试,那效率非常低,问题又不容易定位到,企业微信设置里又没有开发者模式开关,就在我无从下手的时候,发现一个快捷键能打开调试模式
第一步:
ctrl + alt + shift + D,会有弹框提示已开启
第二步:
在企业微信里打开H5页面,右键-检查元素,Ctrl+shift+i 就可以调试了
可以用如下工具来定位元素: Scripting Tracker, 这个主要是用在sap中的,点击鼠标,可以指到元素上。 spy++ inspect
好了,介绍了这么多工具,到底怎么用呢? 一般如果元素控件很多,层级很深,可以用到uiautomation; 当然pywinauto也可以实现,但是需要一层一层定位。 如果需要下拉框,pywinauto,uiautomation都是不错选择。 pyautogui可以用在定位不到元素的地方,用图像或者坐标来定位,也可以操作鍵盤,快捷鍵。 win32gui可以辅助操作窗口。 定位元素一般可以用classname,title,name,instence,controltype都可以正則來實現。
参考:https://www.zhihu.com/column/c_1468529809685307392?page=2 https://pywinauto.readthedocs.io/en/latest/controls_overview.html#dialog