java browser process safari wait

java - Inicie Safari y espere hasta que esté cerrado



browser process (1)

Esta pregunta ya tiene una respuesta aquí:

Pregunta

Quiero iniciar el navegador web Safari como el proceso para visitar un sitio web específico, luego esperar hasta que se cierre.

Una situación especial es que el navegador ya puede estar abierto y ejecutándose, ya que el usuario ya puede haber visitado algún sitio web.

En ese caso, el navegador probablemente abrirá una nueva pestaña en una ventana existente y el proceso recién lanzado se cerrará inmediatamente. Esto no debe confundir mi proceso de espera: deseo una nueva ventana del navegador (si eso puede aplicarse de alguna manera, tal vez mediante argumentos de línea de comandos) y esperar hasta que se cierre, o mantener la ventana del navegador existente y esperar hasta que todas las pestañas resulten de mi proceso está cerrado.

Ambiente

Creo que no importa, pero mi entorno de programación es Java y puedes asumir que conozco la ruta del navegador.

Ejemplo

El único navegador para el que puedo obtener el comportamiento esperado es Internet Explorer (suspiro). Aquí, básicamente necesito crear un nuevo script por lotes en una carpeta temporal con algo así como

start /WAIT "" "C:/Program Files/Internet Explorer/iexplore.exe" -noframemerging http://www.test.com/

Luego ejecuto el script por lotes en lugar de directamente el navegador y lo borro una vez que termino de esperar.

Proceso previsto

Para hacer que el proceso previsto sea más claro:

  1. Mi programa comienza.
  2. Mi programa inicia el navegador Safari como un proceso separado y proporciona una URL para visitar como argumento para ese proceso.
  3. El navegador Safari se ejecuta de forma asíncrona, como un nuevo proceso, y visita la URL proporcionada. Hasta ahora, esto es fácil.
  4. Después de iniciar el nuevo proceso (el navegador Safari), mi propio programa debe esperar a que termine dicho proceso. Esta es la parte difícil, ya que
    1. Muchos navegadores modernos inician procesos múltiples. Tendría que esperar a todos ellos.
    2. Muchos navegadores modernos pueden de alguna manera "separarse" del proceso que inicié. Lo siento, no sé una palabra mejor, lo que quiero decir es: inicio un proceso que luego inicia otro proceso y finaliza inmediatamente mientras el otro proceso continúa. Si espero el proceso del navegador iniciado originalmente por mi programa, la espera finalizará mientras el navegador aún esté abierto.
    3. Un caso especial de lo anterior es la navegación con pestañas, como se realiza en muchos navegadores: si el navegador ya está abierto (en un proceso separado iniciado por el usuario) cuando lo ejecuto, mi proceso recién iniciado puede simplemente comunicar la URL para visitar el proceso existente y terminar. El usuario sigue en mi URL proporcionada mientras mi programa cree que ha cerrado el navegador. Este problema puede prohibirse especificando un argumento de línea de comando especial, como noframemerging para el IE.
  5. Una vez que el navegador ha finalizado o se han cerrado todas las pestañas relacionadas con la URL que proporciono, mi programa dejará de esperar y, en su lugar, continuará funcionando.

El caso de uso es que tengo una aplicación web que puede ejecutarse localmente o en un servidor. Si se ejecuta localmente, inicia un servidor web y luego abre el navegador para visitar la página de entrada. Una vez que el navegador está cerrado, esa aplicación web debería cerrarse también. Esto funciona de manera confiable para Internet Explorer. Para todos los demás casos, el usuario debe cerrar el navegador y luego, explícitamente, la aplicación web. Por lo tanto, si pudiera esperar de forma confiable para que Safari termine, la experiencia del usuario sería mucho mejor.

Preferencias de la solución:

Las soluciones son preferidas en el siguiente orden

  1. Cualquier cosa que se envíe con Java JRE puro. Esto incluye argumentos especiales de línea de comandos para el navegador.
  2. Cosas que me requieren, por ejemplo, crear un script por lotes (como en el caso de IE).
  3. Todo lo que requiera bibliotecas de código abierto de terceros.
  4. Todo lo que requiera bibliotecas de fuentes cerradas de terceros.

Cualquier solución independiente de lenguaje de programación (por ejemplo, argumentos de línea de comando solamente) es preferible a una Java pura.

Motivo: En el caso ideal, me gustaría saber qué se hace exactamente e incluirlo en mi propio código. Como quiero admitir diferentes navegadores (ver "PS" a continuación), me gustaría evitar tener que incluir una biblioteca por navegador. Finalmente, no puedo usar bibliotecas comerciales o de código cerrado, pero si no aparece una respuesta mejor. Por supuesto, honraré cualquier solución de trabajo con aceptación. Aceptaré la primera respuesta de trabajo (razonablemente buena) del tipo "1". Si aparecen respuestas de menor preferencia, esperaré unos días antes de aceptar la mejor entre ellas.

PD

Lanzaré un par de preguntas similares para otros navegadores. Como creo que los navegadores son bastante diferentes en los argumentos de la línea de comandos que digieren y en la forma en que inician subprocesos y subprocesos, creo que esto tiene sentido. Si tan solo preguntara cómo iniciar / cualquier navegador y esperar su finalización, sería bastante difícil determinar la respuesta "correcta". Tener, por ejemplo, una pregunta por navegador bien conocido también podría ser un buen punto de referencia.


Como hay un conductor de Selenium Safari aquí

https://code.google.com/p/selenium/wiki/SafariDriver

Supongo que lo que desea arriba es posible en MacOS (y en otros sistemas operativos) utilizando la biblioteca de Selenium. Solo he probado una funcionalidad básica de esto en Firefox y Chrome, como se publicó en sus otras preguntas. Si esos son realmente aplicables a sus requisitos, esto también es posible con Safari. Esto puede necesitar más trabajo, sin embargo.

Selenium fue diseñado para pruebas de software, pero creo que puede utilizarse para su aplicación. Y creo que esta técnica también es posible con otros navegadores, siempre que Selenium lo soporte.

Para Selenium for Chromium encontré una pista en esto: Use Selenium with Chromium Browser

Y aquí el enlace para el controlador de Opera https://code.google.com/p/selenium/wiki/OperaDriver

Para Edge, encontré esta sugerencia ¿Hay un Selenium WebDriver disponible para el navegador Microsoft Edge?