JAVA 使用WinAppDriver对QT桌面软件进行自动化测试

一、前置条件

1. 准备工具

工具名称 描述 下载地址
WinAppDriver.exe 支持桌面软件UI自动化测试的服务 https://github.com/Microsoft/WinAppDriver/releasesWinAppDriverUiRecorder
inspect.exe 控件识别工具,可以获取桌面软件各元素的属性参数,一般情况下,在路径C:\Program Files (x86)\Windows Kits\10\bin\x64\\x64下,如果没有,需要单独下载window sdk安装 window sdk安装,下载地址https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/,安装时在最后一步install之前,只需选择”Windows SDK Signing Tools for Desktop Apps“和”Windows SDK for UWP Managed Apps“两项
WinAppDriverUiRecorder(UI记录器) 区别于inspect.exe,UI记录器工具可以检查UI元素并检索它们的XPath表达式,也可以为某些操作生成对应的C#代码。 https://github.com/Microsoft/WinAppDriver/releases

2. 环境搭建

  1. win10操作系统下,在设置 -> 更新和安全 -> 开发者选项下设置为“开发人员模式”;
  2. 下载、安装WinAppDriver.exe
  3. 准备好inspect.exe、WinAppDriverUiRecorder 查询工具。

二、Java自动化测试框架搭建

1. pom依赖

<dependencies><!-- appium自动化测试工具 --><dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version>7.0.0</version><scope>test</scope></dependency><!-- testng测试框架 --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.1.0</version><scope>test</scope></dependency><!-- 基于selenium的自动化测试工具 --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.14.0</version></dependency>
</dependencies>
<!-- 定位testng.xml,执行指定测试操作 -->
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19</version><configuration><suiteXmlFiles><suiteXmlFile>src/test/java/com/wyj/qt/ui/test/testcase/testng.xml</suiteXmlFile></suiteXmlFiles></configuration></plugin></plugins>
</build>

2. testng测试框架

使用TestNG框架进行自动化测试
testng.xml:TestNG测试脚本,可以通过该文件指定运行部分测试脚本

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite verbose="0" name="TestMainWindowCase" parallel="false"><test name="QtUiTest" preserve-order="false"><!-- 指定包测试--><!--<packages><package name="com.wyj.qt.ui.test.testcase" /></packages>--><!-- 指定类测试--><!--<classes><class name="com.wyj.qt.ui.test.testcase.MainWindowTest"/></classes>--><!-- 指定方法测试--><classes><class name="com.wyj.qt.ui.test.testcase.MainWindowTest" ><methods><include name="textAreaTest" /></methods></class></classes></test>
</suite>

3. 测试准备

  1. 启动WinAppDriver.exe;

  2. 初始化WindowsDriver:

    private static final String QT_UI_APPID = "C:\\...\\qt-test-ui.exe";
    private static WindowsDriver driver = null;@BeforeClass
    public static void setup() throws IOException {try {DesiredCapabilities capabilities = new DesiredCapabilities();capabilities.setCapability("app", QT_UI_APPID);capabilities.setCapability("platformName", "Windows");driver = new WindowsDriver(new URL("http://127.0.0.1:4723"), capabilities);driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);} catch (MalformedURLException e) {e.printStackTrace();} finally {}
    }
    

三、 QT控件测试

WindowsDriver可以通过多种方式定位到软件中的某一个元素(WebElement),常用查找方法和inspect.exe中的属性对应关系如下表:

方法 inspect.exe中对应的属性名
findElementByName Name
findElementByClassName ClassName
findElementByAccessibilityId AutomationId

在QT软件中,需要每个控件指定控件的name,用findElementByName方法确定某一元素。

