WinAppDriver 自动化测试winform程序

本文介绍了WinAppDriver这款工具如何用于Windows系统上的WinForms程序自动化测试,包括环境设置、Windows自动化脚本编写、元素定位示例以及UWP和WPF应用的支持。详细讲解了如何安装WinAppDriver,以及如何通过AppID进行UWP应用的自动化测试。
摘要由CSDN通过智能技术生成

WinAppDriver 自动化测试winform程序

前言

WinAppDriver是Windows系统上的一个应用程序驱动工具,开源免费。与Selenium工具类似,都是用来实现产品UI自动化测试的一个工具。

WinAppDriver运行时对系统是有要求的,只能运行在Windows10或Windows Server 2016以上系统。如果测试程序兼容性,WinAppDriver很显然不能满足Windows10或Windows Server 2016以下系统的测试。因此使用WinAppDriver实现的自动化测试脚本是有局限性的。

WinAppDriver支持测试UWP、WinForms、WPF、Win32应用程序。

UWP: Universal Windows Platform,即Windows通用应用平台,在Windows 10 Mobile/Surface(Windows平板电脑)/PC/Xbox/HoloLens等平台上运行。它并不是为某一个终端而设计,而是可以在所有Windows10设备上运行。

WinForms: Windows Forms,是微软的.NET开发框架的图形用户界面部分,该组件通过将现有的Windows API(Win32 API)封装为托管代码提供了对Windows本地(native)组件的访问方式。

WPF: Windows Presentation Foundation,是微软推出的基Windows的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

Win32: Classic Windows,是标准windows程序,完全拥有window的特性,可以通过鼠标点击窗口来完成控制。

在这里插入图片描述

1. 环境搭建

前提条件

电脑系统需要Windows 10或Windows Server 2016或者更高版本,这是前提条件

1.1 打开Windows PC的开发者模式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2 下载Windows driver并安装

github下载地址:https://github.com/Microsoft/WinAppDriver/releases

在这里插入图片描述

选择与你电脑对应的exe安装

安装好之后,运行WinAppDriver.exe(记得要用admin权限运行), 默认路径 (C:\Program Files (x86)\Windows Application Driver)

也可以自定义地址或端口:
在cmd窗口中输入

WinAppDriver.exe 4727
WinAppDriver.exe 127.0.0.1 4725
WinAppDriver.exe 127.0.0.1 4723/wd/hub

在这里插入图片描述

在这里插入图片描述
这样就说明运行成功

2. Windows 自动化脚本

运行脚本前要打开 WinAppDriver.exe

对于Windows App来说,只需要传一个app capabilities 即可。

对于UWP的App,app对应的值为Application Id(App ID)。关于如何获取APP ID,可以使用powershell命令get-StartApps来获取,打开powershell终端运行:get-StartApps | select-string "计算器"即可获取值(运行命令之前先打开计算器)。

DesiredCapabilities appCapabilities = new DesiredCapabilities();
appCapabilities.SetCapability("app", CalculatorAppId);
appCapabilities.SetCapability("deviceName", "WindowsPC");
appCapabilities.SetCapability("platformName", "Windows");
session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);

3. Windows定位元素

使用Windows SDK提供的工具inspect.exe(C:\Program Files (x86)\Windows Kits\10\bin\x86或者C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64根据系统查看)来定位,详情查看inspect,或者使用AccExplorer32、UISpy定位。
支持的定位方式:

在这里插入图片描述

4. 示例

这个是官方给的示例

CalculatorSession.cs

using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Remote;
using System;

namespace CalculatorTest
{
    public class CalculatorSession
    {
        // Note: append /wd/hub to the URL if you're directing the test at Appium
        private const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
        private const string CalculatorAppId = "Microsoft.WindowsCalculator_8wekyb3d8bbwe!App";

        protected static WindowsDriver<WindowsElement> session;

        public static void Setup(TestContext context)
        {
            // Launch Calculator application if it is not yet launched
            if (session == null)
            {
                // Create a new session to bring up an instance of the Calculator application
                // Note: Multiple calculator windows (instances) share the same process Id
                DesiredCapabilities appCapabilities = new DesiredCapabilities();
                appCapabilities.SetCapability("app", CalculatorAppId);
                appCapabilities.SetCapability("deviceName", "WindowsPC");
                appCapabilities.SetCapability("platformName", "Windows");
                session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
                Assert.IsNotNull(session);

                // Set implicit timeout to 1.5 seconds to make element search to retry every 500 ms for at most three times
                session.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1.5);
            }
        }

        public static void TearDown()
        {
            // Close the application and delete the session
            if (session != null)
            { 
                session.Quit();
                session = null;
            }
        }
    }
}

ScenarioStandard.cs

using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.Appium.Windows;
using System.Threading;
using System;

namespace CalculatorTest
{
    [TestClass]
    public class ScenarioStandard : CalculatorSession
    {
        private static WindowsElement header;
        private static WindowsElement calculatorResult;

        [TestMethod]
        public void Addition()
        {
            // Find the buttons by their names and click them in sequence to perform 1 + 7 = 8
            session.FindElementByName("一").Click();
            session.FindElementByName("加").Click();
            session.FindElementByName("七").Click();
            session.FindElementByName("等于").Click();
            Assert.AreEqual("8", GetCalculatorResultText());
        }

        [TestMethod]
        public void Division()
        {
            // Find the buttons by their accessibility ids and click them in sequence to perform 88 / 11 = 8
            session.FindElementByAccessibilityId("num8Button").Click();
            session.FindElementByAccessibilityId("num8Button").Click();
            session.FindElementByAccessibilityId("divideButton").Click();
            session.FindElementByAccessibilityId("num1Button").Click();
            session.FindElementByAccessibilityId("num1Button").Click();
            session.FindElementByAccessibilityId("equalButton").Click();
            Assert.AreEqual("8", GetCalculatorResultText());
        }

