如何在应用程序启动之前始终通过命令行参数将远程调试端口设置为基于 jxbrowser 的chromium.exe?

问题描述

我有一个基于 Windows 的应用程序(基于 .exe),它在启动时提供了用于登录的 Win 表单。登录后,它加载应用程序并加载 JxBrowser 库,该库启动嵌入式铬浏览器(我在我的任务管理器中看到 Chromium.exe 进程此时出现)。我计划使用 selenium 自动化这个嵌入式浏览器。因此,我了解了 --remote-debugging-port 选项,因此我可以在 Chrome 中使用 selenium 访问它,并使用 localhost:<remote-debugging-port> 启动我的应用程序。

我尝试了以下方法将远程调试端口设置为我的 Windows 应用程序。

选项 1

在我的 Windows 应用程序 exe 路径中,我使用 --remote-debugging-port=9222 启动它。当我启动应用程序,然后它出现了嵌入式浏览器时,我打开一个 chrome 窗口并尝试导航到 localhost:9222,但我收到连接被拒绝。

我知道,在应用程序中,当它启动 Chromium.exe 进程时,我需要在 Chromium.exe 文件中发送远程调试端口。

选项 2

因此,我为 Chromium.exe 创建了一个快捷方式,并在该快捷方式的 Target 选项中添加了 --remote-debugging-port。然后我再次启动我的基于 Windows 的应用程序(这次在 Win 应用程序级别没有远程调试端口)。但是,一旦应用程序完全加载,并且基于嵌入式 JxBrowser 的 Chromium 窗口出现(并且任务管理器启动 Chromium.exe)进程,当我启动 Chrome 窗口并导航到 localhost:9222 时,我再次收到连接被拒绝。>

因此,在任务管理器中,我右键单击 Chromium.exe 进程,然后单击“打开文件位置”。它带我到 Chromium.exe 路径。但是,我已经在我从这个 Chromium.exe 路径中创建的快捷方式上设置了远程调试端口,所以我不确定应用程序是否接受(是否需要从快捷方式支持远程调试端口)实际的 exe 路径)在启动时生效

在尝试了多种不同的方法后,我真的很困惑如何让我的 Windows 应用程序基于 Chrome 的进程在远程调试的情况下自动启动,以便我可以使用 localhost:9222 使用 Selenium Chromedriver 执行自动化活动

由于我无法在我的 Windows 应用程序中检查基于 JxBrowser 的 Chromium 嵌入式浏览器上的任何内容,所以我真的需要让它工作。

我阅读了以下文章 Automation for "Chrome Legacy Window" (Chromium) using Winium - 但是,这也没有说明如何使用远程调试端口启动我的应用程序,用于在登录到我的 Windows 后出现的 Chromium 进程过程。

有没有人遇到过这样的情况,并且能够进行远程调试?任何帮助/建议将不胜感激。

如果需要任何具体信息,请告诉我?

解决方法

问题是当 Selenium 启动您的应用程序时,它会将 --remote-debugging-port=<port> 命令行参数传递给您的程序。您需要将此端口转发到由 JxBrowser 在您的应用中启动的 Chromium 引擎。以下示例演示了如何执行此操作:

import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;

import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.EngineOptions;
import com.teamdev.jxbrowser.view.swing.BrowserView;
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Optional;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public final class App {

    private static final String REMOTE_DEBUGGING_PORT_ARG = "--remote-debugging-port=";

    public static void main(String[] args) {
        // Create a builder for EngineOptions.
        EngineOptions.Builder builder = EngineOptions.newBuilder(HARDWARE_ACCELERATED);

        // Pass the remote debugging port from the command line if it presents.
        remoteDebuggingPortFromCommandLine(args).ifPresent(builder::remoteDebuggingPort);

        // Creating and running Chromium engine.
        Engine engine = Engine.newInstance(builder.build());
        Browser browser = engine.newBrowser();

        SwingUtilities.invokeLater(() -> {
            // Creating Swing component for rendering web content
            // loaded in the given Browser instance.
            final BrowserView view = BrowserView.newInstance(browser);

            // Creating and displaying Swing app frame.
            JFrame frame = new JFrame("Hello World");
            // Close Engine and onClose app window
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    engine.close();
                }
            });
            frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            JTextField addressBar = new JTextField("https://google.com");
            addressBar.addActionListener(e ->
                    browser.navigation().loadUrl(addressBar.getText()));
            frame.add(addressBar,BorderLayout.NORTH);
            frame.add(view,BorderLayout.CENTER);
            frame.setSize(800,500);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            browser.navigation().loadUrl(addressBar.getText());
        });
    }

    private static Optional<Integer> remoteDebuggingPortFromCommandLine(String[] args) {
        if (args.length > 0) {
            for (String arg : args) {
                if (arg.startsWith(REMOTE_DEBUGGING_PORT_ARG)) {
                    String port = arg.substring(REMOTE_DEBUGGING_PORT_ARG.length());
                    return Optional.of(Integer.parseInt(port));
                }
            }
        }
        return Optional.empty();
    }
}

希望能帮到你)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...