python+uiautomation如何定位列表項目


原文:http://www.woniuxy.com/note/625

以QQMusic為例,選擇歌手后會出現歌曲列表。但是,通過UISpy根本找不到唯一的屬性,如圖。

 

20201103_105340_463.png

 

 

20201103_105257_111.png

 

 

從上圖可以看出,第一首歌只提供一個processId的屬性,但是該屬性在QQmusic里幾乎所有元素都一樣,所以不能用來定位。該問題提供一種解決方案,拖動UIAutomation界面的Properties下拉滾動條,可以看到出現元素的坐標,那么是否可以用過坐標來定位呢?如圖所示。

 

 

20201103_105353_627.png

 

 

在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)

結果發現,並不能播放。在歌曲中有個播放按鈕,需要定位播放按鈕的位置,提供一個簡單獲取位置坐標的方法,可以通過截圖整個屏幕的方式保存圖片。然后使用畫圖的方式打開。這樣就可以在左下方獲取播放按鈕的坐標,如圖所示。

 

 

20201103_105402_178.png

 

 

修改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自動化測試的輔助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM