启动Safari并等待它关闭

时间:2015-08-10 20:49:41

标签: java browser process safari wait

问题

我想启动Safari网络浏览器作为访问特定网站的过程,然后等到它关闭。

特殊情况是浏览器可能已经打开并运行,因为用户可能已经访问过某个网站。

在这种情况下,浏览器可能会在现有窗口中打开一个新选项卡,新启动的进程将立即终止。这不应该混淆我的等待过程:我要么想要一个新的浏览器窗口(如果可以以某种方式强制执行,可能通过命令行参数)并等待关闭,或者保持现有的浏览器窗口并等到所有选项卡由此产生我的过程已关闭。

环境

我认为这没关系,但我的编程环境是Java,您可以假设我知道浏览器的路径。

实施例

我可以获得预期行为的唯一浏览器是Internet Explorer(叹息)。在这里,我需要基本上在一个临时文件夹中创建一个类似

的新批处理脚本
start /WAIT "" "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging http://www.test.com/

然后我运行批处理脚本而不是直接运行浏览器,并在等待完成后删除它。

预期流程

使目标过程更清晰:

  1. 我的节目开始了。
  2. 我的程序将Safari浏览器作为单独的进程启动,并提供一个访问URL作为该进程的参数。
  3. Safari浏览器作为新进程异步运行,并访问提供的URL。到目前为止,这很容易。
  4. 启动新进程(Safari浏览器)后,我自己的程序应该等待所述进程终止。这是困难的部分,因为
    1. 许多现代浏览器启动多个进程。我需要等待所有这些。
    2. 许多现代浏览器可能以某种方式"分离"我自己从我发起的过程。对不起,我不知道一个更好的词,我的意思是:我启动一个进程然后启动另一个进程并立即终止,而另一个进程继续运行。如果我等待我的程序最初启动的浏览器进程,则在浏览器仍处于打开状态时等待将完成。
    3. 以上的一个特例是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可以简单地将URL传递给访问现有流程并终止。当我的程序认为她已关闭浏览器时,用户仍在我提供的URL上。通过为IE指定一个特殊的命令行参数(例如noframemerging),可能会禁止此问题。
  5. 一旦浏览器终止或与我提供的URL相关的所有标签都已关闭,我的程序将停止等待,而是继续开展业务。
  6. 用例是我有一个可以在本地或服务器上运行的Web应用程序。如果它在本地运行,它将启动Web服务器,然后打开浏览器以访问条目页面。关闭浏览器后,该Web应用程序也应该关闭。这适用于Internet Explorer。对于所有其他情况,用户必须关闭浏览器,然后明确地关闭Web应用程序。因此,如果我能够可靠地等待Safari完成,这将使用户体验更好。

    解决方案首选项:

    按以下顺序优先选择解决方案

    1. 纯Java JRE随附的任何内容。这包括浏览器的特殊命令行参数。
    2. 需要我的事情,例如,创建一个批处理脚本(例如在IE的情况下)。
    3. 任何需要第三方开源库的东西。
    4. 任何需要3方派对闭源图书馆的东西。
    5. 任何独立于编程语言的解决方案(例如,仅限命令行参数)优于纯Java解决方案。

      原因:在理想情况下,我想知道究竟是做了什么,并将其包含在我自己的代码中。由于我想支持不同的浏览器(参见" PS"下面),我希望避免每个浏览器包含一个库。最后,我不能使用商业或封闭源库,但如果没有更好的答案出现。当然,我会尊重任何有效的解决方案。我将接受#34; 1"类型的第一个(相当不错的)工作答案。如果较低偏好的答案出现,我会等几天才接受其中最好的答案。

      PS

      我将针对其他浏览器推出几个类似的问题。由于我认为浏览器在它们消化的命令行参数以及它们启动线程和子进程的方式上有很大不同,我认为这是有道理的。如果我只是问如何启动一个/任何浏览器并等待它的终止,那么很难确定"对"回答。就像每个知名浏览器的一个问题一样,也是一个很好的参考点。

1 个答案:

答案 0 :(得分:0)

由于这里有Selenium Safari驱动程序

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

我认为使用Selenium库在MacOS(以及其他操作系统)中可以实现上述要求。我在Firefox和Chrome上测试过这个基本功能,就像你在其他问题中发布的一样。如果那些确实适用于您的要求,那么Safari也可以实现。但是,这可能需要更多的工作。

Selenium用于软件测试,但我相信它可以用于您的应用程序。我认为只要Selenium支持它,这种技术也可以与其他浏览器一起使用。

对于Selenium for Chromium,我发现了一个暗示:Use Selenium with Chromium Browser

这里是Opera驱动程序的链接 https://code.google.com/p/selenium/wiki/OperaDriver

对于Edge,我发现了这个提示Is there a Selenium WebDriver available for the Microsoft Edge browser?