从命令行打开 Chrome,然后等待它关闭

本文关键字:等待 然后 命令行 Chrome | 更新日期: 2023-09-27 18:36:33

我使用以下代码遍历浏览器可执行路径列表并启动每个路径:

foreach (var browser in browsers)
{
    var proc = new Process();
    proc.StartInfo.FileName = browser.ExecutablePath;
    proc.StartInfo.Arguments = "http://google.com";
    proc.Start();
    proc.WaitForExit();
    Console.WriteLine(proc.ExitCode.ToString());
    proc.Close();
}

应该做的是:它应该打开加载 google.com 的浏览器窗口并停止应用程序,直到窗口关闭。它适用于IE和Firefox,但在Chrome上失败。

对于 Chrome proc在启动浏览器后刚Exit处于状态,此时窗口仍处于活动状态且可见。

我尝试使用一些chromium命令行开关,包括--new-window--single-process但没有成功。

问题是,我怎样才能强制谷歌浏览器在启动过程中运行,这样就可以等到窗口关闭?

更新

只是为了澄清这个问题:

  • 我知道为什么它不起作用 - 这是因为 Chrome 对不同的事情使用多个进程,例如不同的标签、插件等。
  • 我试图在进程树上查找正确的进程,但一无所获。
  • 我不能只采用chrome创建的最新进程,因为它可能是为页面所需的插入而创建的进程,而不是页面本身。

从命令行打开 Chrome,然后等待它关闭

如果您想打开/关闭整个 Chrome 窗口:

默认情况下,Chrome 由于其默认设置而不断在后台运行。将此选项更改为未选中:
Settings > Show advanced > System > 'Continue running background apps when Google Chrome is closed'

因此,您必须确保Chrome已关闭,然后再通过代码再次运行它。这对我有用。

<小时 />

如果只想打开/关闭相关选项卡:

Chrome 有一个"母进程"和一些子进程。问题是,如果您使用代码运行 chrome,您将尝试创建"母进程"的新实例,但现有的实例不会让您这样做。她会立即杀死你的新过程,并创造自己的孩子。这就是它的工作原理...

因此,您所需要的只是弄清楚如何运行另一个"铬母亲进程"并防止之前的拥抱杀死她;P

我想出了这个解决方案:
使用此参数运行新的 chrome 进程 --user-data-dir="%temp%/random_name" 。这意味着您正在使用新的用户配置文件打开 chrome。

优势:

  • 它有效
  • Chrome 正在新窗口中打开
  • 当所有相关标签页都关闭时,Chrome 将关闭

弊:

  • 默认设置(无书签等),但您可以从默认用户配置文件目录中复制它们

所以,也许你应该在这个方向上寻找sth......

另一个(有点)工作的命令行参数是 --chrome-frame 。在此模式下,Chrome似乎使用WinInet API,因为IE历史记录可用。我更喜欢@DamianDrygiel提出的将--user-data-dir与独特的临时文件夹一起使用的想法。

您可以找到您运行的 Chrome 进程的所有子进程,然后等待它们完成。

有一个 StackOverflow 问题,其中包含一些有用的代码:查找我自己的 .NET 进程的所有子进程/找出给定进程是否是我自己的子进程?此外,您可能会发现这很有用:监视进程的子进程。