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

时间:2013-10-23 21:39:43

标签: c# google-chrome process

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

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 command line switches,包括--new-window--single-process,但没有成功。

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

更新

只是为了澄清这个问题:

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

3 个答案:

答案 0 :(得分:7)

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

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

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


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

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

所以,你所需要的只是找出如何运行另一个'chrome mother process'并阻止之前的拥抱杀死她; P

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

优点:

  • 工作
  • Chrome正在新窗口中打开
  • 关闭所有相关标签后Chrome正在关闭

缺点:

  • 默认设置(无书签等),但您可以从默认用户个人资料目录
  • 复制它们

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

答案 1 :(得分:0)

另一个(排序)工作的命令行参数是--chrome-frame。在此模式下Chrome似乎使用WinInet API,因为IE历史记录可用。我更喜欢将@ {1}}与@DamianDrygiel提议的唯一临时文件夹一起使用。

答案 2 :(得分:0)

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

StackOverflow问题包含一些有用的代码:Find all child processes of my own .NET process / find out if a given process is a child of my own?。您也可能会发现这很有用:Monitor child processes of a process