【问题标题】:Open Chrome from command line and wait till it's closed从命令行打开 Chrome 并等待它关闭
【发布时间】:2013-10-23 21:39:43
【问题描述】:

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

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,但没有成功。

问题是,如何强制谷歌浏览器在它启动的过程中运行,这样才有可能等到窗口关闭?

更新

只是为了澄清问题:

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

【问题讨论】:

  • 请注意,Chrome 会为每个标签页创建一个单独的进程,IE 和 Firefox 不太可能在单独的线程中运行标签页。
  • Chrome 使用多个进程来运行所有内容。超级用户对此进行了讨论:superuser.com/questions/461552/…
  • 假设打开的tab的进程是你启动的进程的子进程,我试着用这里的代码找到proc的子进程[stackoverflow.com/questions/7189117/…但是没用,对不起...
  • @Mecek 我尝试了同样的方法,但一无所获。看起来 chrome 总是有一个 master 进程来处理所有其他进程,无论您如何打开新窗口/标签。请在问题末尾查看我的更新。
  • 您不能使用 Process 类来完成这项工作。您必须编写一个 Chrome 扩展程序。

标签: c# google-chrome process


【解决方案1】:

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

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

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


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

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

所以,你只需要弄清楚如何运行另一个“chrome 母进程”并防止之前的拥抱杀死她;P

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

优点:

  • 有效
  • Chrome 正在新窗口中打开
  • 当所有相关选项卡都关闭时,Chrome 正在关闭

缺点:

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

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

【讨论】:

  • +1,我刚刚发布了一个类似的答案,然后注意到你已经提到了--user-data-dir,所以我删除了我的。你为什么说程序需要以管理员身份运行?只要指定给--user-data-dir 的路径是唯一且无需管理员权限即可访问的,它对我有效,无需管理员权限。此外,--disable-extensions 和/或 --incognito 可能有助于减少新的配置文件占用空间。
  • @Noseratio 当我测试我的解决方案时,如果没有管理员权限,它就无法工作,但如果它对你有用,那么它似乎不是一个规则。编辑:也许您刚刚以管理员身份运行 Visual Studio,这就是它对您有用的原因?
  • 所有 chrome 扩展进程都有--extension-process 参数。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以找到您运行的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2012-12-30
      • 2021-12-17
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多