python辦公自動化系列之金蝶K3自動登錄(一)

  做辦公自動化的小夥伴都知道,驅動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自動化。

歡迎掃碼關注我的公衆號 獲取更多爬蟲、數據分析的知識!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章