模拟按键输入pressKeys方法

在自动化文本框或类似接收键盘输入的控件的时候,需要模拟键盘输入。pressKeys()方法是CukeTest中各个控件类型都支持的操作API,经常用来在输入框中输入字符串。每个技术类型中都提供了这个方法,根据技术类型分为以下几个:

  1. 全局Keyboard对象
  2. Qt自动化
  3. Windows自动化
  4. 虚拟控件

它有下面的签名:

JavaScript
Python
interface PressKeysOptions {
    textOnly?: boolean,
    cpm?: number
}

pressKeys(keys: string, options?: PressKeysOptions | number): Promise<void>;
class PressKeysOptions():
	textOnly: bool
	cpm: int
输入按键或字符串,输入前会聚焦目标控件。传入字符串时,字符串中的一些特殊字符(^+~%{}())会被当作控制键(Shift键、CTRL键等)来执行,而不会输入相应的符号,具体可以参考附录: 输入键对应表。如果希望输入纯文本,无视这些控制键符号,则可以使用{textOnly: true}选项,这样调用:pressKeys(str, {textOnly: true})

  • keys: string类型,要输入的按键、组合键或是字符串,最大支持1024个字符。
  • options: (可选)控制输入模式的一些可选参数。
    • textOnly: 仅输入字符串,并将控制字符也当作文本进行输入。效果等同于调用Keyboard.typeString()
    • cpm: 即每分钟输入字符数,用于控制文本输入速度。自动化操作时建议cpm值设置在200以上。由于方法的内部实现,以及各个系统、应用对文本输入的处理不相同,实际输入速度不一定能达到设置的cpm。 当options为数字时相当于cpm参数。
  • 返回值: 不返回任何值的异步方法。

这个方法是通过模拟键盘信号来实现字符串的输入,因此其同样可以用来进行复杂的键盘操作。比如使用以下代码能够快速完成登录:

JavaScript
Python
await input.pressKeys("username{TAB}password~");
input.pressKeys("username{TAB}password~")

其中,{TAB}代表按下Tab键,~代表按下回车键,在支持Tab键切换输入框和回车键登录的前提下,该语句能够顺利的完成账号密码的输入和登录,而这些模拟按键的指令,就叫做键指令(keycode),更多相关的内容可以查看附录:输入键对应表

样例1:输入特殊字符

假设现在需要输入文本,当然啦,可能是复杂一点的文本,这些文本里包含了可能与keycode冲突的特殊字符怎么办?比如想要输入波浪号~,然而担心会被解析为回车键?答案是使用花括号来消除歧义,如下:

JavaScript
Python

let textarea = model.getDocument("文本编辑器"); // 以下样例同
//需求:输入特殊符号"+^%~()[]{}"
await textarea.pressKeys("{+}");
await textarea.pressKeys("{^}");
await textarea.pressKeys("{%}");
await textarea.pressKeys("{~}");
await textarea.pressKeys("{(}");
await textarea.pressKeys("{)}");
await textarea.pressKeys("{[}");
await textarea.pressKeys("{]}");
await textarea.pressKeys("{{}");
await textarea.pressKeys("{}}");
await textarea.pressKeys("\""); // 对于引号仍需要转义

textarea = model.getDocument("文本编辑器"); # 以下样例同
#需求:输入特殊符号"+^%~()[]{}"
textarea.pressKeys("{+}");
textarea.pressKeys("{^}");
textarea.pressKeys("{%}");
textarea.pressKeys("{~}");
textarea.pressKeys("{(}");
textarea.pressKeys("{)}");
textarea.pressKeys("{[}");
textarea.pressKeys("{]}");
textarea.pressKeys("{{}");
textarea.pressKeys("{}}");
textarea.pressKeys("\""); # 对于引号仍需要转义

样例2:插入换行符和制表符

文本可以输入了,但是现在需要换行呢?或者是输入的文本需要插入制表符来排版呢?自然是使用回车键和Tab键,如下:

JavaScript
Python
//需求:输入回车键换行,输入Tab插入制表符
await textarea.pressKeys("{ENTER}");
await textarea.pressKeys("~");  // 回车键的另一个keycode
await textarea.pressKeys("{TAB}");
# 需求:输入回车键换行,输入Tab插入制表符
textarea.pressKeys("{ENTER}")
textarea.pressKeys("~") # 回车键的另一个keycode
textarea.pressKeys("{TAB}")

样例3:使用组合键进行操作

或许现在有这样一个情况,你希望使用关闭当前窗口的组合快捷键来代替点击右上角的叉号。这个快捷键也许是ctrl+w也可能是alt+F4,取决于窗口支持哪个。如下

JavaScript
Python
//需求:使用Shift键加方向键选中5个字符
await textarea.pressKeys("+{LEFT 5}");
//需求:使Ctrl键加x剪切选中字符
await textarea.pressKeys("^x");
//需求:使用Ctrl键加v粘贴字符
await textarea.pressKeys("^v");
//需求:使用Ctrl键加w关闭窗口
await textarea.pressKeys("^w");
//需求:使用Alt键加F4关闭窗口
await textarea.pressKeys("%{F4}");
#需求:使用Shift键加方向键选中5个字符
textarea.pressKeys("+{LEFT 5}")
#需求:使Ctrl键加x剪切选中字符
textarea.pressKeys("^x")
#需求:使用Ctrl键加v粘贴字符
textarea.pressKeys("^v")
#需求:使用Ctrl键加w关闭窗口
textarea.pressKeys("^w")
#需求:使用Alt键加F4关闭窗口
textarea.pressKeys("%{F4}")

也许你会注意到,在传入多个指令的时候,pressKeys()方法如何分辨这些指令是分开执行还是组合执行呢?事实上,只有ShiftCtrlAlt这三个控制键是会被当作组合键执行的,当出现这三个键的指令时,会自动的等待与下个指令一起执行(如果下个指令仍为控制键,那么会顺延至下下个指令)。

因此,如果要实现类似按住Shift键输入的效果,只需要将Shift指令后的指令用括号包裹起来即可。可以借助以下两行代码理解:

JavaScript
Python
await textarea.pressKeys("+abc");   // 输入结果为Abc
await textarea.pressKeys("+(abc)"); // 输入结果为ABC
textarea.pressKeys("+abc")   # 输入结果为Abc
textarea.pressKeys("+(abc)") # 输入结果为ABC

如果是需要控制键 + 鼠标操作的需求,比如按住Ctrl键拖拽、按住Shift点击这类的操作,可以使用Keyboard库的keyDown()和keyUp()方法来实现,详情参考组合键点击

总结

以上就是在实际场景中使用输入键指令的介绍样例,需要特别注意的是,pressKeys()方法是一个测试对象的实例方法,需要指定键盘输入的对象。比如在某个窗口中按下组合键、在某个输入框中输入字符串,必须指定对象才能够使用pressKeys()方法。

results matching ""

    No results matching ""