Проблемы с запуском процесса Selenium из консольного приложения - PullRequest
0 голосов
/ 03 августа 2010

Позвольте мне прояснить: Я имею Java.exe в моей переменной окружения пути - Поэтому, если я хочу запустить «Селен-сервер», я сделаю:

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(); 
        }
    }
}

РЕДАКТИРОВАТЬ: если вы хотите скрыть окно вывода селен-сервера, вы придется сделать некоторые асинхронные вызовы. Я могу пойти в детали, если это действительно ваше намерение.

Я бы хотел это увидеть. Не могли бы вы показать мне, как это сделать? Большое спасибо за ваше предложение;)

Ответы [ 5 ]

1 голос
/ 03 августа 2010

Ваш pro.StandardOutput.ReadToEnd() вызов будет блокироваться до тех пор, пока исполняемый файл не завершится. Поскольку вы запускаете сервер, который будет запускать и ждать вывода, вы ничего не получите.

Если вы просто хотите увидеть выходные данные сервера, установите UseShellExecute на true и RedirectStandardOutput и RedirectStandardError на false. (или просто удалите эти три строки) Это откроет новое окно консоли и покажет выходные данные с selenium-server.

РЕДАКТИРОВАТЬ: если вы хотите скрыть окно вывода сервера селен, вам придется сделать несколько асинхронных вызовов. Я могу вдаваться в детали, если это действительно ваше намерение.

1 голос
/ 03 августа 2010

Это работает для меня ...

    /// <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;
    }
0 голосов
/ 03 августа 2010
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);

        }
    }
0 голосов
/ 03 августа 2010

Скорее всего, ваша программа блокирует вызов pro.StandardOutput.ReadToEnd(). Рассмотрите возможность использования неблокирующего метода BeginOutputReadLine() (больше на http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx и http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx).

0 голосов
/ 03 августа 2010

Я бы начал с изменения кода этого процесса, чтобы посмотреть, запускается ли он 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...