图案对象API
图案对象可以独立创建,也可以作为子图案从控件截图中创建。独立图案可以直接从 Leanpro 提供的各个库(例如 leanpro.common
、leanpro.win
、leanpro.qt
、leanpro.java
等)中的模型对象中获取,而子图案则可以从父控件对应的库中获取。
图案对象提供以下方法:
API 名称 | 描述 |
---|---|
click | 点击目标图案 |
dblClick | 双击目标图案 |
drag | 拖拽图案对象 |
drop | 松开拖拽图案 |
exists | 检查图案是否存在 |
findAll | 查找所有匹配的图案 |
highlight | 高亮图案对象 |
hover | 鼠标悬停在目标图案上 |
locate | 定位图案对象 |
modelProperties | 获取图案对象的模型属性 |
moveMouse | 移动鼠标到图案位置 |
rect | 获取图案对象的位置和大小信息 |
score | 获取图案对象匹配结果的相似度 |
takeScreenshot | 截取图案对象的截图 |
wait | 等待图案对象出现 |
Pattern类的定义
图案对象Pattern
的类型定义如下:
interface PatternControl {
click(x: number, y: number, mouseKey: MouseKey): Promise<void>;
dblClick(x?: number, y?: number, mouseKey?: MouseKey): Promise<void>;
drag(x: number, y: number): Promise<void>;
drop(x: number, y: number): Promise<void>;
exists(seconds: number): Promise<boolean>;
findAll(): Promise<PatternControl[]>;
highlight(duration: number): Promise<void>;
hover(): Promise<void>;
locate(): Promise<PatternControl>;
modelProperties(): {[x: string]: any};
moveMouse(x?: number, y?: number, seconds?: number): Promise<void>;
rect(): Promise<Rect>;
score(): Promise<number>;
takeScreenshot(filePath?: string): Promise<string>;
wait(seconds: number): Promise<void>;
}
class Pattern():
def click(x: Optional[int]=None, y: Optional[int]=None, mouseKey: Optional[int]=None) -> None
def dblClick(x: Optional[int]=None, y: Optional[int]=None, mouseKey: Optional[int]=None) -> None
def drag(x: int, y: int) -> None
def drop(x: int, y: int) -> None
def exists(seconds: Optional[int]=None) -> bool
def findAll() -> "List[Pattern]"
def highlight(duration: Optional[int]=None) -> None
def hover() -> None
def locate() -> "Pattern"
def modelProperties() -> TypedDict
def moveMouse(x: Optional[int]=None, y: Optional[int]=None, seconds: Optional[int]=None) -> None
def rect() -> "Rect"
def score() -> int
def takeScreenshot(filePath: Optional[str]=None) -> str
def wait(seconds: Optional[int]=None) -> None
API 说明
click(x?: number, y?: number, mouseKey?: MouseKey): Promise<void>
点击目标图案,可以指定点击的偏移量,默认点击位置为图案正中心。如果被点击的图案还未匹配到结果,会在点击前进行匹配。
x
: (可选)number
类型,横坐标,缺省为图案对象的水平中心。y
: (可选)number
类型,纵坐标,缺省为图案对象的垂直中心。mouseKey
: (可选)MouseKey
类型,点击使用的按键,缺省为1
,代表鼠标左键。- 返回值:没有任何返回值的异步方法。
示例代码
// 点击图案对象的中心位置
await pattern.click();
// 点击图案对象的偏移位置 (100, 50)
await pattern.click(100, 50);
// 使用右键点击图案对象的中心位置
await pattern.click(0, 0, 2);
# 点击图案对象的中心位置
pattern.click()
# 点击图案对象的偏移位置 (100, 50)
pattern.click(100, 50)
# 使用右键点击图案对象的中心位置
pattern.click(0, 0, 2)
dblClick(x?: number, y?: number, mouseKey?: MouseKey): Promise<void>
双击图案控件,参数同click()
。
示例代码
// 双击图案对象的中心位置
await pattern.dblClick();
// 双击图案对象的偏移位置 (100, 50)
await pattern.dblClick(100, 50);
// 使用右键双击图案对象的中心位置
await pattern.dblClick(0, 0, 2);
# 双击图案对象的中心位置
pattern.dblClick()
# 双击图案对象的偏移位置 (100, 50)
pattern.dblClick(100, 50)
# 使用右键双击图案对象的中心位置
pattern.dblClick(0, 0, 2)
drag(x?: number, y?: number): Promise<void>
在图案对象匹配结果的位置按下鼠标左键,也就是拖拽操作的第一步,并等待松开鼠标的指令。传入的(x, y)
为点击相对控件的坐标,当x
和y
同时为0或缺省时点击控件中心。
x
: (可选)number
类型,拖拽起点相对控件的水平坐标偏移像素,左负右正。缺省为0,图案对象的水平中心。y
: (可选)number
类型,拖拽起点相对控件的垂直坐标偏移像素,上负下正。缺省为0,图案对象的垂直中心。- 返回值: 不返回任何值的异步方法。
示例代码
// 从图案对象的中心位置开始拖拽
await pattern.drag(0, 0);
// 从图案对象的偏移位置 (100, 50) 开始拖拽
await pattern.drag(100, 50);
# 从图案对象的中心位置开始拖拽
pattern.drag(0, 0)
# 从图案对象的偏移位置 (100, 50) 开始拖拽
pattern.drag(100, 50)
drop(x?: number, y?: number): Promise<void>
在图案对象匹配结果的位置松开鼠标左键,也就是拖拽操作的第二步。在图案对象匹配结果的位置松开鼠标左键,也就是拖拽操作的第二步。传入的(x, y)
为点击相对控件的坐标,当x
和y
同时为0或缺省时点击控件中心。可以在A
控件上执行drag()
方法,在B
控件上执行drop()
方法,实现将A
控件拖拽到B
控件上的效果,具体文档可以查看拖拽的方法。
x
: (可选)number
类型,拖拽终点相对控件的水平坐标偏移像素,左负右正。缺省为0。y
: (可选)number
类型,拖拽终点相对控件的垂直坐标偏移像素,上负下正。缺省为0。- 返回值: 不返回任何值的异步方法。
示例代码
// 将拖拽的对象松开到图案对象的中心位置
await pattern.drop(0, 0);
// 将拖拽的对象松开到图案对象的偏移位置 (200, 100)
await pattern.drop(200, 100);
# 将拖拽的对象松开到图案对象的中心位置
pattern.drop(0, 0)
# 将拖拽的对象松开到图案对象的偏移位置 (200, 100)
pattern.drop(200, 100)
exists(seconds: number): Promise<boolean>
在等待一定时长并循环尝试匹配,如果在指定时间内匹配到结果返回ture
;超过等待时间并且没有匹配到结果则返回false
。
seconds
:number
类型,等待时间,单位为秒。- 返回值:
Promise<boolean>
类型,匹配到结果则返回true
,超时返回false
。
示例代码
// 检查图案对象是否在10秒内出现
const result = await pattern.exists(10);
console.log(result); // true 或 false
# 检查图案对象是否在10秒内出现
result = pattern.exists(10)
print(result) # true 或 false
findAll(): Promise<PatternControl[]>
执行图案对象的匹配,并返回所有匹配结果,如果没有匹配到结果则返回空数组。
- 返回值:
Promise<PatternControl[]>
类型,异步的返回一个包含所有匹配结果的Pattern
对象数组,如果没有匹配到结果则返回空数组。
示例代码
// 查找所有匹配的图案对象
const patterns = await pattern.findAll();
patterns.forEach(p => console.log(p));
# 查找所有匹配的图案对象
patterns = pattern.findAll()
for p in patterns:
print(p)
highlight(duration: number): Promise<void>
控件高亮,可以传入参数指定高亮持续毫秒时间,默认值为1000,即持续1秒。
duration
: (可选)number
类型,高亮持续时间,单位为毫秒。- 返回值: 不返回任何值的异步方法。
示例代码
// 高亮图案对象1秒
await pattern.highlight(1000);
// 高亮图案对象2秒
await pattern.highlight(2000);
# 高亮图案对象1秒
pattern.highlight(1000)
# 高亮图案对象2秒
pattern.highlight(2000)
hover(): Promise<void>
使鼠标光标悬停在目标图案上,可以指定悬停位置的偏移量,默认位置为图案正中心。如果被操作的图案还未匹配到结果,会在操作前进行匹配。
- 返回值: 没有任何返回值的异步方法。
示例代码
// 鼠标悬停在图案对象的中心位置
await pattern.hover();
# 鼠标悬停在图案对象的中心位置
pattern.hover()
locate(): Promise<PatternControl>
执行图案对象的匹配,并返回匹配结果。如果匹配到多个结果,则会返回相似度(score)最高的那个结果。
- 返回值:
Promise<PatternControl>
类型,如果没有匹配到结果会提示1001: ObjectNotExist
。
示例代码
// 定位图案对象,并在屏幕中高亮
const locatedPattern = await pattern.locate();
await locatedPattern.highlight();
# 定位图案对象,并在屏幕中高亮
located_pattern = pattern.locate()
locatedPattern.highlight()
modelProperties(): {[x: string]: any}
返回图案对象的模型属性,即在添加图案对象时生成的缓存属性,如截图文件的路径、截图的区域坐标等。
- 返回值:
Promise<object>
,返回一个任意对象,对于普通的图案对象,通常返回形如以下对象的结果:
{
boundingRectangle: "[99,100,63,56]",
imagePath: "image.png"
}
示例代码
// 获取图案对象的模型属性
const properties = await pattern.modelProperties();
console.log(properties);
# 获取图案对象的模型属性
properties = pattern.modelProperties()
print(properties)
moveMouse(x?: number, y?: number, seconds?: number): Promise<void>
将鼠标移动到目标位置,可以指定偏移量,默认位置为图案正中心。
x
: (可选)number
类型,横坐标,缺省为图案对象的水平中心。y
: (可选)number
类型,纵坐标,缺省为图案对象的垂直中心。seconds
: (可选)number
类型,移动时间,值越小鼠标移动越快。- 返回值:没有任何返回值的异步方法。
示例代码
// 将鼠标移动到图案对象的中心位置
await pattern.moveMouse();
// 将鼠标移动到图案对象的偏移位置 (100, 50)
await pattern.moveMouse(100, 50);
// 将鼠标在1秒内移动到图案对象的中心位置
await pattern.moveMouse(0, 0, 1);
# 将鼠标移动到图案对象的中心位置
pattern.moveMouse()
# 将鼠标移动到图案对象的偏移位置 (100, 50)
pattern.moveMouse(100, 50)
# 将鼠标在1秒内移动到图案对象的中心位置
pattern.moveMouse(0, 0, 1)
rect(): Promise<Rect>
获取图案对象匹配结果的位置和大小信息。
- 返回值:
Rect
对象,包含匹配对象的x、y、width、height信息。
示例代码
// 获取图案对象的位置和大小信息
const rect = await pattern.rect();
console.log(rect);
# 获取图案对象的位置和大小信息
rect = pattern.rect()
print(rect)
score(): Promise<number>
获取图案对象匹配结果的相似度结果,范围为[0,1)。
- 返回值:
Promise<number>
,一个0~1范围内的浮点数字,越大表示匹配结果越相似。
示例代码
// 获取图案对象匹配结果的相似度
const similarity = await pattern.score();
console.log(similarity);
# 获取图案对象匹配结果的相似度
similarity = pattern.score()
print(similarity)
wait(seconds: number): Promise<void>
在等待一定时长并循环尝试匹配,如果在指定时间内匹配到结果则会返回结果并继续运行接下来的语句;超过等待时间并且没有匹配到结果则会抛错,可以指定错误信息。缺省等待5秒。
seconds
:number
类型,等待时间,单位为秒。默认值为5秒。- 返回值:
Promise<void>
类型,不返回任何结果的异步方法,如果超时没找到目标图案则抛错。
示例代码
// 等待图案对象出现,最多等待10秒
await pattern.wait(10);
# 等待图案对象出现,最多等待10秒
pattern.wait(10)
takeScreenshot(filePath?: string): Promise<string>
匹配目标并截图,可以传入路径来将截图保存到路径位置。
filePath
: (可选)string
类型,截图的保存路径和文件名,如"./images/screenshot1.png"
。- 返回值: 异步的返回截图的
base64
字符串。
示例代码
// 截取图案对象的截图并保存到指定路径
const screenshotPath = await pattern.takeScreenshot('./images/screenshot1.png');
console.log(screenshotPath);
// 截取图案对象的截图并返回base64编码
const base64Screenshot = await pattern.takeScreenshot();
console.log(base64Screenshot);
# 截取图案对象的截图并保存到指定路径
screenshot_path = pattern.takeScreenshot('./images/screenshot1.png')
print(screenshot_path)
# 截取图案对象的截图并返回base64编码
base64_screenshot = pattern.takeScreenshot()
print(base64_screenshot)
Pattern对象的代码生成
Pattern对象一般先通过模型管理器中拾取,然后将对象方法从模型管理器拖拽到代码编辑器中就可以直接生成。例如下面的生成代码:
await model.getPattern("Pattern1").click();
model.getPattern("Pattern1").click()
除了上面直接调用,也可以通过传入参数来覆盖图案对象中的同名参数:
await model.getPattern("PatternName", {resizeFactor: 2});
model.getPattern("PatternName", {"resizeFactor": 2})
上述的脚本可以无视图案对象中的缩放因子,强行使用2
的缩放因子进行匹配。相似度阈值similarity
同样。
如果Pattern对象需要代码中重复使用,可以先将它赋值给变量,然后再使用变量调用,例如:
let pattern = await model.getPattern("PatternName");
pattern.click();
pattern = await model.getPattern("PatternName")
pattern.click()
需要注意的是,Pattern对象中的定位信息是缓存的,也就是说如果Pattern对象如上赋值给了一个变量,并调用它的某个操作(如click)后,它会把图像匹配的结果缓存在对象中,这时候,你再调用它的其他方法就不会重新做图案匹配。这样的好处是执行更高效。但如果你的控件在屏幕上是不固定的,您需要用这个图案变量调用locate方法重新定位,以确保在准确的位置操作控件。