windows GUI自动化怎么做

2022-12-01 15:45:54 浏览数 (1)

最近在搞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这个库让你可以控制和监控输入设备 这些库各有千秋,让我分別道来。

UIautomation

1.uiautomation的安装

代码语言:javascript复制
pip install uiautomation

2.uiautomation的使用   在cmd中运行automation.py -t 3 #3秒后遍历最上层窗口的控件 -f, 抓取焦点处控件 -n, 显示控件的完整name -c, 遍历光标下的控件 -d,遍历的层级

代码语言:javascript复制
  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

pyautogui 模块主要用于屏幕控制(获取屏幕尺寸、截屏等)、鼠标控制(移动鼠标、单击、双击、右击、拖拽、滚动等)、键盘控制(编辑、按键等)。如果有元素搞不定,可以用這個來截圖定位。 这个模块之前讲过,就不在这里重复了。

pywin32

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

代码语言:javascript复制
hld = win32gui.FindWindow(None,u"Adobe Acrobat") #返回窗口标题为Adobe Acrobat的句柄通过父窗口句柄获取子句柄#parent为父窗口句柄iddef get_child_windows(parent):

下面重点讲这个库

pywinauto

pywinauto 模块主要用于应用控制(打开、关闭应用等)窗口控制(最大化、最小化窗口等),也可以等位到控件,并对控件进行操作,如点击、编辑等。

对于 pywinauto 模块,主要使用其中的 Application 类,需要导入包,并定义一个 Application 类的对象。

代码语言:javascript复制
start(self, cmd_line, timeout=app_start_timeout) # 默认超时时间为5sapp = Application(backend = 'uia').start(r"E:OfficeOffice14EXCEL.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

0 人点赞