拖拽控件的方式选择
在CukeTest中提供了几种拖拽的方式,其各自适用于不同的场合,那么在什么场合选择哪种方式来完成拖拽呢?这篇文档就是用于解决这类问题,同时也具体的介绍了各个拖拽API的调用方式。
实现拖拽的不同方式
CukeTest提供了几种不同的拖拽方式,可以分为:面向对象方式与面向屏幕操作方式。两种的区别在于,前者拖拽的是一个控件,作为测试对象的一个方法;后者只是完成一个拖拽的操作,只需要起点与终点的屏幕坐标(以左上角为坐标原点),而无需在意被操作的目标,这也是为什么这种方式称作面向屏幕操作。具体的异同点可以参考以下表格:
所属对象 | 调用方式 | 适用场景 | |
---|---|---|---|
面向对象方式 | 控件对象 | 从模型管理器中拖拽drag &drop 方法 | 拖拽控件 |
面向屏幕操作方式 | leanpro.common 库中的Mouse 模块 | 从工具箱的屏幕操作 中拖拽鼠标点按、移动方法组合完成拖拽 | 绘制线条、方框、手势等 |
拖拽动作的时序
将拖拽动作的整个流程拆解后如下:
移动到起点位置 --> 按下鼠标左键(保持) --> 移动到终点位置 --> 松开鼠标左键
拖拽控件的实现
最常见的情况是要拖拽一个控件到指定位置,那么每个控件都提供的对象操作API——drag
和drop
方法无疑是实现拖拽的最好途径。首先看一下这两个方法的调用方式:
drag(x?:number, y?:number): Promise<void>;
拖拽操作的第一步——选择起点,输入参数为相对控件位置的偏移量,缺省都为0,即起点为控件正中心没有任何偏移。
- x: (可选)
number
类型,拖拽起点相对控件的水平坐标偏移像素,左负右正。缺省为0。 - y: (可选)
number
类型,拖拽起点相对控件的垂直坐标偏移像素,上负下正。缺省为0。 - 返回值: 不返回任何值的异步方法。
drop(x?:number, y?:number): Promise<void>;
拖拽操作的第二步——选择终点,输入参数为相对控件位置的偏移量,缺省都为0,即起点为控件正中心没有任何偏移。拖拽过程默认采取平滑拖拽的方式,因为过快的拖拽会导致应用来不及响应;到达终点后会触发松开左键的事件。
- x: (可选)
number
类型,拖拽起点相对控件的水平坐标偏移像素,左负右正。缺省为0。 - y: (可选)
number
类型,拖拽起点相对控件的垂直坐标偏移像素,上负下正。缺省为0。 - 返回值: 不返回任何值的异步方法。
拖拽桌面图标
假设我们要拖拽桌面上的“回收站”图标,那么在模型管理器中添加该控件后,使用如下脚本完成拖拽:
const { AppModel } = require('leanpro.win');
const model = AppModel.loadModel(__dirname + "\\model1.tmodel");
(async function () {
let item = model.getListItem("回收站");
await item.drag();
await item.drop(400, 0);
})()
上述的脚本可以将桌面中的“回收站”图标水平向右移动400个像素。
鼠标拖拽的实现
除了对于控件的拖拽外,CukeTest还提供了模拟用户鼠标操作的拖拽方式,由leanpro.common
中的Mouse
模块完成。假设使用模拟操作的方式完成上一节中对于“回收站”图标的操作,那么应该写成如下:
下面脚本里关于
Mouse
的方法中的x
与y
,都是桌面坐标系的横纵坐标,因此需要手动的传入坐标值。
const { Mouse } = require('leanpro.common');
const { AppModel } = require('leanpro.win');
const model = AppModel.loadModel(__dirname + "\\model1.tmodel");
(async function () {
let item = model.getListItem("Google Chrome");
let x = await item.x();
let y = await item.y();
Mouse.move(x, y);
Mouse.keyDown(1);
Mouse.drag(x + 400, y);
Mouse.keyUp(1);
})();