桌面自动化winappdriver、uiautomation、win32、pyautogui...

我的需求是不通过鼠标也能实现点击等操作 就像浏览器脚本一样  可以不用鼠标,可以在自动化脚本运行时我们能做其他的事,但是经过上时间的发掘,我没发现这些库能较好地实现这样的需求

winappdriver+appium:

认可度较大的一款自动化工具

网上的代码几乎都要在安装appium1.3版本才能较好的运行  高版本会有w3c标准   代码api大幅改动(真是服了)。winappdriver只是提供一个服务,代码是用appium写

评价:

优点:能操作所有inspect.exe能获取的控件  和大多数自动化工具是差不多一样的   认可度较高

appium同时是安卓端自动化的火热代码库

缺点:不能满足不通过鼠标实现点击等操作的需求  唉   还有就是网上的教程很少 讲解少  得自己摸    苦逼   唉
计算器自动化操作代码示例:


import unittest
from appium import webdriver
import time
class SimpleCalculatorTests(unittest.TestCase):

    @classmethod

    def setUpClass(self):
        #set up appium
        desired_caps = {}
        desired_caps["app"] = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
        # desired_caps["app"] = r"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe"
        # desired_caps = {
        #     # "app": r"D:\Program Files (x86)\XMind\XMind.exe",
        #     "app": r"D:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe",
        #     'platformName': 'Windows',
        #     'automationName': 'Windows'
        # }
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4723',
            desired_capabilities= desired_caps)

    @classmethod
    def tearDownClass(self):
        self.driver.quit()

    def getresults(self):
        displaytext = self.driver.find_element_by_accessibility_id("CalculatorResults").text
        displaytext = displaytext.strip("Display is " )
        displaytext = displaytext.rstrip(' ')
        displaytext = displaytext.lstrip(' ')
        return displaytext


    def test_initialize(self):
        print("111111")
        print(self.driver.find_element_by_name("清除"))

        self.driver.find_element_by_name("七").click()
        self.assertEqual(self.getresults(),"7")
        # self.driver.find_element_by_name("Clear").click()
        time.sleep(10)
    def test_addition(self):
        self.driver.find_element_by_name("一").click()
        self.driver.find_element_by_name("加").click()
        self.driver.find_element_by_name("七").click()
        self.driver.find_element_by_name("等于").click()
        self.assertEqual(self.getresults(),"8")

    def test_combination(self):
        self.driver.find_element_by_name("七").click()
        self.driver.find_element_by_name("除以").click()
        self.driver.find_element_by_name("九").click()
        self.driver.find_element_by_name("加").click()
        self.driver.find_element_by_name("一").click()
        self.driver.find_element_by_name("等于").click()
        self.driver.find_element_by_name("等于").click()
        self.driver.find_element_by_name("八").click()
        self.driver.find_element_by_name("等于").click()
        self.assertEqual(self.getresults(),"8")

    def test_division(self):
        self.driver.find_element_by_name("八").click()
        self.driver.find_element_by_name("八").click()
        self.driver.find_element_by_name("除以").click()
        self.driver.find_element_by_name("一").click()
        self.driver.find_element_by_name("一").click()
        self.driver.find_element_by_name("等于").click()
        self.assertEqual(self.getresults(),"8")

    def test_multiplication(self):
        self.driver.find_element_by_name("九").click()
        self.driver.find_element_by_name("除以").click()
        self.driver.find_element_by_name("九").click()
        self.driver.find_element_by_name("等于").click()
        self.assertEqual(self.getresults(),"81")

    def test_subtraction(self):
        self.driver.find_element_by_name("九").click()
        self.driver.find_element_by_name("减").click()
        self.driver.find_element_by_name("一").click()
        self.driver.find_element_by_name("等于").click()
        self.assertEqual(self.getresults(),"8")

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(SimpleCalculatorTests)
    unittest.TextTestRunner(verbosity=2).run(suite)
    input("运行结束...")

uiautomation

是api较方便、完善的一款自动化库  个人感觉比winappdriver好用

安装时容易遇到问题   记得管理员打开cmd安装!!!!!
评价:

优点:和winappdriver一样  很多控件都适用! 集成度高,api较方便、完善的,网上很多教程  很适合学习  且很好用

缺点:还是 唉 不占用鼠标就不能运行

记事本自动化操作代码示例:

from time import sleep
import uiautomation as auto

