ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python办公自动化系列之金蝶K3自动登录(一)

2022-02-08 13:02:57  阅读:233  来源: 互联网

标签:sysLoginWnd 登录 金蝶 python K3 win32gui organizationHwnd 下拉框


  做办公自动化的小伙伴都知道,驱动SAP GUI我们有SAP原生提供的【脚本录制与回放】以及SAP Scripting API可参考;驱动Office Excel等,我们有微软提供的【录制宏】功能;驱动各类浏览器我们有selenium和Katalon Recorder。这些工具都可以提供简易的代码录制功能,稍微有点编程基础的小伙伴可以基于录制后自动生成的代码,整合上业务逻辑,稍加调整,就可以轻松完成一个自动化脚本的开发。

  可桌面软件远不止这几大类啊,更不是每个公司都舍得花钱买SAP的ERP产品,比如今天的国产ERP巨头金蝶公司的K3 Wise客户端,我们是否也有类似的办法来自动化呢?小爬这里给出的答案是:可以,但是没有官方提供的【动作录制】功能快速生成脚本,这次真的只能徒手写代码了,除了微软大大提供的Windows系统 API,似乎我们什么都依靠不了。小爬今天就带大家层层分解,用python脚本一步步搞定金蝶K3的UI自动化。

 

 

  • 自动化启动K3 Wise软件

  我们需要判断金蝶K3 Wise是否已经启动,如果没有,则自动化启动它,我们再次请出我们的好帮手SPY++和了不起的Pywin32库。通过SPY++的元素捕获功能拿到K3登录界面的窗口标题(caption)和类名(Class),再用FindWindow函数来捕获即可,最后再决定是否用subprocess库来启动对应的K3 exe文件,这一步的示例代码如下:

 

 

 

 1 # 需要提前使用管理员权限运行VScode或者Pycharm,否则无法正常使用
 2 import win32gui,win32api,win32con,subprocess,time,os
 3 def getK3LoginHwnd():
 4     sysLoginWnd=win32gui.FindWindow('ThunderRT6Form',"金蝶K/3系统登录") # K3系统登录窗
 5     if sysLoginWnd==0:
 6         subprocess.Popen(r'C:\Program Files (x86)\Kingdee\K3ERP\K3MainNet.exe')
 7 
 8     # subprocess发送指令启动后需要等K3登录窗彻底可见后,再进行后续操作
 9     while sysLoginWnd==0:
10         time.sleep(0.3)
11         sysLoginWnd=win32gui.FindWindow('ThunderRT6Form',"金蝶K/3系统登录") # K3系统登录窗
12     isSysLoginWndVisible=0
13     while isSysLoginWndVisible==0:
14         time.sleep(0.3)
15         sysLoginWnd=win32gui.FindWindow('ThunderRT6Form',"金蝶K/3系统登录") # K3系统登录窗
16         isSysLoginWndVisible=win32gui.IsWindowVisible(sysLoginWnd) # 判断窗口是否已经对用户可见
17     return sysLoginWnd

 需要注意的是,我们需要使用管理员权限打开VScode或者Pycharm后再调试脚本,否则windows提示【请求的操作需要提升】,如下图所示。

 

  • 驱动K3登录窗,成功登录特定账套

 1、设置【组织机构】下拉框

 

 

   大胆猜测,上图中组织机构下拉框ThunderRT6ComboBox是ComboBox的子类,继承了它的很多特性。比如我们希望选择组织机构【01|查询帐套】,它在combobox列表中索引为1。我们先判断当前值是否是我们要的,否则就选择某个下拉选项。示例代码如下:

