启动 Chrome 并等待它关闭 [重复]
Posted
技术标签:
【中文标题】启动 Chrome 并等待它关闭 [重复]【英文标题】:Launch Chrome and Wait Until it is Closed [duplicate] 【发布时间】:2015-11-01 21:19:12 【问题描述】:问题
我想启动 Chrome 网络浏览器作为访问特定网站的进程,然后等待它关闭。
一种特殊情况是浏览器可能已经打开并正在运行,因为用户可能已经访问过某个网站。
在这种情况下,浏览器可能会在现有窗口中打开一个新选项卡,并且新启动的进程将立即终止。这不应该混淆我的等待过程:要么,我想要一个新的浏览器窗口(如果可以以某种方式强制执行,也许可以通过命令行参数)并等到它关闭,或者保留现有的浏览器窗口并等到所有选项卡产生从我的进程关闭。
环境
我觉得没关系,不过我的编程环境是Java
,你可以假设我知道浏览器的路径。
示例
我可以获得预期行为的唯一浏览器是Internet Explorer(叹气)。在这里,我基本上需要在临时文件夹中创建一个新的批处理脚本,例如
start /WAIT "" "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging http://www.test.com/
然后我运行批处理脚本而不是直接运行浏览器,并在等待完成后将其删除。
预期过程
为了使预期的过程更清晰:
-
我的程序开始了。
我的程序将 Chrome 浏览器作为单独的进程启动,并提供一个 URL 作为该进程的参数来访问。
Chrome 浏览器作为一个新进程异步运行,并访问提供的 URL。到目前为止,这很容易。
启动新进程(Chrome 浏览器)后,我自己的程序应该等待所述进程终止。这是困难的部分,因为
-
许多现代浏览器启动多个进程。我需要等待所有这些。
许多现代浏览器可能会以某种方式“脱离”我启动的进程。抱歉,我不知道更好的词,我的意思是:我启动一个进程,然后启动另一个进程并在另一个进程继续运行时立即终止。如果我等待最初由我的程序启动的浏览器进程,则等待将在浏览器仍处于打开状态时完成。
上面的一个特殊情况是在许多浏览器中实现的选项卡式浏览:如果浏览器在我启动它时已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地将 URL 传递给访问现有进程并终止。当我的程序认为她已关闭浏览器时,用户仍在我提供的 URL 上。可以通过指定一个特殊的命令行参数来禁止这个问题,例如 IE 的
noframemerging
。
用例是我有一个可以在本地或服务器上运行的 Web 应用程序。如果它在本地运行,它会启动一个 Web 服务器,然后打开浏览器访问入口页面。关闭浏览器后,该 Web 应用程序也应该关闭。这对 Internet Explorer 来说是可靠的,对于所有其他情况,用户必须关闭浏览器,然后明确地关闭 Web 应用程序。因此,如果我可以可靠地等待 Chrome 完成,这将使用户体验更好。
解决方案偏好:
按以下顺序首选解决方案
-
纯 Java JRE 附带的任何内容。这包括浏览器的特殊命令行参数。
需要我做的事情,例如创建批处理脚本(例如在 IE 案例中)。
任何需要第三方开源库的东西。
任何需要第 3 方封闭源代码库的内容。
任何独立于平台的答案(适用于 Windows 和 Linux)都优于依赖于平台的答案。
原因:在理想情况下,我想知道具体做了什么并将其包含到我自己的代码中。由于我想支持不同的浏览器(参见下面的“PS”),我想避免每个浏览器都包含一个库。最后,我不能使用商业或封闭源代码库,但如果没有更好的答案出现,当然,我会接受任何可行的解决方案。我将接受“1”类型的第一个(相当不错的)工作答案。如果出现偏好较低的答案,我会等几天再接受其中最好的答案。
PS
我将针对其他浏览器提出几个类似的问题。因为我相信浏览器在它们消化的命令行参数、启动线程和子进程的方式上是完全不同的,我认为这是有道理的。
关于 Firefox 的类似问题:Launch Firefox 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 关于 Safari 的类似问题:Launch Safari and Wait Until it is Closed【问题讨论】:
这个问题不是重复的。正如我明确指出的那样,我理想地寻找无需库即可工作的答案,例如特定浏览器的命令行参数或等待特定浏览器的其他方式(可能通过标准输入/标准输出等)。这样的答案将是高度特定于浏览器的,Firefox 的答案不太可能在 chrome 中工作,反之亦然 - 正如我明确指出的那样。如果我一般要求“浏览器”,如果有多个特定于浏览器的答案,我该怎么办? (当然,如果没有出现无库答案,我会接受 selenium 答案。) 【参考方案1】:我在Launch Firefox and Wait until it is Closed 中对您的问题的回答也适用于此。但是您需要在下面添加导入
import org.openqa.selenium.chrome.ChromeDriver;
并从
更改以下代码driver = new FirefoxDriver();
到
System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
driver = new ChromeDriver();
您还需要下载一个单独的 chrome 驱动程序文件 (chromedriver.exe)。 selenium 网站上有一个链接。您需要将文件复制到相应的文件夹中。
【讨论】:
以上是关于启动 Chrome 并等待它关闭 [重复]的主要内容,如果未能解决你的问题,请参考以下文章