Откройте 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 использует несколько процессов для разных вещей, таких как разные вкладки, плагины и т.д.
  • Я попытался найти правильный процесс, глядя на дерево процессов, но ничего не нашел.
  • Я не могу просто взять последний процесс, созданный хром, потому что это может быть процесс, созданный для зависания страницы, а не самой страницы.

Ответы

Ответ 1

Если вы хотите открыть/закрыть все окно 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 закрывается, когда все связанные вкладки закрыты.

Недостатки:

  • Настройки по умолчанию (без закладок и т.д.), но вы можете скопировать их из каталога профиля пользователя по умолчанию.

Итак, возможно, вам стоит искать sth в этом направлении...

Ответ 2

Другим параметром командной строки, который работает (сорт), является --chrome-frame. Кажется, Chrome использует WinInet API в этом режиме, потому что история IE доступна. Мне больше нравится идея использования --user-data-dir с уникальной временной папкой, предложенной @DamianDrygiel.

Ответ 3

Вы можете найти все дочерние процессы процесса Chrome, которые вы запускаете, а затем дождаться их завершения.

Есть вопрос StackOverflow, в котором есть полезный код: Найти все дочерние процессы моего собственного процесса .NET/узнать, является ли данный процесс моим собственным ребенком?. Также вы можете найти это полезным: отслеживать дочерние процессы процесса.