java - 在应用程序启动之前,如何始终通过命令行参数将远程调试端口设置为基于 jxbrowser 的 chromium.exe?
问题描述
我有一个基于 Windows 的应用程序(基于 .exe),它在启动时会出现用于登录的 Win 表单。登录后,它会加载应用程序并加载启动嵌入式 chromium 浏览器的 JxBrowser 库(我在任务管理器中看到 Chromium.exe 进程此时出现)。我计划使用 selenium 自动化这个嵌入式浏览器。因此,我阅读了有关选项的信息,因此我可以使用启动我的应用程序的--remote-debugging-port
selenium 在 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 进程。
有没有人遇到过这样的情况,并且能够进行远程调试?任何帮助/建议将不胜感激。
请让我知道是否需要任何具体信息?
解决方案
问题是,当 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();
}
}
我希望它有帮助)
推荐阅读
- python - 结合 Pandas 的 startwith 和 isin
- keycloak - 我应该使用 Keycloak 中的组来管理会员吗
- python - “ end=' ' ”问题(如何不改变行?)
- vlsi - NMOS漏极负电压
- php - 如何在while循环中停止多个重定向
- python - 在用列数据减去数据框后我得到了 Nans
- javascript - 在函数返回中同时渲染文本和 FontAwesome 图标
- mysql - MySQL 复制中的主机 IP 更改
- c++ - 为什么 clang-tidy 建议在任何地方添加 [[nodiscard]] ?
- c - 重新初始化共享库中的环境