JAVA 使用WinAppDriver对QT桌面软件进行自动化测试
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. 环境搭建
- win10操作系统下,在设置 -> 更新和安全 -> 开发者选项下设置为“开发人员模式”;
- 下载、安装WinAppDriver.exe;
- 准备好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. 测试准备
启动WinAppDriver.exe;
初始化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桌面软件为例,测试各常用控件
输入框测试
// 根据inspect.exe确定nameWebElement element = this.driver.findElementByName("accessiableName_LineEdit");// 模拟鼠标点击,聚焦element.click();// 简单的模拟输入element.sendKeys("test");// 获取输入后的值String content = element.getText();// 与期望值进行比较Assert.assertEquals("test", content);
下拉框测试
// 根据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);
弹窗测试
// 根据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();
单选测试
// 根据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);
多选测试
// 根据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);
文本框测试
// 根据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);
菜单测试
// 借助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桌面软件进行自动化测试相关推荐
- JAVA 使用WinAppDriver对PC桌面软件进行自动化测试
一.前置条件 1. 准备工具 WinAppDriver.exe 支持桌面软件UI自动化测试的服务 https://github.com/Microsoft/WinAppDriver/rel ...
- Java Swing图书管理系统桌面软件附源码
Java Swing图书管理系统桌面软件附源码,亲测可运行. 功能界面如下: 登录界面,默认账号admin密码admin 主功能界面: 添加图书功能界面: 部分源码: 完整源码下载地址: JavaSw ...
- Qt 桌面悬浮画图软件--电子白板V1
Qt 桌面悬浮画图软件--电子白板V1 交互式电子教学桌面悬浮画板 Qt实现桌面悬浮画图软件,B站授课老师录像或直播的首选软件,及时桌面顶层绘制. 功能: 按钮一:移动.通过拖拽实现窗体移动. 按钮二 ...
- Qt 桌面悬浮画图软件--电子白板
Qt 桌面悬浮画图软件--电子白板 V2在V1版本基础上增加强大功能. Qt交互式电子教学桌面悬浮画板. Qt实现桌面悬浮画图软件,B站授课老师录像或直播的首选软件,及时桌面顶层绘制. 目录 Qt 桌 ...
- 基于Qt Designer和PyQt5的桌面软件开发--环境搭建和入门例子
本文介绍了如何使用技术栈PyCharm+Qt Designer+PyQt5来开发桌面软件,从环境搭建.例子演示到对容易混淆概念的解释.文中用到的全部软件+代码下载链接为:https://url39 ...
- python可以开发桌面应用软件吗_用Python可以开发出桌面软件吗?
网友解答: 这个可以肯定的说,是可以的.python作为一门胶水型语言,涉及的面众多,包含大量第三方库,功能强大,要是连一个桌面软件都不能开发,怎么说的过去,下面我主要说一下几个常用的开发GUI程序的 ...
- C语言开发windows桌面程序,开发 windows 桌面软件,现在主流用什么技术?
桌面软件还是得win32,工具只有两个选择vc和delphi,不建议用.net,存在部署问题. 还有大佬说 桌面还是老老实实C#吧,看需求选择WPF或者Winforms 或者干脆激进一点,直接上win ...
- 把html变成桌面的软件,5 分钟把任意网站变成桌面软件
原标题:5 分钟把任意网站变成桌面软件 以前,开发一个桌面软件要花费大量的人力和时间.现在,随着 web技术的快速发展,很多业务逻辑已经在网站上实现.既然如此,能不能把网站快速转变成软件呢?这方面的实 ...
- 50款可以替代桌面软件的在线服务
本文原文来自于Web.AppStorm的50 Great Web Alternatives to Desktop Software,个人觉得里面提到的很多在线服务很不错,并且很多也在天涯海阁介绍过,所 ...
最新文章
- AI一分钟 | 别了老司机!深圳无人驾驶公交车霸气上路;乌镇上演最强饭局,丁磊王兴刘强东大宴宾客
- 深入探索边缘计算:物联网与5G时代的技术趋势
- 实现磁贴的效果的一种方法
- C++中的位运算和|
- 科大讯飞同时公布年报和一季度报,冰火两重天
- java token跨域,java 允许跨域
- NLP多任务学习:一种层次增长的神经网络结构 | PaperDaily #16
- mysql数据库备份 dump_MySQL数据库备份之mysqldump
- 前端学习(1313):get请求参数
- android开机自动开启zram,低内存配置 | Android 开源项目 | Android Open Source Project...
- python字典popitem_Python 字典(Dictionary) | 菜鸟教程
- VC++的链接错误LNK2001zz
- Maven构建springBoot Demo案例
- JavaScript深入之从原型到原型链 1
- 【数据融合】基于matlab拓展卡尔曼滤波IMU和GPS数据融合【含Matlab源码 1600期】
- Packet Voice Modeling 语音包模型
- 一种APP和微信远程组态监控台达PLC的方案
- 百练2815:城堡问题题解 深度优先搜索解法
- 音乐心理学 | 《聆听心声》笔记
- 如何在Python中四舍五入数字