启动 Firefox 并等待它关闭

Posted

技术标签:

【中文标题】启动 Firefox 并等待它关闭【英文标题】:Launch Firefox and Wait until it is Closed 【发布时间】:2015-11-02 08:12:15 【问题描述】:

问题

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

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

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

环境

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

示例

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

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 完成,这将使用户体验更好。

解决方案偏好:

按以下顺序首选解决方案

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

任何独立于平台的答案(适用于 Windows 和 Linux)都优于依赖于平台的答案。

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

PS

我将针对其他浏览器提出几个类似的问题。因为我相信浏览器在它们消化的命令行参数、启动线程和子进程的方式上是完全不同的,我认为这是有道理的。

关于 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 关于 Safari 的类似问题:Launch Safari and Wait Until it is Closed

【问题讨论】:

我很困惑“等到它关闭”是什么意思。谁/什么在等待?火狐?谁被关闭?火狐?火狐在等待什么?等待关闭? 不,我的程序正在等待。我写一个程序。程序启动firefox并提供一定的URL来访问。这里的“开始”意味着它将firefox作为新的独立进程启动。然后应该等到该新进程终止。 “终止”意味着用户已经关闭了新的浏览器窗口(或者,如提到的特殊情况,我调用 Firefox 产生的所有选项卡)。 好的,所以程序将等待firefox关闭,然后在firefox关闭后,程序也将退出..谢谢。 【参考方案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内容。更多信息请参见http://www.seleniumhq.org/。

【讨论】:

driver.get(baseUrl) 什么时候回来? Firefox 启动后立即?还是在新推出的 Firefox 关闭之后? 作为我之前评论的扩展:如果上面的代码有这个功能,我会等一段时间(比如几天)看看是否出现了一个非基于库的解决方案,即一个工作纯粹是Java附带命令行参数等的东西。如果Selenium库是开源的并且没有出现这样的答案,我会接受你的答案。如果 Selenium 库是闭源的(现在无法检查),我会更喜欢开源解决方案。否则,我会接受你的回答。

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

启动 Firefox 并等待它关闭

Websocket 连接不会在 FireFox 中关闭

为啥 Firefox 不等待 WebSocket 连接?

linux下firefox启动出问题

带有硒的 Firefox 空白网页浏览器

firefox 如何设置关闭之后再打开都是上次浏览时未关闭的页面