我正在运行一些模拟,需要手动键盘输入才能更改参数(烦人)。
有没有办法模拟键盘按下,以便我可以使用bash脚本运行模拟?
答案 0 :(得分: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 :(得分:1)
也许您可以使用expect
?
另外echo | <cmd>
。
答案 2 :(得分:1)
原则上我可以从bash那里做到:
./program << ENDINPUT
$input1
$input2
$input3
ENDINPUT
答案 3 :(得分:0)
我是cli-driver的作者,这是一个Node.js库,用于自动执行命令行,类似于Web-driver,但在命令行中。它支持Mac,Linux和Windows,到目前为止,我已经能够轻松地“自动化”我需要的任何用例,从复杂的提示到多个命令任务,ssh会话,带有Tab的命令完成或带有Control + r的历史记录,甚至使用vi,nano,emacs。
它实际上使您可以创建一个新的终端并模拟用户输入(仅键盘)。通常,您需要模拟诸如字符之类的人类用户击键,但是需要模拟诸如“ enter”,“ shift-tab”,“ control-q”,“ control-shift-right”之类的特定序列。编写来控制光标,键盘和显示功能-尽管通常不需要。
内部使用node-pty,它是“用于node.js的forkpty(3)绑定。这使您可以使用伪终端文件描述符对进程进行派生。它返回允许读取和写入的终端对象。”
交流只是一种方法-输入文本并等待输出,例如(首页上有很多内容):
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()