启动 Firefox 并等待其关闭

2024-05-25

Question

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

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

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

环境

我认为这并不重要,但我的编程环境是Java你可以假设我知道浏览器的路径。

Example

我可以获得预期行为的唯一浏览器是IE浏览器 https://stackoverflow.com/questions/3349922(叹。)。在这里,我基本上需要在临时文件夹中创建一个新的批处理脚本,其中包含类似的内容

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

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

预期流程

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

  1. 我的程序开始了。
  2. 我的程序将 Firefox 浏览器作为单独的进程启动,并提供一个 URL 作为该进程的参数来访问。
  3. Firefox 浏览器作为一个新进程异步运行,并访问提供的 URL。到目前为止,这很容易。
  4. After launching the new process (the Firefox browser), my own program should wait for the said process to terminate. This is the hard part, as
    1. 许多现代浏览器都会启动多个进程。我需要等待他们所有人。
    2. 许多现代浏览器可能会以某种方式将自己与我启动的进程“分离”。抱歉,我不知道更好的词,我的意思是:我启动一个进程,然后启动另一个进程并立即终止,而另一个进程继续运行。如果我等待程序最初启动的浏览器进程,则等待将在浏览器仍然打开时完成。
    3. 上述情况的一个特殊情况是在许多浏览器中实现的选项卡式浏览:如果当我启动浏览器时浏览器已经打开(在用户启动的单独进程中),我新启动的浏览器进程可能会简单地传达要访问的 URL现有进程并终止。用户仍在使用我提供的 URL,而我的程序认为她已经关闭了浏览器。可以通过指定特殊的命令行参数来禁止此问题,例如noframemerging对于IE。
  5. 一旦浏览器终止或与我提供的 URL 相关的所有选项卡都已关闭,我的程序将停止等待,而是继续执行其业务。

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

解决方案偏好:

解决方案优选按以下顺序排列

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

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

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

PS

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

  • 关于 Chrome 的类似问题:启动 Chrome 并等待其关闭 https://stackoverflow.com/questions/31911440
  • 关于 Opera 的类似问题:启动 Opera 并等待其关闭 https://stackoverflow.com/questions/31916896
  • 关于铬的类似问题:启动 Chromium 并等待其关闭 https://stackoverflow.com/questions/31919123
  • 关于Edge的类似问题:启动 Edge 浏览器并等待其关闭 https://stackoverflow.com/questions/31921095
  • 关于 Safari 的类似问题:启动 Safari 并等待其关闭 https://stackoverflow.com/questions/31928891

这是一个示例程序,它可以以某种方式设法演示硒库满足您想要的功能的能力。您需要先下载 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/ http://www.seleniumhq.org/获取更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

启动 Firefox 并等待其关闭 的相关文章

  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • focusout 事件后,Mouseleave 事件在 Firefox 中无法持续触发

    我正在运行以下代码
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo

