从命令行打开Chrome并等待它关闭

我正在使用以下代码迭代浏览器可执行路径列表并启动它们中的每一个:

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状态。

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

问题是,如何强制Google Chrome在启动过程中运行,那么可以等到窗口关闭?

更新

只是为了澄清这个问题:

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

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

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

因此,在您的代码再次运行Chrome之前,您必须确保Chrome已关闭。 这对我行得通。


如果您只想打开/关闭相关标签:

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

所以,你需要的只是弄清楚如何运行另一个’铬母过程’并防止以前的拥抱杀死她; P

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

好处:

  • 有用
  • Chrome正在新窗口中打开
  • 关闭所有相关标签后,Chrome即会关闭

缺点:

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

所以,也许你应该朝这个方向寻找……

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

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

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