antd table设置表格一个单元格的字体颜色_演练:操作 Qt 应用中的表格

本文介绍 了针对 Qt 中的 TableView 组件的开发自动化脚本。

背景

有表格数据需要批量导入到目标应用的表格中,手动导入比较繁琐,目标是通过自动化的方式导入。导入的操作包括数据源的读写、应用中表格的修改等。现在我们针对 Qt4 提供的“SpreadSheet”演示应用进行操作。

ab6c7e632a5ada4f04cbddcdb38f2f45.png
SpreadSheet应用

本次演练中仍然针对 Windows 7 平台、Qt4.8 的环境实现,然而脚本也适用于更高版本的 Windows 平台。

目标

了解如何使用 CukeTest 进行 Qt 表格(即 TableView 控件)的操作,实现表格的自动化处理。

  1. 读取 xlsx 表格文件中的数据;
  2. 写入到应用中的表格;
  3. 读取应用中的表格数据;
  4. 将数据写入到 MySQL 数据库中;

实际操作

用 CukeTest 可以方便的创建 BDD(行为驱动)自动化测试脚本,因此我们在实际演练中会按照 BDD 的方式来开发脚本。

创建项目

打开 CukeTest,在“欢迎”界面选择“新建项目”,项目名称自定义。模版选择 Windows 模版,这是由于 Qt 应用也是一种桌面应用,因此,这个模板会在新建的项目中添加模型文件(*.tmodel)用于管理测试对象。

了解项目结构

假设项目名称为QtTableProject,下面列出了目录树,其中加*的文件表示在之后我们需要手动编写的脚本文件。

930401d5b94d48aa00346b836a4f96ff.png
项目结构

编写 feature 文件

CukeTest 是一个强大的剧本文件(或特性文件)编辑器,后缀名为*.feature的文件称作剧本文件特性文件。按照“目标”一节中的自动化步骤,编写feature文件如下:

99c5c9a89b3553fe7ca49a2b582f3c04.png
编写剧本文件

或者可以直接切换文本模式直接复制以下内容,二者是等效的:

# language: zh-CN
功能: QtTable自动化
以spreadsheet应用为对象,完成对Qt的自动化操作

场景: 从文件中导入数据
当读取"spreadsheet_data.xlsx"文件中的数据
那么写入到spreadsheet中

场景: 从表格中导出数据到数据库
当读取spreadsheet中的第1行数据
那么将数据写入到MySQL数据库中

更多剧本文件相关查阅剧本编辑概述[1]

通过 env.js 文件理解项目加载方式

打开env.js文件,可以看到文件中只有一句调用:

30 * 

该语句是将步骤的超时时限设为 30 秒。缺省超时时间为 5 秒,这可以避免在步骤出现异常时无限期的等待下去。因为有些 Qt 的自动化操作场景可能超过 5 秒,这里设置一个更长的超时时间,即在等待 30 秒以后就会自动停止并报错。

那么这句调用是如何生效的呢?这简单介绍一下 Cucumber 项目的加载方式,在开始运行(包括运行项目、剧本、场景、步骤,但不包括运行脚本)时,项目会加载所有的"features"目录下的文件,如果该文件是 js 文件,则加载过程会使其运行,这时暴露在函数体外的脚本都会运行生效(由于env.js中没有函数,因此所有的代码都在函数体外,会被直接运行)。

可以通过将env.js文件改为如下脚本后,点击运行剧本运行任意某个剧本文件:

