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

问题描述

我有一个基于 Windows 的应用程序(基于 .exe),它在启动时会出现用于登录的 Win 表单。登录后,它会加载应用程序并加载启动嵌入式 chromium 浏览器的 JxBrowser 库(我在任务管理器中看到 Chromium.exe 进程此时出现)。我计划使用 selenium 自动化这个嵌入式浏览器。因此,我阅读了有关选项的信息,因此我可以使用启动我的应用程序的--remote-debugging-portselenium 在 Chrome 中访问它。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 时,我再次收到 Connection Refused。

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

在尝试了多种不同的事情之后,我真的很想知道如何让我的 Windows 应用程序基于铬的进程在远程调试的情况下自动启动,这样我就可以使用 Selenium Chromedriver 使用 localhost:9222 执行自动化活动

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

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

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

请让我知道是否需要任何具体信息?

标签: javaselenium-webdriverchromiumjxbrowser

解决方案


问题是,当 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();
    }
}

我希望它有帮助)


推荐阅读