- Util (常用工具函数)
- delay(miliseconds): Promise<void>
- launchProcess(exePath: string, …args: string[]): ChildProcess;
- stopProcess(proc: ChildProcess): boolean;
- takeScreenshot(filePath: string = null, monitor: number = 0): string
- loadCsvFile(filePath: string): Promise<RowCsv[]>
- saveToCsvFile(rows: RowCsv[], filePath: string): boolean;
- 剪贴板操作
Util (常用工具函数)
提供自动化脚本常用的工具函数, 它通过引入“leanpro.common”中的Util对象获得:
const { Util } = require('leanpro.win');
它的定义如下:
class Util {
static delay(milliseconds: number): Promise<void>;
static launchProcess(exePath: string, ...args: string[]): ChildProcess;
static stopProcess(proc: ChildProcess): boolean;
static takeScreenshot(filePath: string = null, monitor: number = 0): string | void;
static loadCsvFile(filePath: string): Promise<RowCsv[]>;
static saveToCsvFile(rows: RowCsv[], filePath: string): boolean;
static getClipboard(): Promise<string>;
static setClipboard(text: string): Promise<void>;
}
delay(miliseconds): Promise<void>
延时等待一段时间,传入参数指定延时的毫秒数。因为是异步调用,记住前面需要加上await
。
- miliseconds:
number
类型,等待时间,单位为毫秒; - 返回值: 不返回任何值的异步方法;
例如:
下面的代码打开计算器应用,等待一秒后,确保它初始化成功后,开始点击操作。
async function run() {
let calcPath = 'c:/windows/system32/calc.exe';
await Util.launchProcess(calcPath);
await Util.delay(1000); //wait for process to initialize
await model.getButton("Two").click();
}
run();
launchProcess(exePath: string, …args: string[]): ChildProcess;
启动某个进程。一般用来启动被测应用。上述的例子显示了如何用launchProcess()
方法启动计算器应用。
- exePath:
string
类型,可执行文件的路径,通常以.exe
结尾。 - args: (可选)
string[]
类型,启动进程使用的参数,用法类似child_process.spawn()
; - 返回值:
ChildProcess
类型的对象,在CukeTest中通常用于记录启动的进程信息,之后可以用于stopProcess()
方法关闭进程。更多关于ChildProcess
类的说明可以查看Node child_process。
stopProcess(proc: ChildProcess): boolean;
停止某个进程。将launchProcess()
方法的返回值传递给proc,可停止该进程。
- proc:
ChildProcess
类型,进程信息,通常由launchProcess()
方法返回,无法直接创建对象。 - 返回值:
boolean
类型,执行结果。如果停止进程成功,返回true
; 否则返回false
。
async function run() {
let notepadPath = 'c:/windows/notepad.exe';
let proc = await Util.launchProcess(notepadPath);
//do some other operations...
Util.stopProcess(proc);
}
run();
注意:有些应用是多进程的。界面端窗体是由主进程打开的。这种情况下停止主进程不会关闭应用程序界面。Windows 10中的计算器应用即这种情况。
takeScreenshot(filePath: string = null, monitor: number = 0): string
截取整个屏幕图片,以png格式保存,并返回截图的base64
编码,可以直接作为运行报告的附件。
filePath
是文件路径,应以.png
后缀结尾。如果filePath
为null, 返回为图片的base64编码。monitor
是截取屏幕的编号,0是全部显示器,1是第一个,缺省为0。- 返回值:
string
类型,截图的base64
编码。
旧版的截屏方法,现在建议使用
Screen
对象的capture()
和captureToFile()
方法,详见介绍屏幕自动化对象;
loadCsvFile(filePath: string): Promise<RowCsv[]>
- filepath:
string
类型,要读取的CSV文件路径; - 返回值: ‘RowCsv’类型,json对象的数组,每个对象的
key
是列名,value
是数据。
例如有下面的内容的data.csv
文件:
first_name,last_name,company_name,state,zip
James,Butt,"Benton, John B Jr",LA,70116
Josephine,Darakjy,"Chanay, Jeffrey A Esq",MI,48116
Art,Venere,"Chemel, James L Cpa",NJ,8014
使用如下代码读取:
(async function() {
let data = await Util.loadCsvFile('C:\\temp\\data.csv');
console.log(data);
})();
会返回如下的json:
[
{ "first_name": "James",
"last_name": "Butt",
"company_name": "Benton, John B Jr",
"state": "LA",
"zip": "70116" },
{ "first_name": "Josephine",
"last_name": "Darakjy",
"company_name": "Chanay, Jeffrey A Esq",
"state": "MI",
"zip": "48116" },
{ "first_name": "Art",
"last_name": "Venere",
"company_name": "Chemel, James L Cpa",
"state": "NJ",
"zip": "8014" }
]
saveToCsvFile(rows: RowCsv[], filePath: string): boolean;
在得到json格式的数据后,可以再使用saveToCsvFile(rows, filePath)
函数将数据保存为csv文件。
Util.saveToCsvFile(rows: RowCsv[], filePath: string): boolean;
- 参数
rows
为行数据,它的键为列名,值为单元格中的元素; - 参数
filePath
为保存的路径和文件名;
举个例子,我们需要将从上一步data.csv
文件中读取的数据保存为脚本所在根目录的data_bak.csv
文件中,代码如下:
(async function() {
let data = await Util.loadCsvFile('C:\\temp\\data.csv');
// console.log(data);
Util.saveToCsvFile(data, "./data_bak.csv");
})();
运行结束后可以在根目录下看到新生成的data_bak.csv
文件,打开可以看到里面的内容和上一步的data.csv
文件内容一致。
剪贴板操作
下面是两个方法——读取和设置剪贴板的值。
getClipboard(): Promise<string>
获取当前剪贴板中的值。
- 返回值:
string
类型,异步的返回剪贴板中的文本。
setClipboard(text: string): Promise<void>
修改当前剪贴板中的值。
- text:
string
类型,要写入到剪贴板中的文本字符串; - 返回值:
string
类型,异步的返回剪贴板中的文本。
例如:
(async function() {
await Util.setClipboard('(🦄)');
let text = await Util.getClipboard();
console.log(text);
})();