console.log(
输出结果如下,可以看到文件成功的被加载了: 1d2670d6b0d427f1b1790930959de301.png

项目结构

使用模型管理器修改模型文件

模型文件中保存的是被测应用的控件的测试对象[2]信息,通过模型管理器识别被测应用中的控件,来得到相应的测试对象。接着我们通过调用测试对象上的 API 来操作控件,实现自动化操作。

因此首先我们需要使用模型管理器添加被测应用的控件,被测应用也就是 spreadsheet 应用。双击 spreadsheet.exe 打开应用,双击项目中的模型文件打开模型管理器进行编辑。

0c12e1342254543346fc959579c233cc.png
模型管理器

侦测被测应用中的 Table 控件,并添加到模型管理器中即可。事实上,由于 TableView 中的单元格控件的识别属性很有限,无法直接通过识别属性唯一识别某个单元格控件,因此在本次实践中使用了其它的方法。这种方法不依赖模型管理器,因此只需要识别到Table控件节点类型即可,节点树如下。

fec0405812d4c49046c5248eab0af0c8.png
节点树

但是我们还是可以通过批量添加控件[3]来了解到该应用的控件结构如下:

50a2d27ff073e4a103ffc7354ac18832.png
表格应用的控件结构

编写脚本

接着到了编写脚本,我们需要在步骤定义[4]中编写实现步骤描述的脚本,而为了增加步骤定义的可读性,我们将辅助函数定义在外部。这里我们在 support 文件夹下新建db.jstable.js两个文件,其功能如下:

  • db.js: 定义了 MySQL 数据相关的操作,包括数据库初始化、连接、查询等。
  • table.js: 定义了对应用中的表格操作函数,包括取得目标单元格测试对象、修改单元格内容。

表格操作

在编写针对应用中的表格的操作前,我们需要明白两个概念:

  1. 测试对象的index识别属性:当我们调用目标测试对象的 API 时,会匹配到应用中的一个或多个控件。当匹配到多个控件时(可能由于识别属性不够精确,或者目标控件没有合适的识别属性),接着根据测试对象的index属性取出匹配控件数组中的一个控件进行操作。由于index的缺省值为 0,因此总是会默认操作识别到的第一个可见控件。在 Qt 中的 TableView 组件中,单元格几乎只有一个值属性,而值有可能动态变化。因此从单元格识别上来说,无法有效识别出各个单元格的差异,因此最后都需要使用index属性来取到目标位置单元格对应的测试对象。

  2. getControls(condition)方法:它会匹配当前控件下所有识别属性匹配的子控件。比如以下这个调用:

    await model.getTable(

    以上两句调用都代表获得应用中的Table控件下,所有Custom控件中的第 9 个。

下面编写实际的操作代码:

1. 获取单元格

由于上述的原因,获取表格中的单元格控件需要使用index值来索引,但是我们更希望用更加直观的行列坐标来索引目标单元格,因此我们需要一个函数来换算两种索引方式,将以下内容添加到table.js文件中:

const WIDTH = 
2. 表格数据写入

如何将数据写入表格中呢?我们可以细化为单个单元格的写入,再使用上述提供的getTargetCell()方法一一索引所有要写入的单元格。

那么单个单元格的写入如何实现?对于其它可以输入的控件类型,比如input boxcombo boxcheckbox这类控件,可以使用其提供的set()方法直接修改内容,但是由于在这个应用中,单元格的控件类型为Custom,也就是自定义控件,只提供了部分通用方法。因此我们需要为其定义一个写入内容的方法。
剖析写入单元格的操作,有如下几个步骤:

  1. 双击单元格
  2. 模拟键盘输入
  3. 输入回车/点击单元格外退出单元格编辑

考虑到稳定性,第 3 步建议选择输入回车来退出单元格编辑,并且由于可以在模拟键盘输入这一步输入ENTER信号来实现按下回车键的效果,因此可以与第 2 步一起实现。将以下的代码写入到table.js文件中。

// 修改单元格的值

注意这里的sendToCell()是一个异步方法,这是因为完成以上步骤的操作是需要一定时间的,因此我们需要等待操作完成。关于 JavaScript 的异步编程,可以查阅async 函数[5]

sendToCell()代码的第 2 行中,通过在输入值后追加“~”符号来输入回车键,这涉及到 KeyCode 的知识,可以查阅附录:输入键对应表[6]

3. 表格数据读出

除了修改单元格以外,在需要导出数据时,需要读取目标单元格的内容。但是眼尖的读者应该已经发现了,在sendToCell()函数的最后一行,就已经获取了单元格的值——也就是控件的name属性,虽然是属性,也同样按照。

name()是测试对象提供的 API 之一,因此同样是一个异步的方法,需要配合await关键字来取得结果。

表格文件操作

CukeTest 的工具箱中提供了 Excel 文件操作的 API,直接拖拽到代码中即可生成代码。工具位于界面左侧“工具箱” -> “协作”。

这次我们针对 xlsx 文件,因此选择第三个“加载 Excel 数据”。

9c3fc603f8798ce656499b72344faabd.png
工具箱

更多的 Excel 操作 API 可参考Excel 文件操作[7]

数据库操作

数据库选用的 MySQL,这里我们将数据库的操作代码全都放在db.js文件中进行管理。

连接到数据库

连接 MySQL 数据库需要使用登录信息,包括用户名、密码、数据库名等,我们将其封装为函数,它传入登录信息并返回数据库连接对象,代码如下:

const mysql = 

可能会有读者好奇这里的数据库连接为什么不是异步函数,这个可以通过将鼠标放在mysql.createConnection()方法上观察其返回值是否被Promise<>包括来分辨。这里只定义了连接的信息,实际的连接行为会发生在运行查询前,因此这里的函数并非异步操作。

运行查询语句

事实上,只要能够在该连接下运行查询语句,我们就可以对数据库为所欲为了。

下面定义的query函数,按照mysql包的的参数传递格式,在查询语句中使用?作为占位符来传递参数。在之后的步骤定义中我们也会看到用法。或者可以点击查阅查询的执行[8]

async 

更多的 MySQL 的访问方法可以参考数据库访问[9]

数据库环境配置

使用以下两句查询语句来创建qt数据库和spreadsheet表:

CREATE 
CREATE 

步骤定义

下面列出了完整的步骤定义代码:

const xlsx = 

Q&A

连接数据库出现 ER_NOT_SUPPORTED_AUTH_MODE 错误

这是因为 MySQL 8.0 更新了新的密码加密方式,可以通过将登录用户的加密方式改为兼容 MySQL 5 的类型。使用如下语句:

ALTER 

rootpassword处改为自己的用户名和密码即可。

参考资料

[1]

剧本编辑概述: http://cuketest.com/zh-cn/features/overview.html

[2]

测试对象: http://cuketest.com/zh-cn/misc/glossary.html#test_object

[3]

批量添加控件: http://cuketest.com/zh-cn/model_mgr/control_spy.html#batch_add

[4]

步骤定义: http://cuketest.com/zh-cn/cucumber/concepts.html#stepdef

[5]

async函数: http://es6.ruanyifeng.com/#docs/async

[6]

附录:输入键对应表: http://cuketest.com/zh-cn/misc/key_codes.html

[7]

Excel文件操作: http://cuketest.com/zh-cn/shared/excel.html

[8]

查询的执行: https://www.npmjs.com/package/mysql#performing-queries

[9]

数据库访问: http://cuketest.com/zh-cn/shared/database.html

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值