我正在尝试向ruby-newt
模块添加更多自动化测试。我的代码似乎正常工作,但是仍然需要在终端上手动点击ENTER
才能完成。
例如,在下面的代码中,\t
将切换到下一个按钮,\r
将按下按钮,并且两个命令都成功执行,但是仍然需要在终端上手动按下ENTER
键,否则程序无限期地挂起。
如果注释掉wr.write "\t\r"
行,则程序将超时并在10秒后成功退出。我已经尝试过wr.flush
,但这无济于事。我也尝试在命令中包含\n
。
write
命令中还应该包含其他什么内容以确保子程序成功收到它吗?
require 'newt'
require 'pty'
def newt_run
begin
Newt::Screen.new
Newt::Screen.centered_window(20, 15, 'Button')
b1 = Newt::Button.new(1, 1, 'Button1')
b2 = Newt::Button.new(1, 6, 'Button2')
b = Newt::Button.new(1, 11, 'Exit')
f = Newt::Form.new
f.set_timer(10000)
f.add(b1, b2, b)
rv = f.run
ensure
Newt::Screen.finish
end
end
master, slave = PTY.open
rd, wr = IO.pipe
if fork.nil? then
master.close
wr.close
$stdin.reopen(rd)
$stdout.reopen(slave)
$stderr.reopen(slave)
newt_run
else
slave.close
rd.close
wr.write "\t\r"
Process.wait
end
这里是问题:
Ruby t调用C-lib中的newtInit()
newtInit()
呼叫SLang_init_tty
SLang_init_tty
始终默认将输入附加到/dev/tty
。SLang_init_tty
,您会发现变量SLang_TT_Read_FD
确定是否使用/dev/tty
。SLang_TT_Read_FD
之前,您需要将stdin
设置为newtInit()
。>