Java 启动Firefox并等待它关闭 问题:

Java 启动Firefox并等待它关闭 问题:,java,firefox,browser,process,wait,Java,Firefox,Browser,Process,Wait,我想启动Firefox web浏览器作为访问特定网站的过程,然后等待它关闭 一种特殊情况是,浏览器可能已经打开并正在运行,因为用户可能已经访问了某些网站 在这种情况下,浏览器可能会在现有窗口中打开一个新选项卡,新启动的进程将立即终止。这不应该混淆我的等待过程:或者,我想要一个新的浏览器窗口(如果可以通过某种方式强制执行,可能通过命令行参数)并等待它关闭,或者保留现有的浏览器窗口并等待我的过程产生的所有选项卡关闭 环境 我认为这无关紧要,但我的编程环境是Java,您可以假设我知道浏览器的路径 例子

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

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

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

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

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

start /WAIT "" "C:\Program Files\Internet Explorer\iexplore.exe" -noframemerging http://www.test.com/
然后,我运行批处理脚本,而不是直接运行浏览器,并在完成等待后将其删除

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

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

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

  • 纯JavaJRE附带的任何东西。这包括浏览器的特殊命令行参数
  • 需要我完成的事情,例如,创建一个批处理脚本(例如在IE中)
  • 任何需要第三方开源库的内容
  • 任何需要第三方封闭源代码库的内容
  • 任何与平台无关的答案(同时适用于Windows和Linux)都比与平台相关的答案更受欢迎

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

    附言 我将为其他浏览器提出几个类似的问题。因为我相信浏览器在它们消化的命令行参数、启动线程和子进程的方式上有很大的不同,所以我认为这是有意义的

    • 关于铬的类似问题:
    • 关于歌剧的类似问题:
    • 关于铬的类似问题:
    • 关于边缘的类似问题:
    • 关于狩猎的类似问题:

    以下是一个示例程序,它可以以某种方式展示selenium库满足您需要的功能。您需要先下载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内容。有关更多信息,请参阅。

    我不明白“等待它关闭”是什么意思。谁在等什么?火狐?谁要关门?火狐?firefox在等待什么?等待关闭?不,我的程序正在等待。我写一个程序。该程序启动firefox并提供特定的URL进行访问。这里的“启动”意味着它将firefox作为一个新的、独立的进程启动。然后应该等到新的过程完成