以测试QT桌面软件为例,测试各常用控件

  1. 输入框测试

     // 根据inspect.exe确定nameWebElement element = this.driver.findElementByName("accessiableName_LineEdit");// 模拟鼠标点击,聚焦element.click();// 简单的模拟输入element.sendKeys("test");// 获取输入后的值String content = element.getText();// 与期望值进行比较Assert.assertEquals("test", content);
    
  2. 下拉框测试

     // 根据inspect.exe确定nameWebElement element = this.driver.findElementByName("accessiableName_ComboBox Down");// 模拟鼠标点击,弹出下拉选项element.click();// 确定需要选择的选项(qt软件中,下拉框的选项的name与其显示的值一致)String selectValue = "贲门";// 通过findElement,树形结构向下检索需要定位的elementWebElement element1 =  element.findElement(By.name("AccessiableName_QComboBoxListView AccessiableName_QComboBoxListView")).findElement(By.name(selectValue));// 模拟鼠标选择点击事件element1.click();// 获取输入后的值String content = element.getText();// 与期望值进行比较Assert.assertEquals(selectValue, content);
    
  3. 弹窗测试

    // 根据inspect.exe确定name
    WebElement element = this.driver.findElementByName("accessiableName_PushButton");
    // 模式鼠标点击按钮,弹出弹框
    element.click();
    // 获取当前窗体的句柄,并获得最顶层messageBox name
    String messageBox = this.driver.getWindowHandles().toArray()[0].toString();
    // 定位到顶层messageBox
    this.driver.switchTo().window(messageBox);
    // 根据inspect.exe确定弹窗按钮
    WebElement element1 = this.driver.findElementByName("OK Enter");
    // 模拟点击弹窗上的按钮
    element1.click();
    
  4. 单选测试

    // 根据inspect.exe确定name
    WebElement element = this.driver.findElementByName("accessiableName_RadioButton");
    // 模拟单选选中
    element.click();
    // 获取单选选中后的值
    String value = element.getAttribute("SelectionItem.IsSelected");
    boolean radioValue = "True".equals(value);
    Assert.assertEquals(true, radioValue);
    // 模拟取消选中
    element.click();
    value = element.getAttribute("SelectionItem.IsSelected");
    boolean radioValue = "True".equals(value);
    Assert.assertEquals(false, radioValue);
    
  5. 多选测试

    // 根据inspect.exe确定name
    WebElement element = this.driver.findElementByName("accessiableName_CheckBox");
    // 模拟多选框选中
    element.click();
    // 获取多选框后的值
    String value = element.getAttribute("Toggle.ToggleState");
    boolean checkValue = "1".equals(value);
    Assert.assertEquals(true, radioValue);
    // 模拟取消选中
    element.click();
    value = element.getAttribute("Toggle.ToggleState");
    boolean checkValue = "1".equals(value);
    Assert.assertEquals(false, checkValue);
    
  6. 文本框测试

    // 根据inspect.exe确定name
    WebElement element = this.driver.findElementByName("accessiableName_TextEdit");
    // 模拟鼠标定位聚焦
    element.click();
    // 清空文本框
    element.clear();
    // element可以做简单的点击、输入操作,比较复杂的操作可以借助Actions对象来完成
    Actions actions = new Actions(this.driver);
    // 模拟键盘输入值
    actions.sendKeys(element, “123”);
    // 执行
    actions.perform();
    // 获取文本框的录入值
    String value = element.getText();
    // 与期望值进行比较
    Assert.assertEquals("123", value);
    
  7. 菜单测试

    // 借助WinAppDriverUiRecorder工具,可以获取元素的xml,可以通过xpath的方式定位元素
    WebElement element = this.driver.findElementByXPath("//MenuItem[@Name='File']");
    // 模式鼠标点击
    element.click();
    // 由于弹出菜单选项后,并不能在当前窗体中定位弹出的菜单,于是新建一个桌面的driver对象去重新定位需要操作的菜单选项
    DesiredCapabilities appCapabilities = new DesiredCapabilities();
    appCapabilities.setCapability("app", "Root");
    appCapabilities.setCapability("deviceName", "WindowsPC");
    WindowsDriver destopRoot = new WindowsDriver<WindowsElement>(new URL(windowsApplicationDriverUrl), appCapabilities);
    // 重新定位新的菜单按钮
    WebElement element1 = destopRoot.findElementByName("test1");
    element1.click();
    

四、测试报告

全部执行完测试方法后,会在项目target/surefire-reports/目录下生成测试报告emailable-report.html,可以查看通过和失败的用例及执行情况。

