在Mac终端模拟键盘按键

3

我正在运行一些模拟,需要手动键盘输入以更改参数(非常烦人)。

有没有一种方法可以模拟按键,这样我就可以用bash脚本运行模拟了?


1
我假设按键是用于交互式命令的,不能简单地作为命令的选项传递。 - Flambino
可能是重复的问题,参考在OS X上向命令行程序发送键码 - jww
4个回答

6

虽然我不建议这样做,但你可以像这样做(它只列出了您的主目录中的内容)

tell application "Terminal"
    activate
    do script "cd ~" -- the command to run
    delay 5 -- maybe throw in a delay to let the process start up
    tell application "System Events" to keystroke "ls -la" & return -- the keystrokes to simulate
end tell

然而,这就像是训练一只猫在你的键盘上走路的数字化版本。代码不知道终端里正在发生什么。它只是“打”了一些东西并按下回车,完全不知情。

因此,如果您有其他传递输入到进程的方法,请使用该方法。我发布这个帖子,因为您要求一个AppleScript解决方案。我只是怀疑AppleScript是正确的解决方案。


1
这样的脚本可以传递给osascript,并且可以从命令行界面运行。 - synthesizerpatel
@synthesizerpatel 当然可以使用osascript将其导入,但问题仍然是它只是盲目地按键。如果你已经从命令行界面运行所有内容,那么诉诸GUI脚本很可能不是一个好主意(而且很少有必要)。 - Flambino
你不需要通过System Events模拟键盘输入。只需使用do script命令告诉终端发送文本到终端。你可以向特定窗口的特定标签发送do script命令。do script命令的结果是一个终端的引用,可用于后续的do script命令。例如:set theTerminal to do script "cd ~",然后在theTerminal中执行do script "ls -la" - Chris Page

1
原来我一直都可以用bash做到这个:
./program << ENDINPUT
$input1
$input2
$input3
ENDINPUT

1
也许你可以使用 expect
另外是 echo | <cmd>

0

我是cli-driver的作者,它是一个用于自动化命令行的Node.js库,类似于web-driver但是在命令行中使用。它支持Mac、Linux和Windows,并且到目前为止,我能够轻松地“自动化”任何我需要的用例,从复杂的提示符到多个命令任务,SSH会话,带有Tab键的命令补全或使用vi、nano、emacs等编辑器。

它实际上可以创建一个新的终端并模拟用户输入(仅限键盘)。通常情况下,您需要模拟人类用户的按键操作,例如字符,但特别是一些序列,如“回车”,“Shift-Tab”,“Control-Q”,“Control-Shift-Right”等。但更一般地,任何ANSI序列都可以用来控制光标、键盘和显示功能 - 尽管通常情况下您不需要这样做。

内部它使用了node-pty,它是“forkpty(3) bindings for node.js”。这允许您使用伪终端文件描述符派生进程。它返回一个终端对象,允许读取和写入操作。

然而,通信只是单向的 - 您输入文本并等待输出,例如(主页上有很多示例):

const client = await new Driver().start()
let output = await client.enterAndWait('ls -a', '..')
expect(output).not.toContain('tmpFile')
await client.enterAndWait('echo hello > tmpFile1.txt', d=>existsSync('tmpFile1.txt'))
await client.destroy()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接