从控制台应用程序启动 Selenium 进程时遇到问题

发布于 2024-09-12 07:13:43 字数 2298 浏览 3 评论 0原文

让我明确一点: - 我的路径环境变量中有 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 输出窗口,你是 必须做一些 异步调用。我可以进入 如果这确实是您的意图,请详细说明。

我很想看到这个。您介意向我展示如何做到这一点吗?非常感谢您的建议;)

Let me be clear:
- I have Java.exe in my path environment variable
- So if I want to run a "selenium-server" I will do :

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

And here is what I got so far, it compiled but not showing anything :(

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

EDIT: if you intent is to hide the
selenium-server output window, you're
going to have to make some
asynchronous calls. I can go into the
details if this is indeed your intent.

I would love to see this. Would you mind showing me how to do this? Thanks a lot for your suggestion ;)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

独守阴晴ぅ圆缺 2024-09-19 07:13:43

这对我有用...

    /// <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;
    }

This works for me...

    /// <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;
    }
萝莉病 2024-09-19 07:13:43

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

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

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

Your pro.StandardOutput.ReadToEnd() call will block until the executable terminates. Since you're starting a server that will launch and wait for output, you'll never get anything.

If you just want to see the output of the server, set UseShellExecute to true and RedirectStandardOutput and RedirectStandardError to false. (or just delete those three lines) This will cause a new console window to open and show the output from selenium-server.

EDIT: if you intent is to hide the selenium-server output window, you're going to have to make some asynchronous calls. I can go into the details if this is indeed your intent.

甜嗑 2024-09-19 07:13:43

我首先将进程的代码更改为此,看看它是否启动 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();

I would start by changing the code for the process to this to see if it starts 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();
躲猫猫 2024-09-19 07:13:43

您的程序很可能在调用 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)。

Chances are that your program is blocking on the call to pro.StandardOutput.ReadToEnd(). Consider using the non-blocking BeginOutputReadLine() method (more at http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx and http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx).

鼻尖触碰 2024-09-19 07:13:43
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);

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

        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文