        [TestMethod]
        public void Multiplication()
        {
            // Find the buttons by their names using XPath and click them in sequence to perform 9 x 9 = 81
            //session.FindElementByXPath("//Button[@Name='Nine']").Click();
            //session.FindElementByXPath("//Button[@Name='Multiply by']").Click();
            //session.FindElementByXPath("//Button[@Name='Nine']").Click();
            //session.FindElementByXPath("//Button[@Name='Equals']").Click();


            session.FindElementByAccessibilityId("num9Button").Click();
            session.FindElementByAccessibilityId("num9Button").Click();
            session.FindElementByAccessibilityId("multiplyButton").Click();
            session.FindElementByAccessibilityId("num9Button").Click();
            session.FindElementByAccessibilityId("equalButton").Click();
            Assert.AreEqual("891", GetCalculatorResultText());
        }

        [TestMethod]
        public void Subtraction()
        {
            // Find the buttons by their accessibility ids using XPath and click them in sequence to perform 9 - 1 = 8
            session.FindElementByXPath("//Button[@AutomationId=\"num9Button\"]").Click();
            session.FindElementByXPath("//Button[@AutomationId=\"minusButton\"]").Click();
            session.FindElementByXPath("//Button[@AutomationId=\"num1Button\"]").Click();
            session.FindElementByXPath("//Button[@AutomationId=\"equalButton\"]").Click();
            Assert.AreEqual("8", GetCalculatorResultText());
        }

        [TestMethod]
        [DataRow("一",   "加",      "九", "10")]
        [DataRow("九",  "减",     "二",   "8")]
        [DataRow("八", "除以", "二", "4")]
        public void Templatized(string input1, string operation, string input2, string expectedResult)
        {
            // Run sequence of button presses specified above and validate the results
            session.FindElementByName(input1).Click();
            session.FindElementByName(operation).Click();
            session.FindElementByName(input2).Click();
            session.FindElementByName("等于").Click();
            Assert.AreEqual(expectedResult, GetCalculatorResultText());
        }

        [ClassInitialize]
        public static void ClassInitialize(TestContext context)
        {
            // Create session to launch a Calculator window
            Setup(context);

            // Identify calculator mode by locating the header
            try
            {
                header = session.FindElementByAccessibilityId("Header");
            }
            catch
            {
                header = session.FindElementByAccessibilityId("ContentPresenter");
            }            

            // Ensure that calculator is in standard mode
            if (!header.Text.Equals("标准", StringComparison.OrdinalIgnoreCase))
            {
                session.FindElementByAccessibilityId("TogglePaneButton").Click();
                Thread.Sleep(TimeSpan.FromSeconds(1));
                var splitViewPane = session.FindElementByClassName("SplitViewPane");
                splitViewPane.FindElementByName("标准").Click();
                Thread.Sleep(TimeSpan.FromSeconds(1));
                Assert.IsTrue(header.Text.Equals("标准", StringComparison.OrdinalIgnoreCase));
            }

            // Locate the calculatorResult element
            calculatorResult = session.FindElementByAccessibilityId("CalculatorResults");
            Assert.IsNotNull(calculatorResult);
        }

        [ClassCleanup]
        public static void ClassCleanup()
        {
            TearDown();
        }

        [TestInitialize]
        public void Clear()
        {
            session.FindElementByName("清除").Click();
            Assert.AreEqual("0", GetCalculatorResultText());
        }

        private string GetCalculatorResultText()
        {
            return calculatorResult.Text.Replace("显示为 ", string.Empty).Trim();
        }
    }
}

winform程序类似,先获取元素,然后模拟点击,输入框的模拟输入即可。

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WinForm程序通用自动更新是指为了方便用户,程序开发者在软件发布后,能够自动检测当前版本,然后下载并安装最新的版本,从而完成软件的更新。 要实现WinForm程序通用自动更新,可以按照以下步骤进行: 1. 开发者需要在软件中添加一个检查更新的功能模块。这个模块可以通过访问开发者服务器上的一个存放软件最新版本信息的文件,来获取当前版本和最新版本的信息。 2. 当用户打开软件或者进行“检查更新”操作时,程序会自动调用此模块发起请求,并获取服务器上的最新版本信息。 3. 软件通过比较当前版本和最新版本的信息,判断是否有新版本可供更新。如果有新版本,则提示用户进行更新,并提供下载地址。 4. 用户同意更新后,软件会自动下载最新版本的安装包,并进行安装。在下载和安装过程中,可以显示进度条,以提供给用户更好的用户体验。 5. 安装完成后,软件会自动重启,使更新生效。更新成功后,软件会自动提示用户更新已成功,并展示新版本的特性或者功能变更内容。 为了确保WinForm程序通用自动更新的顺利进行,开发者还需要注意以下几点: 1. 保持服务器稳定性和安全性,确保存放最新版本信息的文件得到正确的维护和更新。可以设置访问权限以防止非法获取和篡改。 2. 版本信息的编写要准确和详细,方便用户了解更新内容,并决定是否需要更新。 3. 下载和安装过程中需要提供异常处理机制,以确保程序能够正确处理各种异常情况,并给出相应的错误提示信息。 通过实现WinForm程序通用自动更新功能,可以让用户十分方便地获得软件最新版本的体验和功能,同时也帮助开发者及时推送修复和优化,提高软件的稳定性和用户满意度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeGe&YoYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值