class Calc():
    def open_calc(self):
        #打开计算器
        desktop=auto.PaneControl(Name='任务栏')
        #点击任务栏
        desktop.Click()
        #Win+D ,显示桌面
        desktop.SendKeys('{Win}d')
        #Win+R ,打开运行界面,并输入calc,打开浏览器
        desktop.SendKeys('{Win}r')
        run_win = auto.WindowControl(Name='运行')
        run_win_edit=run_win.EditControl(ClassName='Edit',Name='打开(O):')
        run_win_edit.SendKeys("calc")
        run_win_ok=run_win.ButtonControl(ClassName="Button",Name='确定')
        run_win_ok.Click()
        sleep(3)

    def calc_auto(self):
        calc_win=auto.WindowControl(ClassName='ApplicationFrameWindow',Name="计算器")
        # 开始计算
        calc_five=calc_win.ButtonControl(Name='五')
        calc_five.Click()
        calc_five.Click()
        calc_mult=calc_win.ButtonControl(Name='乘以')
        calc_mult.Click()
        calc_one = calc_win.ButtonControl(Name='一')
        calc_one.Click()
        calc_three = calc_win.ButtonControl(Name='三')
        calc_three.Click()
        calc_four = calc_win.ButtonControl(Name='四')
        calc_four.Click()
        calc_equal= calc_win.ButtonControl(Name="等于")
        calc_equal.Click()
        sleep(3)
        calc_win_close_btn = calc_win.ButtonControl(AutomationId='Close')
        calc_win_close_btn.Click()


if __name__ == '__main__':
    calc = Calc()
    calc.open_calc()
    calc.calc_auto()

win32gui、win32api、win32con三个包

是python操作桌面、窗口常用的包,适用于小型的自动化脚本

评价:

优点:终于!!!这个是可以做到不用鼠标实现点击操作的工具!!!!!

缺点:代码难写 难懂 集成度小,api很少,适用的控件少的可怜  唉 市面上的软件几乎都用不了 哭死

自动点击出现的提示messageBox代码示例:
 

import win32gui
import win32api
import win32con
import time
# 定义函数查找窗口中符合条件的控件句柄
def find_control(hwnd, control_class, control_name):
    handle = win32gui.FindWindowEx(hwnd, None, control_class, control_name)
    return handle

# 通过窗口标题查找窗口句柄
while True:
    hwnd = win32gui.FindWindow(None, "错误")  # 找名为错误的窗口
    if hwnd ==0:
        hwnd = win32gui.FindWindow(None, "下载成功")  # 找名为下载成功的窗口
    for i in range(3):
        try:
            if hwnd != 0:
                # 查找“确定”按钮的句柄
                button_hwnd = find_control(hwnd, "Button", "确定")  # 找hwnd为父组件  控件类属为Button text名为确定的控件的句柄
                if button_hwnd != 0:  # 对该句柄进行操作
                    # 模拟鼠标左键点击该按钮
                    win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0)
                    win32api.PostMessage(button_hwnd, win32con.WM_LBUTTONUP, None, 0)
                    print("已点击确定按钮")
                else:
                    print("未找到指定按钮")
            else:
                print("未找到指定窗口",end='')
        except:
            print("出错!")
    time.sleep(1)

pyautogui

我主要就是用的这个库写的某站的脚本  这个所有控件都适用(因为它不以控件来定位)  但是不适合大型自动化脚本。通过图片识别等方式或点击固定区域进行自动化操作

评价:
优点:是非控件的自动化工具,其中的图像识别点击是一大亮点

缺点:图像识别不能保证正确(能设置识别度) 最近发现在副屏幕好像几乎识别不了;完全非控件的话会很不方便

综上所述  个人而言  uiautomation是最佳选择

