Abre Chrome desde la línea de comandos y espera hasta que se cierre.

Estoy usando el siguiente código para recorrer una lista de rutas ejecutables de los navegadores e iniciar cada una de ellas:

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(); } 

Lo que debe hacer es: debe abrir la ventana del navegador con google.com cargado y detener la aplicación hasta que se cierre la ventana. Y funciona bien tanto para IE como para Firefox, pero falla con Chrome.

Para Chrome, proc encuentra en estado Exit justo después de iniciar el navegador, cuando la ventana aún está activa y visible.

Intenté usar algunos de los interruptores de la línea de comandos de cromo , incluidos --new-window y --single-process pero sin éxito.

La pregunta es, ¿cómo puedo forzar a Google Chrome para que se ejecute en el proceso en que se inicia, por lo que sería posible esperar hasta que se cierre la ventana?

Actualizar

Solo para aclarar la pregunta:

  • Sé por qué no funciona, porque Chrome utiliza varios procesos para diferentes cosas, como diferentes tabs, complementos, etc.
  • Traté de encontrar el proceso correcto buscando en el árbol de procesos, pero no encontré nada.
  • No puedo simplemente tomar el último proceso creado por Chrome, ya que puede ser el proceso creado para un complemento que requiere la página, no la página en sí.

Si quieres abrir / cerrar toda la ventana de Chrome:

Por defecto, Chrome se ejecuta constantemente en segundo plano debido a su configuración predeterminada. Cambia esta opción a desmarcado:
Settings > Show advanced > System > 'Continue running background apps when Google Chrome is closed'

Por lo tanto, debe asegurarse de que Chrome esté cerrado antes de ejecutarlo nuevamente mediante su código. Funciona para mi.


Si desea abrir / cerrar solo las tabs relacionadas:

Chrome tiene un ‘proceso madre’ y algunos procesos hijos. El problema es que si ejecuta Chrome utilizando su código, está intentando crear una nueva instancia de “proceso madre” pero la existente no le permitirá hacerlo. Ella instantáneamente matará tu nuevo proceso y creará su propio hijo en su lugar. Asi es como funciona…

Entonces, todo lo que necesitas es descubrir cómo ejecutar otro ‘proceso madre cromado’ y evitar que el aarm anterior la mate; P

Me imagino esta solución:
Ejecute el nuevo proceso de Chrome con este parámetro --user-data-dir="%temp%/random_name" . Esto significa que estás abriendo Chrome con un nuevo perfil de usuario.

Ventajas:

  • Funciona
  • Chrome se está abriendo en una nueva ventana
  • Chrome se cierra cuando se cierran todas las tabs relacionadas

Desventajas:

  • Configuraciones predeterminadas (sin marcadores, etc.) pero puede copiarlas del directorio de perfil de usuario predeterminado

Entonces, tal vez deberías buscar algo en esta dirección …

Otro parámetro de línea de comando que (tipo de) funciona es --chrome-frame . Parece que Chrome usa la API de WinInet cuando está en este modo, porque el historial de IE está disponible. Me gusta más la idea de usar --user-data-dir con una carpeta temporal única, según lo propuesto por @DamianDrygiel.

Puede encontrar todos los procesos secundarios del proceso de Chrome que ejecuta y luego esperar a que finalicen.

Hay una pregunta de StackOverflow que tiene un código útil: ¿ Buscar todos los procesos secundarios de mi propio proceso .NET / averiguar si un proceso dado es un hijo mío? . También puede resultarle útil: Supervise los procesos secundarios de un proceso .