启动Firefox并等待它关闭

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

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

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

环境

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

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

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

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

预期的过程

使目标过程更清晰:

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

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

方案偏好:

解决方案按以下顺序排列

  1. 任何与纯Java JRE一起提供的东西。 这包括浏览器的特殊命令行参数。
  2. 需要我做的事情,例如,创建批处理脚本(例如在IE的情况下)。
  3. 任何需要第三方开源库的东西。
  4. 任何需要3rth党闭源图书馆的东西。

任何独立于平台的答案(同时适用于Windows和Linux)都优先于平台相关的答案。

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

PS

我将为其他浏览器发布几个类似的问题。 由于我认为浏览器在它们消化的命令行参数方面完全不同,启动线程和子进程的方式,我认为这是有道理的。

  • 关于Chrome的类似问题: 启动Chrome并等待它关闭
  • 关于Opera的类似问题: 启动Opera并等到它关闭
  • 关于Chromium的类似问题: 启动Chromium并等到它关闭
  • 关于Edge的类似问题: 启动Edge浏览器并等到它关闭
  • 关于Safari的类似问题: 启动Safari并等待它关闭

这是一个示例程序,可能以某种方式设法演示selenium库的function,以满足您的需求。 在运行此程序之前,您需要先下载selenium库并将其设置为IDE。

该程序允许您单击一个按钮。 然后firefox浏览器会在几秒钟内自动打开并启动一个网站。 在网站上载时请稍候。 之后,您可以关闭Firefox浏览器。 程序也应在2秒后自动关闭。

 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.net.ConnectException; import javax.swing.*; import org.openqa.selenium.NoSuchWindowException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class AnotherTest extends JFrame { WebDriver driver; JLabel label; public AnotherTest() { super("Test"); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width - 400) / 2, (screenSize.height - 100) / 2, 400, 100); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setLayout(new BorderLayout()); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { quitApplication(); } }); JButton jButton1 = new javax.swing.JButton(); label = new JLabel(""); JPanel panel = new JPanel(new FlowLayout()); panel.add(jButton1); add(panel, BorderLayout.CENTER); add(label, BorderLayout.SOUTH); jButton1.setText("Open Microsoft"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { label.setText("Loading browser. Please wait.."); java.util.Timer t = new java.util.Timer(); t.schedule(new java.util.TimerTask() { @Override public void run() { openBrowserAndWait(); } }, 10); } }); } private void openBrowserAndWait() { driver = new FirefoxDriver(); String baseUrl = "https://www.microsoft.com"; driver.get(baseUrl); java.util.Timer monitorTimer = new java.util.Timer(); monitorTimer.schedule(new java.util.TimerTask() { @Override public void run() { while (true) { checkDriver(); try { Thread.sleep(2000); } catch (InterruptedException ex) { } } } }, 10); } private void checkDriver() { if (driver == null) { return; } boolean shouldExit = false; try { label.setText(driver.getTitle()); } catch (NoSuchWindowException e) { System.out.println("Browser has been closed. Exiting Program"); shouldExit = true; } catch (Exception e) { System.out.println("Browser has been closed. Exiting Program"); shouldExit = true; } if (shouldExit) { this.quitApplication(); } } private void quitApplication() { // attempt to close gracefully if (driver != null) { try { driver.quit(); } catch (Exception e) { } } System.exit(0); } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new AnotherTest().setVisible(true); } }); } } 

Selenium主要用于测试Web应用程序的自动化。 它可以直接打开浏览器并读取其中的html内容。 有关其他信息,请访问http://www.seleniumhq.org/ 。