无头 Chrome 未在 StandardOutput 中发送 WebSocket URL

问题描述 投票:0回答:1

我正在尝试使用 .NET core 和我在下面共享的代码创建一个无头 Chrome。根据“https://developer.chrome.com/docs/chromium/new-headless”,它必须将 WebSocket URL 发送到标准输出。启动进程后,我创建了延迟以允许 chrome 启动。我已经阅读了标准输出和标准错误,但两者都是空的。我已经根据上面的链接尝试了一些尝试和错误,但仍然面临问题。

除此之外,对于使用 JS 修改 HTML 或在 .NET Core 中使用此 websocket URL 的网页抓取网站来说,使用“--dump-dom”是更好的方法

static void Main(string[] args)
 {

     StartBrowser().GetAwaiter().GetResult();    

 }
 public static async Task StartBrowser()
 {
     using (var process = new Process())
     {

         process.StartInfo.FileName = "C:\\Program Files\\Google\\Chrome\\Application\\chrome";
         process.StartInfo.CreateNoWindow = false;
         process.StartInfo.UseShellExecute = false;  
         process.StartInfo.RedirectStandardOutput = true;
         process.StartInfo.RedirectStandardError = true;
         process.StartInfo.RedirectStandardInput = true;

         string arguments = "--headless=new --remote-debugging-port=0 https://developer.chrome.com/";
         process.StartInfo.Arguments = arguments;
         Console.WriteLine("Start Time:" + DateTime.Now.ToString());
         process.Start();
         await Task.Delay(20000);
         Task<string> output = process.StandardOutput.ReadToEndAsync();
         Task<string> error = process.StandardError.ReadToEndAsync();
         var task =await Task.WhenAll(output,error);
         Console.WriteLine(process.StandardOutput.ReadToEnd());
         Console.WriteLine(process.StandardError.ReadToEnd());
         Console.WriteLine("End Time: " + DateTime.Now.ToString();

         process.WaitForExit();

     }
 }

此外,当我尝试使用邮递员连接到 CDP 套接字并尝试执行一些命令(如“Page.enable”、Network.enable)时,许多或不起作用,只有“Target”相关命令正在工作。

google-chrome-devtools .net-6.0 google-chrome-headless headless-browser
1个回答
0
投票
罪魁祸首就是

ReadToEnd()
!你正在用它阻挡!并且在 chrome 退出之前不会得到输出!

您可以删除所有等待/任务/延迟等并使用它:

// your existing code till process.Start()

while (true)
{
    string? stdErrorLine = process.StandardError.ReadLine();

    if (stdErrorLine != null)
    {
        Console.WriteLine(stdErrorLine);
    }
    else
    {
        break;
    }
}

Console.WriteLine("End Time: " + DateTime.Now.ToString();

process.WaitForExit();
© www.soinside.com 2019 - 2024. All rights reserved.