拖拽控件的方法选择

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

实现拖拽的不同方式

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

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

拖拽动作的组成

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

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

拖拽控件的实现

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

drag(x, y): Promise<void>

此方法标志拖拽操作的开始,模拟在目标位置按住鼠标不松手。

  • x: (可选)number类型,相对于控件水平中心的偏移像素,默认值为控件水平中心。
  • y: (可选)number类型,相对于控件垂直中心的偏移像素,默认值为控件垂直中心。
  • mouseKey:(可选)number类型,拖拽时使用的鼠标键,1表示左键,2表示右键。默认值为左键(1)。
  • 返回值: 不返回任何值的异步方法。

drop(x, y, seconds): Promise<void>

拖拽操作的结束步骤,模拟将鼠标移至指定位置并释放。

  • x: (可选)number类型,相对于控件水平中心的偏移像素,左为负值,右为正值。默认值为0
  • y: (可选)number类型, 相对于控件垂直中心的偏移像素,上为负值,下为正值。默认值为0
  • options:(可选)object类型,自定义拖拽行为的配置对象。支持的选项包括:
    • duration: number类型,鼠标移动到目标位置的持续时间,单位为秒。默认值为1,即1秒;
    • mouseKeys: number类型,在拖拽操作中使用的鼠标按键。1表示左键,2表示右键。默认值为左键(1)。
  • 返回值: 不返回任何值的异步方法。

样例:拖拽桌面图标

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

JavaScript
Python
const { WinAuto } = require('leanpro.win');
const model = WinAuto.loadModel(__dirname + "\\model1.tmodel");
(async function () {
    let item = model.getListItem("回收站");
    await item.drag(); 
    await item.drop(400, 0);
})()
import os
from leanproAuto import RunSettings, WinAuto
modelWin = WinAuto.loadModel(os.path.dirname(__file__) + "/recording.tmodel")
item = modelWin.getListItem("回收站")
item.drag()
item.drop(400, 0)

如果希望使用右键拖拽,可以将最后两行改为:

JavaScript
Python
item.drag(0, 0, 2)
item.drop(400, 0, {mouseKey: 2})
item.drag(0, 0, 2)
item.drop(400, 0, {"mouseKey": 2})

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

鼠标拖拽的实现

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

JavaScript
Python
const { Mouse } = require('leanpro.common');
const { WinAuto } = require('leanpro.win');
const model = WinAuto.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); // 水平向右移动400像素
    Mouse.keyUp(1);
})();
import os
from leanproAuto import RunSettings, WinAuto, Mouse
modelWin = WinAuto.loadModel(os.path.dirname(__file__) + "/model1.tmodel")
item = modelWin.getListItem("Google Chrome")
x = item.x()
y = item.y()

Mouse.move(x, y)
Mouse.keyDown(1)
Mouse.drag(x + 400, y) # 水平向右移动400像素
Mouse.keyUp(1)
在这种方式中,xy参数代表的是屏幕坐标系中的位置,需要手动传入具体坐标值,从而实现更为灵活的拖拽操作。

通过对比不同方法的特点和适用场景,您可以更有效地选择合适的拖拽方式来满足测试需求。

results matching ""

    No results matching ""