1

我需要知道如何通过 Ruby 发送终端命令来执行另一个应用程序。我想在我的 Watir 脚本中的某个点调用 SIKULI 脚本来处理 Watir 无法处理的一些步骤。

我不知道该怎么做。我在 Stack Overflow 上阅读了一些文章,但无法让它发挥作用。

这些是手动执行它的步骤:

jfleck-mbp:~ joe.fleck$ SIKULI_HOME=/Applications/Sikuli-IDE.app/Contents/Resources/Java
jfleck-mbp:~ joe.fleck$ java -jar $SIKULI_HOME/sikuli-script.jar '/Users/joe.fleck/Desktop/Save_File_Button.sikuli'

这些在我试图执行的 Ruby 文件中:

require 'rubygems'
system('SIKULI_HOME=/Applications/Sikuli-IDE.app/Contents/Resources/Java')
system ("java -jar $SIKULI_HOME/sikuli-script.jar '/Users/joe.fleck/Desktop/Save_File_Button.sikuli'")

我得到的输出是:

Unable to access jarfile /sikuli-script.jar

这告诉我脚本中的第一行没有执行允许访问。

任何建议,将不胜感激。

4

2 回答 2

3

认为system()每个命令都会得到不同的外壳。

一种简单的验证方法和一种更易于维护的方法,恕我直言,将所有命令放在一个(bash/zsh/whatever)脚本中并使用system().

于 2012-11-01T13:48:24.743 回答
1

像这样修复它:

ENV['SIKULI_HOME'] = '/Applications/Sikuli-IDE.app/Contents/Resources/Java'
system ("java -jar $SIKULI_HOME/sikuli-script.jar '/Users/joe.fleck/Desktop/Save_File_Button.sikuli'")

问题是,当您调用 时system,您正在调用一个子进程。子进程从父进程(在本例中为您的 Ruby 脚本)继承环境。使用system设置环境变量仅为该子进程设置它,下一次调用系统是具有新环境的新子进程。

上面显示的解决方案在父进程中设置环境变量,因此它将为所有子进程设置。

于 2012-11-01T13:53:12.780 回答