1 def setOrganization(sysLoginWnd,organizationIndex):
2     '''根据K3登录窗的句柄和下拉框索引值,选择特定的组织机构'''
3     mainHwnd1=win32gui.FindWindowEx(sysLoginWnd,0,None, '') # ThunderRT6PictureBoxDC
4     mainHwnd2=win32gui.FindWindowEx(sysLoginWnd,mainHwnd1,None, '') # ThunderRT6PictureBoxDC
5     organizationHwnd=win32gui.FindWindowEx(mainHwnd2,0,"ThunderRT6ComboBox", '') # 组织机构
6     currentOrgIndex=win32gui.SendMessage(organizationHwnd, win32con.CB_GETCURSEL) # 当前combobox选中的index
7     if currentOrgIndex!=organizationIndex:
8         win32gui.SendMessage(organizationHwnd, win32con.CB_SETCURSEL, organizationIndex, 0)

  划重点了,K3登录窗中,【组织机构】和【当前帐套】是二级联动的下拉菜单,而我们上面定义的setOrganization方法一通操作后,只更改了【组织机构】,却无法使得【当前帐套】产生联动,应该是后台的消息机制没能推送给程序,导致无法自动联动,实在是空欢喜。莫慌,小爬这里有锦囊妙计:利用python脚本设置好了【组织机构】下拉框后,再激活【组织机构】下拉框,使其处于蓝底,这个时候模拟键盘↓和键盘↑,来激活【当前帐套】的二级联动效果。对了,这里还需要注意一个坑:临界问题,比如下拉框选中的是最后一项,此时应该模拟的是键盘↑+键盘↓,思路理清后,果断完善上面的setOrganization方法,代码如下:

 1 def setOrganization(sysLoginWnd,organizationIndex):
 2     '''根据K3登录窗的句柄sysLoginWnd和下拉框索引值organizationIndex,选择特定的组织机构'''
 3     mainHwnd1=win32gui.FindWindowEx(sysLoginWnd,0,None, '') # ThunderRT6PictureBoxDC
 4     mainHwnd2=win32gui.FindWindowEx(sysLoginWnd,mainHwnd1,None, '') # ThunderRT6PictureBoxDC
 5     organizationHwnd=win32gui.FindWindowEx(mainHwnd2,0,"ThunderRT6ComboBox", '') # 组织机构
 6     currentOrgIndex=win32gui.SendMessage(organizationHwnd, win32con.CB_GETCURSEL) # 当前combobox选中的index
 7     if currentOrgIndex!=organizationIndex:
 8         win32gui.SendMessage(organizationHwnd, win32con.CB_SETCURSEL, organizationIndex, 0)
 9 
10         '''模拟鼠标左键点击元素,激活它'''
11         win32gui.SendMessage(organizationHwnd, win32con.WM_LBUTTONDOWN, 0, 0) 
12         time.sleep(0.01)
13         win32gui.SendMessage(organizationHwnd, win32con.WM_LBUTTONUP, 0, 0)
14 
15         '''小爬此处的场景中,【组织机构】有6个下拉项,那么最大的index就是5'''
16         if organizationIndex<5: # 模拟键盘↓+键盘↑
17             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYDOWN, win32con.VK_DOWN, 0)
18             time.sleep(0.01)
19             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYUP, win32con.VK_DOWN, 0)
20             time.sleep(0.1)
21             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYDOWN, win32con.VK_UP, 0)
22             time.sleep(0.01)
23             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYUP, win32con.VK_UP, 0)
24         else: # 模拟键盘↑+键盘↓
25             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYDOWN, win32con.VK_UP, 0)
26             time.sleep(0.01)
27             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYUP, win32con.VK_UP, 0) 
28             time.sleep(0.1) 
29             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYDOWN, win32con.VK_DOWN, 0)
30             time.sleep(0.01)
31             win32gui.PostMessage(organizationHwnd, win32con.WM_KEYUP, win32con.VK_DOWN, 0)
32             time.sleep(0.1)

 

  今天的分享就到这里了,后续小爬会教大家如何驱动剩下的K3登录界面控件,实现自动登录账套,自动切换账套,玩转金蝶K3的UI自动化。

欢迎扫码关注我的公众号 获取更多爬虫、数据分析的知识!

 

标签:sysLoginWnd,登录,金蝶,python,K3,win32gui,organizationHwnd,下拉框
来源: https://www.cnblogs.com/new-june/p/15870862.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有