JAVA 使用WinAppDriver对QT桌面软件进行自动化测试相关推荐

  1. JAVA 使用WinAppDriver对PC桌面软件进行自动化测试

    一.前置条件 1. 准备工具 WinAppDriver.exe    支持桌面软件UI自动化测试的服务    https://github.com/Microsoft/WinAppDriver/rel ...

  2. Java Swing图书管理系统桌面软件附源码

    Java Swing图书管理系统桌面软件附源码,亲测可运行. 功能界面如下: 登录界面,默认账号admin密码admin 主功能界面: 添加图书功能界面: 部分源码: 完整源码下载地址: JavaSw ...

  3. Qt 桌面悬浮画图软件--电子白板V1

    Qt 桌面悬浮画图软件--电子白板V1 交互式电子教学桌面悬浮画板 Qt实现桌面悬浮画图软件,B站授课老师录像或直播的首选软件,及时桌面顶层绘制. 功能: 按钮一:移动.通过拖拽实现窗体移动. 按钮二 ...

  4. Qt 桌面悬浮画图软件--电子白板

    Qt 桌面悬浮画图软件--电子白板 V2在V1版本基础上增加强大功能. Qt交互式电子教学桌面悬浮画板. Qt实现桌面悬浮画图软件,B站授课老师录像或直播的首选软件,及时桌面顶层绘制. 目录 Qt 桌 ...

  5. 基于Qt Designer和PyQt5的桌面软件开发--环境搭建和入门例子

      本文介绍了如何使用技术栈PyCharm+Qt Designer+PyQt5来开发桌面软件,从环境搭建.例子演示到对容易混淆概念的解释.文中用到的全部软件+代码下载链接为:https://url39 ...

  6. python可以开发桌面应用软件吗_用Python可以开发出桌面软件吗?

    网友解答: 这个可以肯定的说,是可以的.python作为一门胶水型语言,涉及的面众多,包含大量第三方库,功能强大,要是连一个桌面软件都不能开发,怎么说的过去,下面我主要说一下几个常用的开发GUI程序的 ...

  7. C语言开发windows桌面程序,开发 windows 桌面软件,现在主流用什么技术?

    桌面软件还是得win32,工具只有两个选择vc和delphi,不建议用.net,存在部署问题. 还有大佬说 桌面还是老老实实C#吧,看需求选择WPF或者Winforms 或者干脆激进一点,直接上win ...

  8. 把html变成桌面的软件,5 分钟把任意网站变成桌面软件

    原标题:5 分钟把任意网站变成桌面软件 以前,开发一个桌面软件要花费大量的人力和时间.现在,随着 web技术的快速发展,很多业务逻辑已经在网站上实现.既然如此,能不能把网站快速转变成软件呢?这方面的实 ...

  9. 50款可以替代桌面软件的在线服务

    本文原文来自于Web.AppStorm的50 Great Web Alternatives to Desktop Software,个人觉得里面提到的很多在线服务很不错,并且很多也在天涯海阁介绍过,所 ...

最新文章

  1. AI一分钟 | 别了老司机!深圳无人驾驶公交车霸气上路;乌镇上演最强饭局,丁磊王兴刘强东大宴宾客
  2. 深入探索边缘计算:物联网与5G时代的技术趋势
  3. 实现磁贴的效果的一种方法
  4. C++中的位运算和|
  5. 科大讯飞同时公布年报和一季度报,冰火两重天
  6. java token跨域,java 允许跨域
  7. NLP多任务学习:一种层次增长的神经网络结构 | PaperDaily #16
  8. mysql数据库备份 dump_MySQL数据库备份之mysqldump
  9. 前端学习(1313):get请求参数
  10. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...
  11. python字典popitem_Python 字典(Dictionary) | 菜鸟教程
  12. VC++的链接错误LNK2001zz
  13. Maven构建springBoot Demo案例
  14. JavaScript深入之从原型到原型链 1
  15. 【数据融合】基于matlab拓展卡尔曼滤波IMU和GPS数据融合【含Matlab源码 1600期】
  16. Packet Voice Modeling 语音包模型
  17. 一种APP和微信远程组态监控台达PLC的方案
  18. 百练2815:城堡问题题解 深度优先搜索解法
  19. 音乐心理学 | 《聆听心声》笔记
  20. 如何在Python中四舍五入数字

热门文章

  1. KiCad设计PCB-16-红外发射和红外接收管的原理图设计
  2. 分布式锁和数据一致性的讨论——redis集群做分布式锁的风险
  3. hdu6112.今夕何夕
  4. mavon-editor 保存的html显示问题
  5. Windows程序设计-多任务和多线程
  6. 在剪切板中使用自定义格式的数据
  7. oracle flashback 功能,开启oracle的flashback闪回功能
  8. 【疾病分类】模糊逻辑分类叶病严重程度分级系统【含GUI Matlab源码 194期】
  9. C++常用标准模板库——algorithm
  10. 忆享科技专注API治理,护航智慧医疗数据安全