java - 从java代码运行bat文件并等待它执行TestComplete脚本 - 无法执行:(

标签 java command-line batch-file testcomplete

我正在写这个与我之前的主题相关的问题:

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/

相关文章:

java - 根据位置提取双引号之间的单词

java - 如何删除 swt/jface 中的向导容器标题栏

java - 在矩阵java中找到相等数字的最大区域

c# - 使用 .NET Framework 4.6.1 构建 .NET 标准库 1.4,无需 Visual Studio

android - 尝试使用 adb 递归地将 Android 文件拉入 Windows PC 时出现特殊文件名问题

java - jdbc 中的结果集返回 true

linux - Grep 在 "S+"状态启动

batch-file - 执行批处理文件中的快捷链接,而不必等待应用程序退出

c#运行守护进程命令行

matlab - EXE崩溃时如何避免提示