<think>好的,我现在需要帮助用户找到适合Python进行WPF应用自动化测试的工具和相关教程。首先,我需要回想一下常见的Python自动化测试框架,特别是那些支持桌面应用,尤其是WPF的。 首先,用户提到了WPF,这是Windows Presentation Foundation,属于微软的技术栈。通常,这类应用的自动化测试可能需要与UI元素交互,所以需要工具能够识别和操作WPF控件。Python的库中,我知道有Pywinauto,它支持Windows GUI应用的自动化,可能包括WPF。不过不确定是否直接支持,或者是否需要其他辅助工具。 另一个可能性是使用UI Automation框架,微软的UI Automation是专门为辅助技术设计的,但也可以用于测试。Python中是否有库可以调用UI Automation的接口?比如,可能有pyautogui,但pyautogui更多是基于图像和坐标的,对于控件层次的识别可能不够。或者,使用IronPython,因为IronPython可以集成到.NET环境,直接调用WPF的UI自动化库,但用户可能更倾向于使用标准的Python(CPython)。 另外,是否有基于Selenium的扩展?不过Selenium主要用于Web应用,可能不适用于WPF。但或许有类似原理的工具,比如Appium,它支持桌面应用的自动化测试,但配置起来可能比较复杂。 接下来,我需要验证这些工具的适用性。查阅资料,Pywinauto确实支持Win32应用,而WPF虽然基于.NET,但Pywinauto通过UI Automation也可以处理。例如,Pywinauto的backend="uia"可以用于WPF应用的控件识别。因此,用户可能需要使用Pywinauto并设置正确的backend。 此外,另一个工具是TestStack.White,不过这是基于.NET的,可能需要使用C#。但用户希望用Python,所以可能需要借助Python.NET桥接库,比如pythonnet,来调用White库。不过这样可能会增加复杂性,特别是对于不熟悉.NET的Python开发者来说。 因此,可能更推荐使用Pywinauto,因为它原生支持Python,并且通过UI Automation可以处理WPF控件。需要确认是否有相关教程或示例代码。例如,Pywinauto的官方文档中可能有涉及WPF的部分,或者社区中的案例。 另外,用户可能需要了解如何定位WPF控件,比如使用自动化ID、控件类型等属性。在WPF中,可以通过设置AutomationProperties.AutomationId来为元素添加唯一的标识,方便测试工具识别。 关于教程,我需要查找是否有使用Pywinauto测试WPF的具体步骤。比如,安装Pywinauto,启动应用程序,连接到进程,然后通过识别窗口和控件进行操作。例如,查找按钮、输入框等,并模拟点击或输入。 此外,可能还需要考虑工具的限制,比如Pywinauto在处理复杂WPF控件时的兼容性问题,或者是否需要启用UI Automation的支持。有些情况下,可能需要开发人员为控件设置适当的自动化属性,以便测试工具能够识别。 总结下来,可能的工具包括: 1. Pywinauto(推荐,Python库,支持UI Automation) 2. Appium(配置复杂,可能需要其他组件) 3. 结合pythonnet和TestStack.White(需要.NET环境,可能较复杂) 然后,用户需要教程资源。可以建议查看Pywinauto的官方文档,搜索专门的博客文章,或者视频教程。例如,在GitHub上Pywinauto的示例仓库,或者Stack Overflow上的相关问题。 另外,可能存在的挑战包括如何获取控件的自动化属性,如何处理动态生成的控件,以及如何同步测试脚本与应用程序的响应速度。这些都是需要在实际操作中注意的点。 最后,需要确保推荐的教程和工具是当前维护良好的,避免推荐过时的资源。例如,Pywinauto的最近更新情况,或者是否有活跃的社区支持。</think>### Python WPF 自动化测试工具及教程 针对WPF(Windows Presentation Foundation)应用的自动化测试,Python生态中有以下工具和方案: --- #### **1. Pywinauto(推荐)** - **工具简介**: Pywinauto是一个用于Windows GUI自动化Python库,支持Win32和UI Automation(包括WPF)[^1]。通过`backend="uia"`设置,可直接操作WPF控件。 - **使用方法**: 1. **安装库**: ```bash pip install pywinauto ``` 2. **连接WPF应用**: ```python from pywinauto import Application app = Application(backend="uia").start("YourApp.exe") window = app.window(title="MainWindow") ``` 3. **操作控件**: ```python # 输入文本 window.Edit.set_text("Hello, WPF!") # 点击按钮 window.Button.click() ``` - **关键点**: - WPF控件需设置`AutomationProperties.AutomationId`以增强可操作性[^2]。 - 使用`Inspect.exe`(Windows SDK工具)查看控件属性。 - **教程资源**: - [官方文档](https://pywinauto.readthedocs.io/en/latest/) - [WPF自动化示例](https://github.com/pywinauto/pywinauto/issues/472) --- #### **2. Appium + WinAppDriver** - **工具简介**: Appium通过WinAppDriver支持Windows桌面应用测试,需搭配Selenium语法[^3]。 - **配置步骤**: 1. **安装依赖**: - 安装[WinAppDriver](https://github.com/Microsoft/WinAppDriver)。 - 启动服务:默认端口`4723`。 2. **Python脚本示例**: ```python from appium import webdriver desired_caps = { "app": "YourApp.exe", "platformName": "Windows" } driver = webdriver.Remote("http://127.0.0.1:4723", desired_caps) element = driver.find_element_by_accessibility_id("Button1") element.click() ``` - **适用场景**: 需要跨平台或多技术栈(如混合应用)的测试。 --- #### **3. Pythonnet + TestStack.White(需.NET集成)** - **工具简介**: `TestStack.White`是.NET的UI测试框架,可通过`pythonnet`在Python中调用。 - **配置步骤**: 1. **安装依赖**: ```bash pip install pythonnet ``` 2. **Python脚本示例**: ```python import clr clr.AddReference("White.Core") from TestStack.White import Application app = Application.Launch("YourApp.exe") window = app.GetWindow("MainWindow") button = window.Get(SearchCriteria.ByAutomationId("Button1")) button.Click() ``` - **限制**: 需熟悉.NET生态,且需WPF应用暴露自动化接口。 --- ### **教程推荐** 1. **Pywinauto实战教程**: - [使用Pywinauto测试WPF应用](https://zhuanlan.zhihu.com/p/373402454) 2. **Appium + WinAppDriver**: - [微软官方WinAppDriver文档](https://github.com/Microsoft/WinAppDriver) 3. **WPF控件自动化属性设置**: - [MSDN: UI Automation Fundamentals](https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-fundamentals) ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值