原文:http://www.woniuxy.com/note/625
以QQMusic為例,選擇歌手后會出現歌曲列表。但是,通過UISpy根本找不到唯一的屬性,如圖。
從上圖可以看出,第一首歌只提供一個processId的屬性,但是該屬性在QQmusic里幾乎所有元素都一樣,所以不能用來定位。該問題提供一種解決方案,拖動UIAutomation界面的Properties下拉滾動條,可以看到出現元素的坐標,那么是否可以用過坐標來定位呢?如圖所示。
在UIAutomation里面提供一個click(x,y,waittime)的方法。我們可以嘗試坐標定位。代碼如下:
import subprocess import uiautomation import time #打開QQMusic subprocess.Popen('C:\Program Files (x86)\Tencent\QQMusic\QQMusic.exe') time.sleep(2) #定位主界面 musicwindow = uiautomation.WindowControl(searchDepth=1, ProcessId='6092 (QQMusic)') #定位輸入框 edit = uiautomation.EditControl(searchFromControl = musicwindow, foundIndex = 1,ProcessId='7148 (QQMusic)') #將光標定位到輸入框中 edit.Click() #輸入歌手,{ENTER}是模擬鍵盤回車 edit.SendKeys('樊凡{ENTER}') time.sleep(2) #點擊指定坐標 uiautomation.Click(435,330) |
結果發現,並不能播放。在歌曲中有個播放按鈕,需要定位播放按鈕的位置,提供一個簡單獲取位置坐標的方法,可以通過截圖整個屏幕的方式保存圖片。然后使用畫圖的方式打開。這樣就可以在左下方獲取播放按鈕的坐標,如圖所示。
修改Click()中坐標,重新運行程序,就可以實現播放。
當然,程序本身提供全部播放,也可以將代碼改為點擊全部播放按鈕,可以通過UISpy獲取元素識別特征,然后調用。代碼如下:
… edit.SendKeys('樊凡{ENTER}') time.sleep(2) musicwindow.ButtonControl(Name='播放全部').Click() |
當然,坐標定位不是最好的解決問題的方式,想要解決上面這種問題,可以嘗試多級父子節點關系的查找定位,但這種方式肯定會非常復雜!
-
UIAutomation代碼實例
下述代碼演示了如何利用UIAutomation庫完成對Windows 10自帶的計算器和記事本的自動化操作。並用過程中還使用了PyUserInput庫。需要下載安裝pyHook和pyUserInput庫即可。
import uiautomation, time, subprocess, os from pykeyboard import PyKeyboard
class PyUIAuto():
def calc_test(self): # 或者直接使用Python運行一個計算器 # 啟動之前先運行一條命令強制關閉所有計算器 os.system("taskkill /f /IM Calculator.exe")
# os.system("start /b calc.exe") subprocess.Popen("calc.exe")
# 首先找到應用程序的頂層窗口 calc_window = uiautomation.WindowControl(searchDepth=1, Name="計算器", ClassName="ApplicationFrameWindow")
# 運行之前,如果程序已經啟動,則將其放置於窗口上方 calc_window.SetFocus() calc_window.SetTopmost(isTopmost=True)
# 找到對應的該應用程序的對象進行操作 button_3 = calc_window.ButtonControl(AutomationId="num3Button") button_3.Click() calc_window.ButtonControl(Name="加").Click() calc_window.ButtonControl(AutomationId="num5Button").Click() calc_window.ButtonControl(Name="等於").Click()
# 得到實際運算結果並進行斷言 result = calc_window.TextControl(AutomationId="CalculatorResults").Name if result.split(" ")[1] == "8": print("測試成功.") else: print("測試失敗.")
os.system("taskkill /f /IM Calculator.exe")
# 執行其他應用程序 # os.system(r'"C:\Program Files\internet explorer\iexplore.exe" http://www.woniuxy.com')
def notepad_test(self): os.system("start /b C:/Windows/notepad.exe") time.sleep(2) notepad = uiautomation.WindowControl(searchDepth=1, ClassName="Notepad") document = notepad.EditControl(AutomationId="15", Name="文本編輯器") document.SendKeys("這是一個文本編輯工具") # 或使用SetValue notepad.MenuItemControl(Name="文件(F)").Click() # 按三次下箭頭,再一次回車,打開文件保存對話框 uiautomation.SendKey(uiautomation.Keys.VK_DOWN) uiautomation.SendKey(uiautomation.Keys.VK_DOWN) uiautomation.SendKey(uiautomation.Keys.VK_DOWN) uiautomation.SendKey(uiautomation.Keys.VK_ENTER)
# 組合按鍵 # uiautomation.Win32API.PressKey() # uiautomation.Win32API.ReleaseKey()
uiautomation.SendKeys("D:\\uiauto_test4.txt") time.sleep(2) notepad.ButtonControl(Name="保存(S)").Click() time.sleep(2) notepad.ButtonControl(Name="關閉").Click()
# os.system("taskkill /f /IM notepad.exe")
if __name__ == '__main__': # PyUIAuto().notepad_test() time.sleep(2) uiautomation.MoveTo(500, 600) pos = uiautomation.Win32API.GetCursorPos() print(pos) |
總之,UIAutomation是一個功能非常強大的專門用於Windows操作系統的測試庫,除了測試Windows應用程序外,也可以作為Web系統GUI自動化測試的輔助。