拖拽控件的方式选择

在CukeTest中提供了几种拖拽的方式,其各自适用于不同的场合,那么在什么场合选择哪种方式来完成拖拽呢?这篇文档就是用于解决这类问题,同时也具体的介绍了各个拖拽API的调用方式。

实现拖拽的不同方式

CukeTest提供了几种不同的拖拽方式,可以分为:面向对象方式面向屏幕操作方式。两种的区别在于,前者拖拽的是一个控件,作为测试对象的一个方法;后者只是完成一个拖拽的操作,只需要起点与终点的屏幕坐标(以左上角为坐标原点),而无需在意被操作的目标,这也是为什么这种方式称作面向屏幕操作。具体的异同点可以参考以下表格:

所属对象调用方式适用场景
面向对象方式控件对象模型管理器中拖拽drag&drop方法拖拽控件
面向屏幕操作方式leanpro.common库中的Mouse模块工具箱屏幕操作中拖拽鼠标点按、移动方法组合完成拖拽绘制线条、方框、手势等

拖拽动作的时序

将拖拽动作的整个流程拆解后如下:

  1. 移动到起点位置 --> 按下鼠标左键(保持) --> 移动到终点位置 --> 松开鼠标左键

拖拽控件的实现

最常见的情况是要拖拽一个控件到指定位置,那么每个控件都提供的对象操作API——dragdrop方法无疑是实现拖拽的最好途径。首先看一下这两个方法的调用方式:

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。
  • 返回值: 不返回任何值的异步方法。

拖拽桌面图标

假设我们要拖拽桌面上的“回收站”图标,那么在模型管理器中添加该控件后,使用如下脚本完成拖拽:

  1. const { AppModel } = require('leanpro.win');
  2. const model = AppModel.loadModel(__dirname + "\\model1.tmodel");
  3. (async function () {
  4. let item = model.getListItem("回收站");
  5. await item.drag();
  6. await item.drop(400, 0);
  7. })()

上述的脚本可以将桌面中的“回收站”图标水平向右移动400个像素。

鼠标拖拽的实现

除了对于控件的拖拽外,CukeTest还提供了模拟用户鼠标操作的拖拽方式,由leanpro.common中的Mouse模块完成。假设使用模拟操作的方式完成上一节中对于“回收站”图标的操作,那么应该写成如下:

下面脚本里关于Mouse的方法中的xy,都是桌面坐标系的横纵坐标,因此需要手动的传入坐标值。

  1. const { Mouse } = require('leanpro.common');
  2. const { AppModel } = require('leanpro.win');
  3. const model = AppModel.loadModel(__dirname + "\\model1.tmodel");
  4. (async function () {
  5. let item = model.getListItem("Google Chrome");
  6. let x = await item.x();
  7. let y = await item.y();
  8. Mouse.move(x, y);
  9. Mouse.keyDown(1);
  10. Mouse.drag(x + 400, y);
  11. Mouse.keyUp(1);
  12. })();