从控制台应用程序启动Selenium进程时出现问题

时间:2010-08-03 16:31:43

标签: c# process

让我说清楚: - 我的路径环境变量中有Java.exe - 所以,如果我想运行“selenium-server”,我会这样做:

1. Start cmd.exe
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.
C:\Documents and Settings\cnguyen>
2. Then:
C:\Documents and Settings\cnguyen>cd C:\Selenium RC 0.9.2\selenium-server-0.9.2
3. Next, I'm in the directory that I want so I run:
C:\Documents and Settings\cnguyen>cd C:\Selenium RC 0.9.2\selenium-server-0.9.2

C:\Selenium RC 0.9.2\selenium-server-0.9.2>java -jar selenium-server.jar
09:26:18.586 INFO - Java: Sun Microsystems Inc. 16.3-b01
09:26:18.586 INFO - OS: Windows 2003 5.2 x86
09:26:18.586 INFO - v0.9.2 [2006], with Core v0.8.3 [1879]
09:26:18.633 INFO - Version Jetty/5.1.x
09:26:18.633 INFO - Started HttpContext[/selenium-server/driver,/selenium-server
/driver]
09:26:18.633 INFO - Started HttpContext[/selenium-server,/selenium-server]
09:26:18.633 INFO - Started HttpContext[/,/]
09:26:18.648 INFO - Started SocketListener on 0.0.0.0:4444
09:26:18.648 INFO - Started org.mortbay.jetty.Server@16a55fa

这是我到目前为止所得到的,它编译但没有显示任何东西:(

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace SeleniumProcessExample
{
    public class SeleniumProcess
    {
        private Process pro;
        public SeleniumProcess()
        {

            pro = new Process();
            Directory.SetCurrentDirectory( @"C:\Selenium RC 0.9.2\selenium-server-0.9.2" );

            pro.StartInfo.FileName = "java";
            pro.StartInfo.Arguments = " -jar selenium-server.jar";
            pro.StartInfo.RedirectStandardOutput = true;
            pro.StartInfo.RedirectStandardError = true;
            pro.StartInfo.UseShellExecute = false;

            pro.Start();

            string strOutput = pro.StandardOutput.ReadToEnd();
            string strError = pro.StandardError.ReadToEnd();

            Console.WriteLine( strOutput );
            Console.WriteLine( strError );
            Console.Out.Flush();

            pro.CloseMainWindow(); 
        }
    }
}

  编辑:如果你的意图是隐藏   selenium-server输出窗口,你   必须做一些   异步调用。我可以进入   如果这确实是你的意图,请详细说明。

我很想看到这个。你介意给我看怎么做吗?非常感谢你的建议;)

5 个答案:

答案 0 :(得分:1)

这对我有用......

    /// <summary>
    /// Creates new process to run and executable file, and return the output
    /// </summary>
    /// <param name="program">The name of the executable to run</param>
    /// <param name="arguments">Any parameters that are required by the executable</param>
    /// <param name="silent">Determines whether or not we output execution details</param>
    /// <param name="workingDirectory">The directory to run the application process from</param>
    /// <param name="standardErr">The standard error from the executable. String.Empty if none returned.</param>
    /// <param name="standardOut">The standard output from the executable. String.Empty if none returned, or silent = true</param>
    /// <returns>The application's exit code.</returns>
    public static int Execute(string program, string arguments, bool silent, string workingDirectory, out string standardOut, out string standardErr)
    {
        standardErr = String.Empty;
        standardOut = String.Empty;

        //sometimes it is not advisable to output the arguments e.g. passwords etc
        if (!silent)
        {
            Console.WriteLine(program + " " + arguments);
        }

        Process proc = Process.GetCurrentProcess();

        if (!string.IsNullOrEmpty(workingDirectory))
        {
            //execute from the specific working directory if specified
            proc.StartInfo.WorkingDirectory = workingDirectory;
        }

        proc.EnableRaisingEvents = true;
        proc.StartInfo.FileName = program;
        proc.StartInfo.Arguments = arguments;
        proc.StartInfo.CreateNoWindow = true;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.RedirectStandardError = true;
        proc.Start();
        proc.WaitForExit();

        //only display the console output if not operating silently
        if (!silent)
        {
            if (proc.StandardOutput != null)
            {
                standardOut = proc.StandardOutput.ReadToEnd();
                Console.WriteLine(standardOut);
            }     
        }

        if (proc.StandardError != null)
        {
            standardErr = proc.StandardError.ReadToEnd();
            Console.WriteLine(standardErr);
        }

        proc.StandardOutput.Close();
        proc.StandardError.Close();

        return proc.ExitCode;
    }

