Util(常用工具函数)

提供自动化脚本常用的工具函数, 它通过引入“leanpro.common"中的Util对象获得:

JavaScript
Python
const { Util } = require('leanpro.common');
from leanproAuto import Util

它的定义如下:

JavaScript
Python
class Util {
    static delay(milliseconds: number): Promise<void>;
    static launchProcess(exePath: string, ...args: string[]): ChildProcess; 
    static launchProcess(exePaths: string, args: string[], options?: SpawnOptions): ChildProcess;
    static stopProcess(proc: ChildProcess): boolean;
    static loadPlugin(proc: ChildProcess | number | string, plugins: string | string[]): Promise<void>;
    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>;
    static copyDir(sourceDir, destDir): Promise<void>;
}
class Util():
	def copyDir(source: str, target: str) -> None
	def delay(milliseconds: int) -> None
	def launchProcess(exePath: str, *args: List[str]) -> "ChildProcess"
	def stopProcess(proc: ChildProcess) -> bool
    def loadPlugin(pidOrName: str|int, plugins: Union[str, List[str]]) -> None

delay(miliseconds): Promise<void>

延时等待一段时间,传入参数指定延时的毫秒数。因为是异步调用,记住前面需要加上await

  • miliseconds: number类型,等待时间,单位为毫秒;
  • 返回值: 不返回任何值的异步方法;

例如:

下面的代码打开计算器应用,等待一秒后,确保它初始化成功后,开始点击操作。

JavaScript
Python
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();
def run():
    calcPath = 'c:/windows/system32/calc.exe'
    Util.launchProcess(calcPath)
    Util.delay(1000) #/wait for process to initialize
    model.getButton("Two").click()

run()

launchProcess(exePath: string, ...args: string[]): ChildProcess;

启动一个进程,一般用来启动被测应用。第一个参数为目标应用的路径,如果在Windows系统中使用,注意路径间的反斜杠需要转义(将\改为\\)。上述的例子显示了如何用launchProcess()方法启动计算器应用。

  • exePath: string类型,可执行文件的路径,通常以.exe结尾。如果在Windows系统中使用,注意路径间的反斜杠需要转义(将\改为\\)。
  • args: (可选)string[]类型,启动进程使用的参数,用法类似child_process.spawn();
  • 返回值: ChildProcess类型的对象,在CukeTest中通常用于记录启动的进程信息,之后可以用于stopProcess()方法关闭进程。更多关于ChildProcess类的说明可以查看child_process类

launchProcess(exePaths: string, args?: string[], options?: SpawnOptions): ChildProcess;

使用高级选项启动进程的调用方式,当被测应用对环境变量、工作目录等条件有要求时,可以使用该方法代替上面的调用。

  • exePath: string类型,可执行文件的路径,通常以.exe结尾。
  • args: (可选)string[]类型,启动进程使用的参数,用法类似child_process.spawn();
  • options: (可选)SpawnOptions类型,控制进程运行的更多参数,为一个对象,可以在里面指定环境变量、工作目录等选项。

    • cwd: string类型,子进程的工作目录,默认值为运行的项目目录,即process.cwd()的值。
    • env: Object类型。环境键值对。默认值:process.env,即CukeTest运行时的环境变量。
    • detached boolean类型。子进程独立于其父进程运行(摆脱父进程控制运行)。
    • shell booleanstring类型。如果为true,则在shell内运行命令。在 Unix 上使用'/bin/sh',在 Windows 上使用 process.env.ComSpec。可以将不同的 shell 指定为字符串。默认值:false(无shell)。
  • 返回值: ChildProcess类型的对象,在CukeTest中通常用于记录启动的进程信息,之后可以用于stopProcess()方法关闭进程。更多关于ChildProcess类的说明可以查看child_process类

stopProcess(proc: ChildProcess): boolean;

停止某个进程。将launchProcess()方法的返回值传递给proc,可停止该进程。

  • proc: ChildProcess类型,进程信息,通常由launchProcess()方法返回,无法直接创建对象。
  • 返回值: boolean类型,执行结果。如果停止进程成功,返回true; 否则返回false

JavaScript
Python
async function run() {
    let notepadPath = 'c:/windows/notepad.exe';
    let proc = await Util.launchProcess(notepadPath);
    //do some other operations...
    Util.stopProcess(proc);
}

run();
def run():
    notepadPath = 'c:/windows/notepad.exe'
    proc = Util.launchProcess(notepadPath)
    # 在这里添加您的代码来执行其他操作
    Util.stopProcess(proc)

run()

注意:有些应用是多进程的。界面端窗体是由主进程打开的。这种情况下停止主进程不会关闭应用程序界面。Windows 10中的计算器应用即这种情况。

loadPlugin(pidOrNameOrProcess: ChildProcess | number | string, plugins: string | string[]): Promise<void>

用于向已启动的应用中加载插件。部分自动化操作要求被测应用必须加载插件(比如Qt自动化需要加载qt插件),但是如果通过CukeTest来启动应用,会根据当前的自动化类型自动的加载所需的插件。

但在一些特殊的情况下,需要再次向应用中加载插件,比如:

  • 应用自重启:此时重启后的应用将不带任何插件;
  • 启动被测应用时插件加载失败:由于被测应用启动方式各不相同,加载的插件在自动重试多次后仍然可能无法成功,此时可以自行选择时机加载插件。

用法:

  • pidOrNameOrProcess: 支持三种类型:ChildProcessUtil.launchProcess()方法返回值)、number(进程号PID)、string(进程名)。
  • plugins: string类型或string[]数组类型,插件的名称,或多个插件名称组成的数组。插件列表查看启动应用对话框的插件说明。
  • 返回值:不返回任何值的异步方法,注意使用await

比如启动Qt应用时,一般会用QtAuto.launchQtProcessAsync()方法,但也可以采用loadPlugin()来手动加载,如下:

JavaScript
Python
proc = Util.launchProcess("/your/qt/app/path")
await Util.loadPlugin(proc, 'qt')
proc = Util.launchProcess("/your/qt/app/path")
Util.loadPlugin(proc.pid, 'qt')

copyDir(sourceDir: string, destDir: string): Promise<void>

将目标文件夹的内容复制到指定目录中,如果目标目录不存在,则会创建该目录。

  • sourceDir: string类型,是待复制的文件夹路径。
  • destDir: string类型,是复制到目标文件夹的路径。

JavaScript
const { Util } = require('leanpro.common');
(async () => {
    const sourceDir = './model_files';
    const destDir = './test/model_copy_files';
    await Util.copyDir(sourceDir, destDir)
})();

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

使用如下代码读取:

JavaScript
(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文件。

JavaScript
Util.saveToCsvFile(rows: RowCsv[], filePath: string): boolean;

  • 参数rows为行数据,它的键为列名,值为单元格中的元素;
  • 参数filePath为保存的路径和文件名;

举个例子,我们需要将从上一步data.csv文件中读取的数据保存为脚本所在根目录的data_bak.csv文件中,代码如下:

JavaScript
(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类型,异步的返回剪贴板中的文本。

例如:

JavaScript
(async function() {

    await Util.setClipboard('(🦄)');
    let text = await Util.getClipboard();

    console.log(text);
})();

results matching ""

    No results matching ""