随机推荐

  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 如何使用授权 API 设置部分身份验证

    好的 我正在通过 Authorize net API 设置部分付款 以便能够使用多张卡支付单笔余额 费用 我假设他们的部分身份验证功能涵盖了我的用例 但在测试中 我可以在此处使用 API 实时控制台向您展示一个问题 https develo
  • CSS:100% 宽度和背景?

    在我的页面中 有 2 3 个部分的宽度和背景为 100 当我全屏打开它时 一切正常 但当屏幕小于 960px 本节内容的宽度 时 背景图像不是整个页面 右侧的瞬间隐藏在没有背景的地方 它是白色的 你可以在这里明白我的意思 http mico
  • 如何将SSRS共享数据集和数据源直接导入BIDS 2008?

    Using SSRS 报表服务器 10 50 1600 1 BIDS Visual Studio 9 0 30729 4462 来自同一域和网络上的远程客户端 不在 SSRS 服务器上本地 我希望能够将报表服务器上的现有共享数据源和共享数据
  • mongodb/node.js 中单文档并发读写操作的问题

    编辑 6 15我尝试运行相同的代码 在调用之前添加延迟 doSafePush 再次收到 ConcurrencyDBError 时 即执行return when resolve wait delay 35 then function doSa
  • 如何找到 JAR:/home/hadoop/contrib/streaming/hadoop-streaming.jar

    我正在练习有关 Amazon EMR 的复数视角视频教程 我被困住了 因为我收到此错误而无法继续 Not a valid JAR home hadoop contrib streaming hadoop streaming jar 请注意
  • git 查找胖提交

    是否可以获取有关每次提交中的更改浪费了多少空间的信息 以便我可以找到添加了大文件或大量文件的提交 这一切都是为了尝试减少 git repo 的大小 变基并可能过滤提交 你可以这样做 git ls tree r t l full name H
  • JavaScript IDE/编译器

    现在 我希望你们中的一些人能够理解我的要求 我是编程新手 我在 Codecademy com 上了解了 JavaScript 我使用 labs codecademy com 来编写 JavaScript 但它有限制 对于编程新手来说 我可以
  • MongoDB - 在父文档中填充 GridFS 文件元数据

    我使用 NodeJS 与 Express MongoDB Mongoose 和 GridFS 来上传和检索文件 我想通过 ID 引用其他文档中的文件 并在查询其他文档时填充文件元数据 例如 如果我有一个包含这样的文档的 用户 集合 id O
  • 如何在Azure媒体服务V3中实现字幕?

    如何使用 net SDK在azure media service 3中完成字幕 我正在使用 Azure 媒体服务 v3 教程 https github com Azure Samples media services v3 dotnet t
  • 条件格式 DT 中的样式

    我想根据 B 列中的值对 A 列中的行进行着色 下面的代码基于小插图中的示例Link https rstudio github io DT 010 style html 但仅显示两列的条件 mobile number by mobile f
  • PyQt 和 QSignalMapper/lambdas - 多个信号,单槽

    我在 PyQt 的菜单上有一个操作列表 每个操作对应我想要显示的每个不同的提要 所以我有一个 Y 将活动源设置为 Y Z 将其设置为 Z 等等 对于网络漫画阅读程序 我的菜单上都有 并且觉得自动化方法可能更好 而不是每次都打字 类似于将其添
  • 如何将这个基于代码的 WPF 工具提示转换为 Silverlight?

    以下工具提示代码适用于WPF 我正在努力让它发挥作用银光 但它给了我这些errors TextBlock does not contain a definition for ToolTip Cursors does not contain
  • OpenBUGS:伯努利分布中缺失值

    我正在尝试通过 R R2OpenBUGS 使用 OpenBUGS 将观察 时间 建模为随机变量 如果所有观察时间都可用 没有 NA 则一切正常 但如果我将其中一个时间设置为 NA 则什么也不会发生 我使用 WinBUGS 测试了相同的代码
  • 使用 System.Json 迭代 JSON

    我正在探索 NET 4 5 的功能System Json库 但没有太多文档 而且由于流行的 JSON NET 库 搜索起来相当棘手 我基本上想知道 我如何循环一些 JSON 例如 People Simon Age 25 Steve Age
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • 在 C++17 中编译具有非固定基础类型的 constexpr 从 int 静态转换为作用域枚举的未定义行为

    我想知道以下内容是否应该在 C 17 中编译 enum class E A B constexpr E x static cast
  • 如何从集合中检索元素而不删除它?

    假设如下 gt gt gt s set 1 2 3 我如何获得一个值 任何值 s不做s pop 我想将该项目保留在集合中 直到我确定可以删除它 这只有在异步调用另一个主机之后才能确定 又快又脏 gt gt gt elem s pop gt
  • 从 Cloud Run 实例调用 Google Cloud API 的延迟

    当我出于某种原因从 Cloud Run 实例调用其他云 API 时 响应会出现巨大的延迟 一切都在 1 个项目内进行 即使从本地计算机调用也更快 几秒钟 但部署在云中 某些请求需要几分钟才能完成 据我所知 它与所有 API 相关 除了 Fi
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进