答案 1 :(得分:1)

您的pro.StandardOutput.ReadToEnd()调用将阻塞,直到可执行文件终止。因为你正在启动一个将启动并等待输出的服务器,所以你永远不会得到任何东西。

如果您只想查看服务器的输出,请将UseShellExecute设置为true,将RedirectStandardOutputRedirectStandardError设置为false。 (或者只是删除这三行)这将导致打开一个新的控制台窗口并显示selenium-server的输出。

编辑:如果您打算隐藏selenium-server输出窗口,那么您将不得不进行一些异步调用。如果这确实是你的意图,我可以详细说明。

答案 2 :(得分:0)

我首先将进程的代码更改为此,以查看它是否启动java.exe

pro = new Process();

pro.StartInfo.FileName = @"C:\Selenium RC 0.9.2\selenium-server-0.9.2\java.exe";
pro.StartInfo.Arguments = " -jar selenium-server.jar";
pro.StartInfo.RedirectStandardOutput = true;
pro.StartInfo.RedirectStandardError = true;
pro.StartInfo.UseShellExecute = false;
pro.Start();

答案 3 :(得分:0)

您的程序可能会在调用pro.StandardOutput.ReadToEnd()时阻止。请考虑使用非阻止BeginOutputReadLine()方法(http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspxhttp://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx更多)。

答案 4 :(得分:0)

class LaunchJava
{

    private static Process myProcessProcess;
    private static StreamWriter myProcessStandardInput;

    private static Thread thist = Thread.CurrentThread;

    public static void DoJava()
    {

        // Initialize the process and its StartInfo properties.
        // The sort command is a console application that
        // reads and sorts text input.

        myProcess= new Process();
        myProcess.StartInfo.Arguments = "-jar selenium-server.jar";
        myProcess.StartInfo.FileName = @"C:\Documents and Settings\cnguyen\java.exe";

        // Set UseShellExecute to false for redirection.
        myProcess.StartInfo.UseShellExecute = false;

        // Redirect the standard output of the sort command.  
        // This stream is read asynchronously using an event handler.
        myProcess.StartInfo.RedirectStandardOutput = true;
        myProcessOutput = new StringBuilder("");

        // Set our event handler to asynchronously read the sort output.
        myProcess.OutputDataReceived += new DataReceivedEventHandler(myProcessOutputHandler);

        // Redirect standard input as well.  This stream
        // is used synchronously.
        myProcess.StartInfo.RedirectStandardInput = true;


        Console.WriteLine("Start.");
        // Start the process.
        myProcess.Start();


        // Use a stream writer to synchronously write the sort input.
        myProcessStandardInput = myProcess.StandardInput;

        // Start the asynchronous read of the sort output stream.
        myProcess.BeginOutputReadLine();


       // Wait for the process to end on its own.
       // as an alternative issue some kind of quit command in myProcessOutputHandler
       myProcess.WaitForExit();


        // End the input stream to the sort command.
       myProcessInput.Close();

        myProcessProcess.Close();
    }

    private static void myProcessOutputHandler(object sendingProcess, DataReceivedEventArgs Output)
    {
        // do interactive work here if needed...
        if (!String.IsNullOrEmpty(Output.Data))
        { myProcess.StandardInput.BaseStream.Write(bytee,0,bytee.GetLength);

        }
    }