Qtitan组件
Qtitan 是一个基于 Qt 框架的第三方 GUI 组件库,提供了多种功能的组件,主要包括:
- QtitanRibbon:提供类似于 Microsoft Office 的功能区界面,支持多种主题和样式。
- QtitanDataGrid:用于显示和编辑大数据量的表格,支持排序、过滤和分组等功能。
- QtitanChart:提供了多种类型的图表控件,可以用于数据可视化。
- QtitanDocking:提供灵活的停靠窗口管理功能,适用于复杂的多窗口应用。
控件识别
在使用 CukeTest 进行测试录制或侦测时,Qtitan 控件(如 Qtitan::RibbonPage
和 Qtitan::RibbonGroup
)会自动将用控件的 meta.title
信息作为标识属性,从而提高控件的识别准确性,使自动化测试更可靠。
如果需要在识别过程中使用 meta
中的其他信息,可以在浏览控件树中找到对应的控件,在控件的 meta
属性中选择所需的特定属性即可。
控件操作方法
CukeTest 提供了一系列标准的 Qt 操作方法,支持对 Qtitan 控件进行基本的操作。这些方法的应用范围广泛,可以满足大多数自动化测试的需求。常见的操作方法包括:
click()
:模拟用户点击控件的操作。pressKeys()
:向控件发送按键事件,如输入文本或执行快捷键操作。exists()
:检查指定的控件是否存在于当前的用户界面中。takeScreenshot()
:用于截取控件的屏幕截图。checkProperty()
:用于验证控件的某个属性值是否符合预期。allProperties()
:获取控件的所有属性及其当前值,以便进行进一步分析或验证。
对于一些无法直接识别其子项的容器组件,可以使用 invoke()
方法。通过该方法,用户可以调用组件内部的函数,执行一些更复杂的操作。
注意:对Qtitan组件使用
invoke()
方法时,需要加载对应版本的 Qtitan 插件。CukeTest 的 Qtitan 插件对 Qtitan 控件的操作方法进行了扩展。
例如,对于 Qtitan::Grid
组件中,虽然单元格不能直接作为独立控件进行操作,但通过父控件的 invoke()
方法,也可以获取和操作单元格中的数据。
以下示例展示了如何使用 invoke()
方法获取 Qtitan::Grid
中第 2 行第 5 列单元格的值:
JavaScript
Python
await model.getGeneric("Qtitan::Grid").invoke("view.model.data", [1,4]);
model.getGeneric("Qtitan::Grid").invoke("view.model.data", [1, 4])
示例
下面是一些实际应用中的代码示例,演示了如何对 Qtitan 组件进行自动化测试操作。
JavaScript
Python
const { RunSettings, Util } = require("leanpro.common");
const { QtAuto } = require("leanpro.qt");
(async () => {
await RunSettings.set({ slowMo: 100, reportSteps: true });
let modelQt = QtAuto.loadModel(__dirname + "/Grid_TreeView.tmodel");
await QtAuto.launchQtProcessAsync("C:\\Grid_TreeView.exe")
await modelQt.getApplication("Grid_TreeView").exists(10)
let val = await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.data2', ["[1, 1]"]);
console.log(`单元格[1, 1]的数据是: ${val}`)
// 行数
let rowCount = await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.rowCount');
console.log(`行数: ${rowCount}`);
// 列数
let columnCount = await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.columnCount');
console.log(`列数: ${columnCount}`);
// 折叠所有行
for (let i = 0; i < rowCount; i++) {
await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.collapse', [i]);
Util.delay(300);
}
// 展开所有行
for (let i = 0; i < rowCount; i++) {
await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.expand', [i]);
if (i === rowCount - 1) {
await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.scrollToIndex', [i, 0]);
}
Util.delay(200);
}
// 获取行列数据
for (let i = 0; i < rowCount; i++) {
for (let j = 0; j < columnCount; j++) {
val = await modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.data', [i, j]);
console.log(`行 ${i}, 列${j} 的数据是: ${val}`);
}
console.log();
}
})()
import os
from leanproAuto import RunSettings, QtAuto, Util
def test_Grid_TreeView():
RunSettings.set({"slowMo": 1000, "reportSteps": True})
modelQt = QtAuto.loadModel(os.path.dirname(os.path.realpath(__file__)) + "/Grid_TreeView.tmodel")
# Launch application file"Grid_TreeView"
QtAuto.launchQtProcessAsync("C:\\Grid_TreeView.exe")
#Wait for Qt application "Grid_TreeView"
modelQt.getApplication("Grid_TreeView").exists(10)
#获取单元格[1, 1]的数据
val = modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.data2', ["[1, 1]"])
print(f"单元格[1, 1]的数据是: {val}")
#行数
rowCount = modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.rowCount')
print(f"行数: {rowCount}")
#列数
columnCount = modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.columnCount')
print(f"列数: {columnCount}")
# 折叠所有行
for i in range(rowCount):
modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.collapse', [i])
Util.delay(300)
# 展开所有行
for i in range(rowCount):
modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.expand', [i])
modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.scrollToIndex', [i, 0])
Util.delay(200)
#获取行列数据
for i in range(rowCount):
for j in range(columnCount):
val = modelQt.getGeneric("Qtitan::TreeGrid").invoke('view.model.data', [i, j])
print(f"行 {i}, 列 {j} 的数据是: {val}")
print()
if __name__ == "__main__":
test_Grid_TreeView()