聊聊 PC 端自動化最佳方案 - WinAppDriver

語言: CN / TW / HK

1. 前言

大家好,我是安果!

一提到自動化,可能大家想到的是 App 端的 Appium、Airtest、AutoJS,亦或是 Selenium、Puppeteer、Cypress 等 Web 端的自動化框架

本篇文章,我將和大家聊聊 PC 端的自動化工具 - WinAppDriver

​2. 準備

WinAppDriver,全稱為 Windows Application Driver,它是 Windows 上一個類似 Selenium 的 UI 自動化驅動服務框架

它支援 Appium,可以使用 Appium-Python-Client 依賴庫完成對 Windows 桌面程式的自動化操作

專案地址: https://github.com/Microsoft/...

需要注意的是,要使用 WinAppDriver 服務框架完成 Windows 的自動化,需要滿足 Windows10 或 Windows Server 2016 以上系統

另外,它支援的應用程式包含:

  • UWP  -  Universal Windows Platform
  • WinForms  -  Windows Forms
  • WPF  -  Windows Presentation Foundation
  • Win32  -  Classic Windows

在實現之前,我們需要做好以下準備工作

2-1  開啟「 開發者模式 」

關鍵字搜尋「 開發者設定 」,選擇開啟「 開發者模式 」

2-2  安裝視窗元件元素識別工具

常用的 2 種視窗元素識別工具為:inspect.exe、FlaUInspect

其中

作為官方的元件元素識別工具,inspect.exe 集成於 Windows SDK

如果本地不存在該檔案,可以通過下面連結進行安裝

https://download.microsoft.co...

相比 inspect.exe,FlaUInspect 介面更簡潔,功能更易用( 推薦 )

專案地址: https://github.com/FlaUI/FlaU...

2-3  安裝 WinAppDriver

通過下面連結下載 WinAppDriver 應用程式,並在本地執行起來

https://github.com/Microsoft/...

2-4  搭建 Appium 環境

這部分內容涉及 NodeJS 安裝及 Appium-Server 環境的搭建

可以參考: https://www.cnblogs.com/amoys...

2-5  安裝依賴

最後安裝 Python 依賴庫 Appium-Python-Client

# 安裝依賴 Appium-Python-Client
pip3 install Appium-Python-Client

3. 實戰一下

我們以操作 PC 端的微信為例,聊聊自動化的常見步驟

首先,我們在本機開啟 WinAppDriver 服務,讓它在後臺執行

然後,我們使用 Python 編寫自動化指令碼

通過 ip 地址、埠號及 PC 版微信的絕對路徑,使用 Appium 開啟微信

import time, os
from appium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep

class Auto():

    def open_weixin(self, host='localhost', port=4723):
        # 開啟WinAppDriver服務
        # 注意:如果手動開啟,則可以註釋掉
        # os.system(r'start "" /d "C:\Program Files\Windows Application Driver\"  "WinAppDriver.exe"')

        # 配置資訊
        # 包含:平臺名、系統、應用程式絕對路徑
        desired_caps = {'platformName': 'Windows', 'deviceName': 'WindowsPC',
                        'app': r"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe"}

        try:
            # 連線WinAppDriver服務,開啟目標軟體
            self.driver = webdriver.Remote('http://{}:{}'.format(host, port), desired_caps)
        except Exception as e:
            raise AssertionError(e)

接著,通過「 元件元素識別工具 」拿到介面元素的屬性值,執行常見的點選、移動、滑動等操作

比如:點選「 檔案傳輸助手 」,傳送一條資訊

# 給檔案傳輸助手傳送一條資訊
def send_msg(self, element_name, msg):
    """
​    :param element_name:元素name值
    :param msg:
    :return:
    """
    # 通過name屬性,找到目標元素
    chat_element = self.weixin_driver.find_element_by_name(target_name)

    # 點選元素,進入聊天介面
    chat_element.click()

    # 找到輸入框,並輸入
    self.weixin_driver.find_element_by_name("輸入").send_keys(msg)

    # 點選右下角的傳送,傳送訊息出去
    self.weixin_driver.find_element_by_name("傳送(S)").click()

需要注意的是,如果涉及介面的滑動,可以使用「 ActionChains 」移動滑鼠,然後使用 win32api 和 win32con 模擬螢幕滑動即可

import win32api
​import win32con
from appium import webdriver
from selenium.webdriver import ActionChains

# 模擬螢幕滑動
# 1、移動到某個元素區域
ActionChains(self.weixin_driver).move_to_element(
     self.weixin_driver.find_element_by_name("element_name")).perform()

# 2、滑動介面
# 比如,向上滾動,模擬滑動
win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL, 0, 0, -500)

完成自動化操作後,就可以主動釋放資源、關閉 WinAppDriver 服務

# 釋放資源及關閉服務
def tearDownFunc(self):
​    print("準備退出")
    sleep(2)

    # 1、釋放資源
    self.weixin_driver.quit()

    # 2、關閉WinAppDriver應用程式
    os.system(' @taskkill /f /im WinAppDriver.exe')

4. 最後

在實際使用過程中,可能會遇到複雜的桌面應用程式,這時我們可以通過列印驅動物件的「 page_source」元素控制樹值,以此來幫助我們進行快速定位元素,進而完善自動化指令碼

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續輸出更多優質文章的最強動力!