我正在写这个与我之前的主题相关的问题:
Run bat file from java code to get desired result in txt file - no can do :( 简而言之:我用java编写了一个运行bat文件的程序。此bat 文件运行执行桌面应用程序测试的TestComplete8 脚本。测试完成后,bat 文件会生成名为 result.txt 的文件,并向其中打印有关测试的信息。 我现在遇到了另一个问题:现在从我的java代码中我想等到bat运行完成。我通过循环直到名为 result.txt 的文件存在来做到这一点。我想这不是最好的解决方案,但我认为它可以工作,也尝试了不同的解决方案。发生的情况是,它将正常循环并等待文件存在,但 testcomplete 不执行测试。这很奇怪,因为 testcomplete 运行,我可以看到测试开始,我的 AUT 也开始,但什么也没有发生。 Testcomplete 正在等待任何对象,并且不会单击任何地方,只是等待预定义的操作时间用完。当我运行测试而无需等待代码完成时,一切都很好。我只是不明白为什么在启用等待时测试期间没有任何反应,以及为什么当我删除任何 do - while 或 waitFor() 时它工作正常,甚至我尝试在单独的线程中运行它。 :(
我有一种感觉,它可能与操作系统有某种关系,并且与进程有关,因为它运行类似 bat 的进程,而不是 bat 运行它的子进程作为 testcomplete 或类似的东西。 感谢您的回答
按照要求的源代码: 现在我正在尝试使用修改后的bat文件的解决方案:
@ECHO OFF
"C:\Program Files (x86)\Automated QA\TestComplete 8\Bin\TestComplete.exe" "C:..." /r /p:projname PathToApp="C:\...p" Login=... Password=B1 /t:"KeywordTests|..." /exit
最新版本中运行和等待的代码是:
new Thread(new Runnable() {
public void run() {
File file = new File("D:\\");
int exitValue = -1;
try {
Process process = Runtime.getRuntime().exec(batch, null, file);
while (true) {
try {
exitValue = process.exitValue();
System.out.println(exitValue);
break;
} catch (IllegalThreadStateException e) {
// e.printStackTrace();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("Waiting for process...");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
最佳答案
在不了解更多问题的情况下,最可能的原因是从 Java 启动外部进程时遇到的常见问题。启动外部进程时,会在父进程和子进程之间创建三个流:输入、输出、错误。
您可以将它们比作 System.in、System.out 和 System.err。如果父进程 (Java) 不主动消耗输出流和错误流上的数据,则子进程可能会阻塞,因为操作系统将达到流上的缓冲区限制,并在消耗之前阻止更多写入。如果您的脚本写入标准输出或标准错误,则很可能出现这种情况。
我建议使用 apache commons-exec 来处理 Java 进程启动。
这是我知道有效的代码示例。
CommandLine commandLine = new CommandLine( "TestComplete8.bat" );
commandLine.addArgument( ... );
commandLine.addArgument( ... );
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue( 0 );
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ByteArrayOutputStream errorStream = new ByteArrayOutputStream();
executor.setStreamHandler( new PumpStreamHandler( outputStream, errorStream ) );
try
{
executor.execute( commandLine );
}
catch ( ExecuteException e )
{
// TODO: ...
}
catch ( IOException e )
{
// TODO: ...
}
然后,如果您愿意,您可以在执行返回时检查输出/错误流。
关于java - 从java代码运行bat文件并等待它执行TestComplete脚本 - 无法执行:(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6869434/