启动 Safari 并等待它关闭 [重复]

Posted

技术标签:

【中文标题】启动 Safari 并等待它关闭 [重复]【英文标题】:Launch Safari and Wait Until it is Closed [duplicate] 【发布时间】:2015-11-02 22:02:32 【问题描述】:

问题

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

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

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

环境

我觉得没关系,不过我的编程环境是Java,你可以假设我知道浏览器的路径。

示例

我可以获得预期行为的唯一浏览器是Internet Explorer(叹气)。在这里,我基本上需要在临时文件夹中创建一个新的批处理脚本,例如

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

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

预期过程

为了使预期的过程更清晰:

    我的程序开始了。 我的程序将 Safari 浏览器作为单独的进程启动,并提供一个 URL 作为该进程的参数来访问。 Safari 浏览器作为一个新进程异步运行,并访问提供的 URL。到目前为止,这很容易。 启动新进程(Safari 浏览器)后,我自己的程序应该等待所述进程终止。这是困难的部分,因为
      许多现代浏览器启动多个进程。我需要等待所有这些。 许多现代浏览器可能会以某种方式“脱离”我启动的进程。抱歉,我不知道更好的词,我的意思是:我启动一个进程,然后启动另一个进程并在另一个进程继续运行时立即终止。如果我等待最初由我的程序启动的浏览器进程,则等待将在浏览器仍处于打开状态时完成。 上面的一个特殊情况是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动它时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地将 URL 传递给访问现有进程并终止。当我的程序认为她已关闭浏览器时,用户仍在我提供的 URL 上。这个问题可以通过指定一个特殊的命令行参数来禁止,比如 IE 的noframemerging
    一旦浏览器终止或与我提供的 URL 相关的所有选项卡都已关闭,我的程序将停止等待,而是继续执行其业务。

用例是我有一个可以在本地或服务器上运行的 Web 应用程序。如果它在本地运行,它会启动一个 Web 服务器,然后打开浏览器访问入口页面。关闭浏览器后,该 Web 应用程序也应该关闭。这适用于 Internet Explorer。对于所有其他情况,用户必须关闭浏览器,然后明确地关闭 Web 应用程序。因此,如果我可以可靠地等待 Safari 完成,这将使用户体验更好。

解决方案偏好:

按以下顺序首选解决方案

    纯 Java JRE 附带的任何内容。这包括浏览器的特殊命令行参数。 需要我做的事情,例如创建批处理脚本(例如在 IE 案例中)。 任何需要第三方开源库的东西。 任何需要第 3 方封闭源代码库的内容。

任何与编程语言无关的解决方案(例如,仅命令行参数)都优于纯 Java 解决方案。

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

PS

我将针对其他浏览器提出几个类似的问题。因为我相信浏览器在它们消化的命令行参数以及它们启动线程和子进程的方式上是完全不同的,我认为这是有道理的。如果我只想问如何启动/任何浏览器并等待其终止,那么很难确定“正确”的答案。例如,每个知名浏览器都有一个问题也可能是一个很好的参考点。

关于 Firefox 的类似问题:Launch Firefox and Wait until it is Closed 关于 Chrome 的类似问题:Launch Chrome and Wait Until it is Closed 关于 Opera 的类似问题:Launch Opera and Wait Until it is Closed 关于 Chromium 的类似问题:Launch Chromium and Wait Until it is Closed 关于 Edge 的类似问题:Launch Edge Browser and Wait Until it is Closed

【问题讨论】:

目标设备会是mac吗?如果是这样,您可以使用脚本。 /Applications/Safari.app/Contents/MacOS/Safari & sleep 1 && osascript -e '告诉应用程序“Safari”打开位置“localhost:8080”' 我假设它不仅是一个 mac,所以这个解决方案可能不起作用。 这个问题不是重复的。正如我明确指出的那样,我理想地寻找无需库即可工作的答案,例如特定浏览器的命令行参数或等待特定浏览器的其他方式(可能通过标准输入/标准输出等)。这样的答案将是高度特定于浏览器的,Firefox 的答案不太可能在 safari 中工作,反之亦然 - 正如我明确指出的那样。如果我一般要求“浏览器”,如果有多个特定于浏览器的答案,我该怎么办? (当然,如果没有出现无库答案,我会接受 selenium 答案。) 进一步详细说明为什么我认为这个问题不是重复的:如果有人问“我如何在 Word 中制作彩色表格?”,这不会是问题“如何我可以在 OpenOffice 中制作彩色表格吗?”。我相信这里的情况也差不多。 【参考方案1】:

由于这里有 Selenium Safari 驱动程序

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

我假设您在 MacOS(和其他操作系统)上使用 Selenium 库可以实现您想要的。正如您在其他问题中发布的那样,我仅在 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?

【讨论】:

以上是关于启动 Safari 并等待它关闭 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过 HTML/css 关闭 Chrome/Safari 拼写检查 [重复]

关闭一个java应用程序并启动另一个应用程序[重复]

如何通过 Safari URL 启动我的 iPhone 应用程序 [重复]

等待 QProcess 完成或持续时间超过 [重复]

启动 Firefox 并等待它关闭

启动 Firefox 并等待它关闭