问题描述
我有一个基于 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();
}
}
希望能帮到你)