Airtest测试Windows窗口翻车?还是想跟你们聊聊测试win窗口的一些问题

版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
此文章来源于项目官方公众号:“AirtestProject”

前言

很多同学反馈在测试Windows应用窗口的时候,经常遇到 窗口连接不上不知道窗口句柄是什么 ,发送 删除/回车keyevent 的时候总是 不生效 的情况,所以今天我们带大家一起来看看用airtest测试Windows窗口的常见问题。

1.在IDE中连接Windows窗口

airtest提供了多种连接Windows应用窗口的方法,嵌入式连接和无嵌入式连接等,如果你使用嵌入式连接的方式不能正常连接待测的Windows窗口,比如出 现窗口被拉伸窗口黑屏不能正常录制脚本 等情况,你还可以选择用无嵌入式连接或桌面模式。

嵌入式连接

而嵌入式连接又分两种,一种是“选定窗口”,另外一种是“搜索窗口”。

“选定窗口”的方式很简单,直接在IDE的Windows窗口连接那块面板上点击“选定窗口”,之后再把鼠标移动到待测窗口上,此时待测窗口会被一个绿色的矩形框圈住,单击鼠标左键即可把待测窗口嵌入到我们的IDE中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GSaIdyme-1594810082407)(https://note.youdao.com/yws/public/resource/3304e6dc5125f0b2a20423dea86ea776/xmlnote/EE2DDA1FCC4143208E8AF9ABB7E464A0/26734)]

当然如果我们不使用“选定窗口”,而是使用其旁边的“搜索窗口”,IDE则会弹出一个当前所有已打开窗口的title列表,此时我们只需要找到待测窗口的title,然后点击右侧对应的 连接 按钮即可把应用窗口嵌入到我们的IDE中:

image

无嵌入式连接

无嵌入式连接,即 不用把应用窗口嵌入到IDE 上去,依旧可以对待测应用进行自动化测。在IDE的顶部菜单栏依次选择 选项--设置--勾选上Windows窗口无嵌入连接--OK ,之后再点击“选定窗口”,将鼠标移动到待测窗口上并单击,此时应用窗口没有被嵌入到IDE中,并且IDE的设备窗口也会自动隐藏起来。之后我们就可以像嵌入窗口那样对待测应用进行自动化测试操作:

image

桌面模式

假如同学们想要测试的窗口不止一个(即拥有多个不同的窗口句柄),单独 嵌入/选定 一个窗口可能无法满足测试需求,此时我们就可以使用“桌面模式”。

image

点击桌面模式按钮,此时AirtestIDE右侧的设备窗口将会完全隐藏,进入Windows桌面模式。在此模式下,录制脚本与运行脚本都与正常情况下没有区别,只不过执行时将会对整个桌面进行截图识别,甚至可以识别到AirtestIDE代码窗口里的截图语句(因此在执行脚本时,请尽量缩小AirtestIDE的窗口,避免脚本界面里的截图干扰执行结果)。

image

2.用代码连接Windows窗口

使用窗口句柄

在AirtestIDE里连接的窗口,都是用窗口句柄连接的。窗口句柄是每个Windows窗口对象拥有的独一无二的32位无符号整数,而且每次打开窗口,句柄的数值都会变化

这就意味着,假如我们用某个窗口嵌入到AirtestIDE里写出了一个脚本,虽然这次可以直接运行,但是通过复制AirtestIDE里的脚本命令行的方式,是无法保证下一次还能够运行的。因为AirtestIDE里的命令行,将会有这样的参数内容 --device Windows:///句柄,而下次再打开窗口,可能句柄已经发生了变化。

image

使用句柄连接窗口的脚本我们可以这么写:

auto_setup(__file__,devices=["Windows:///133194"])

但是该连接脚本仅对本次打开的Windows窗口有效,如果Windows窗口被关闭后重新打开,句柄也将会发生变化,该脚本失效。

使用正则表达式

上文我们提到,使用“搜索窗口”连接窗口的时候,IDE会列出当前所有打开窗口的title,我们可以 写一个正则表达式去匹配到待测窗口的title,并使用这个正则表达式来连接该窗口:

# 例如匹配“吹梦到西洲”后面跟着换行符以外的任意字符的窗口title
auto_setup(__file__,devices=["Windows:///?title_re=吹梦到西洲.*"])

image

大多数情况下,窗口的title比较不容易变化,所以使用正则表达式匹配窗口title来连接待测窗口的脚本,会相对稳定些。

连接整个桌面

如果不需要置顶某个窗口应用的话,我们还可以使用如下代码直接连接整个桌面来做自动化:

auto_setup(__file__,devices=["Windows:///"])

3.在Windows应用上发keyevent

最后我们来看一下在Windows应用上发送 keyevent 的失效的问题。举个很常见的例子:很多同学反馈,自己想在Windows窗口的某个输入框内删除一些字符,所以使用了 DELETE 这个键码,但是实际运行效果是不仅没有生效,而且还把键码 DELETE 写到了输入框里面,这是为什么呢?

其实是因为同学们把Android的按键码和Windows的按键码混淆了。Android的按键码是基于ADB的,而Airtest的Windows模块则封装使用了pywinauto 支持的按键码,所以这就导致了 DELETE 键码在Android设备中生效,而在Windows窗口就不生效。

pywinauto 库中,删除的键码实际上是 {DELETE} ,所以我们想要在Windows窗口上实现删除字符的效果,可以这么写:

keyevent("{DELETE}")

更多Windows的键码可以参照下图,我们可以看到,Windows的键码都是用 {} 框起来的:

image

keyevent()中不使用 {} 框起来的字符,都会被当成需要输入的字符串,被输入到Windows窗口的输入框上。

Airtest官网:http://airtest.netease.com/
Airtest教程官网:https://airtest.doc.io.netease.com/
搭建企业私有云服务:https://airlab.163.com/b2b

你可以使用element-ui提供的表单验证来验证该字段是否为空。示例代码如下: ``` <template> <el-form :model="form" :rules="rules" ref="form"> <el-form-item label="事故形态" prop="xingtai" pop="xingtai"> <el-select v-model="form.xingtai" @change="chaxingtai(form.xingtai)" placeholder="请选择事故形态" size="small" > <el-option label="碰撞" value="碰撞"></el-option> <el-option label="刮蹭" value="刮蹭"></el-option> <el-option label="碾压" value="碾压"></el-option> <el-option label="翻车" value="翻车"></el-option> <el-option label="坠车" value="坠车"></el-option> <el-option label="失火" value="失火"></el-option> <el-option label="撞固定物" value="撞固定物"></el-option> <el-option label="撞静止车辆" value="撞静止车辆"></el-option> <el-option label="其他" value="其他"></el-option> </el-select> <div v-if="xingtaiqita" style="width: 200px"> <el-input type="textarea" v-model="form.select_1" size="small" clearable ></el-input> </div> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script> export default { data() { return { form: { xingtai: '', select_1: '' }, xingtaiqita: false, rules: { xingtai: [ { required: true, message: '请选择事故形态', trigger: 'change' } ] } } }, methods: { chaxingtai(value) { if (value === '其他') { this.xingtaiqita = true } else { this.xingtaiqita = false } }, submitForm() { this.$refs.form.validate(valid => { if (valid) { // 表单验证通过,提交表单 console.log('submit') } else { // 表单验证失败 console.log('error submit') return false } }) } } } </script> ``` 在上面的代码中,我们给`el-form-item`组件设置了`prop`属性为`xingtai`,这是为了在验证时使用。在`rules`中,我们设置了`xingtai`字段必填,如果该字段为空,则会提示用户选择事故形态。在`submitForm`方法中,我们调用了`this.$refs.form.validate()`方法来进行表单验证,如果验证成功,则可以提交表单,否则会提示用户错误信息。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值