代码之家  ›  专栏  ›  技术社区  ›  roxrook

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

  •  0
  • roxrook  · 技术社区  · 15 年前

    让我澄清一下: -我的路径环境变量中有java.exe -因此,如果我想运行“Selenium服务器”,我将执行以下操作:

    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服务器输出窗口, 一定要做一些 异步调用。我可以进入 如果这确实是你的意图,请详细说明。

    我很想看看这个。你能告诉我怎么做吗?非常感谢您的建议;)

    5 回复  |  直到 12 年前
        1
  •  1
  •   Xander    15 年前

    这对我有用…

        /// <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;
        }
    
        2
  •  1
  •   Tim Coker    15 年前

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

    如果只想查看服务器的输出,请设置 UseShellExecute 成真 RedirectStandardOutput RedirectStandardError 错了。(或者只删除这三行)这将导致一个新的控制台窗口打开并显示Selenium服务器的输出。

    编辑:如果您想要隐藏Selenium服务器输出窗口,那么必须进行一些异步调用。如果这确实是你的意图,我可以详细说明。

        3
  •  0
  •   PsychoCoder    15 年前

    首先,我将把进程的代码改成这个,看看它是否启动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();
    
        4
  •  0
  •   Jeff Mattfield    15 年前

    很可能你的程序在调用时阻塞了 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 )

        5
  •  0
  •   Antony chakradhar kasturi    12 年前
    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);
    
            }
        }