最近接到一个朋友的帮助,需要将对应的xlsx文件导入到对应的客户端软件进行操作后,然后将生成的文件保存到对应的文件夹中,因为需要操作的xlsx文件过多,人工操作很累,所以找到了我,让我帮忙写一个自动化的脚本帮助他处理这些重复性的工作,于是我就开始了客户端软件自动化方面的研究与实践,下面是我个人的一个实践分享。
首先,我们来介绍下客户端软件,我们大家都知道windows系统所使用的客户端软件都是采用的c/c++的语言进行开发的,所以对应软件中控件的属性定位就需要用到uia或win32两种不同的技术了,下面介绍下两种技术的区别:
⑴win32是一种传统的Windows应用程序开发框架,是一套基于C语言的API接口,是Windows操作系统最为基础的API。通过Win32技术可以实现Windows界面应用程序开发,包括窗口管理、消息处理、菜单、工具栏等常见UI元素。Win32是Windows操作系统上最原始的、最传统的编程方式,也是使用最广泛的一种API。
⑵uia是一种微软开发的自动化技术,用于访问和操作Windows应用程序的用户界面元素,UIA基于一组API,允许开发人员编写自动化脚本和应用程序,以执行诸如模拟用户交互、获取界面元素的属性和状态等任务。
其次,知道了win32和uia,那我们在获取窗口控件属性的时候,如何确定是让backend=Win32还是uia来启动对应的应用程序呢!网上查阅资料说可以借助一些对应的辅助工具,如inspect.exe,spy++等,但是通过实践发现这些辅助工具并不好用,下面是我试用inspect.exe的图片:
它记录你打开的所有窗口的信息,以至于你无法有效的找到所需要的控件属性,体验非常的差,所以对于对于窗口控件的结构和属性定位,我采用的是代码的形式,这里我使用的是python语言,
import time
from pywinauto import findwindows
import pywinauto.mouse as mouse
import pywinauto.keyboard as keyboard
from pywinauto import Application
# 先启动软件
app = Application(backend="uia").start("软件的所属路径")
# 强制等待
time.sleep(5)
# 获取初始的窗口标题
window_title = "请选择新建或打开"
# 使用窗口标题查找窗口句柄
window_handle = findwindows.find_windows(title=window_title)[0]
# 获取窗口对象
window = app.window(handle=window_handle)
# 获取请选择新建或打开窗口位置和大小信息
window_rect = window.rectangle()
window_width = window_rect.width()
window_height = window_rect.height()
# 获取选择新建或打开窗口中"新建工程"按钮对象
button = window.child_window(title="新建工程")
# 获取按钮位置和大小信息
button_rect = button.rectangle()
button_left = button_rect.left
button_top = button_rect.top
button_width = button_rect.width()
button_height = button_rect.height()
# 计算新建工程按钮的像素坐标
click_x = window_rect.left + (button_left - window_rect.left)
click_y = window_rect.top + (button_top - window_rect.top)
# 在指定位置进行点击操作
mouse.click(coords=(click_x , click_y))
# 获取结构树
new_windows = app.top_window()
new_windows.print_control_identifiers()
首先,你不需要关注 backend是uia还是win32,直接先默认一个uia,如果所属的窗口是用win32写的,那查找窗口句柄的那一行就会直接报错,如果没有报错就说明在这个窗口中,就是使用的uia写的,然后后面获取窗口属性就采用
new_windows = app.top_window()new_windows.print_control_identifiers()获取对应的窗口属性结构树,如下图所示:
这样条例就很清晰,然后大家想使用哪个控件就定位哪个控件的位置进行点击或者其他操作。
今天就先更新到这里,明天继续更新,如有不足的地方,欢迎大家指正。