配置 Selenium WebDriver
本教程展示了如何创建一个简单的 Selenium WebDriver 应用程序,该应用程序被配置为使用 JxBrowser 访问在桌面 Java 应用程序中加载的网页。
本教程只适用于 Windows 操作系统。
前提条件
为完成本教程,我们需要:
- Git。
- Java 17 或更高版本。
- 一个有效的 JxBrowser 许可证。它可以是评估版或商业版。关于许可证的更多信息,请参见许可证指南。
- 下载了用于 Selenium 的 ChromeDriver。由于 JxBrowser 是基于 Chromium Engine 的,我们不能使用其他 Web 驱动程序(例如,Firefox WebDriver)。在本教程中使用的是 ChromeDriver 88.0.4324.96。
获取代码
要查看本教程中创建的完整应用程序,请查看我们的示例集合:
$ git clone https://github.com/TeamDev-IP/JxBrowser-Examples
$ cd JxBrowser-Examples/tutorials/selenium
JxBrowser 应用程序
创建应用程序
创建一个简单的 JxBrowser 应用程序。
添加许可证
要继续,请将许可证密钥添加到应用程序中。
配置 Chromium Engine
当 Selenium 启动我们的应用程序时,ChromeDriver 会将 --remote-debugging-port=<port>
参数传递给命令行参数。
在我们的应用程序中,我们首先从命令行参数中获取 --remote-debugging-port
参数:
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();
}
然后将其传递给由 JxBrowser 启动的 Chromium Engine:
// 为 EngineOptions 创建一个构建器。
EngineOptions.Builder builder = EngineOptions.newBuilder(HARDWARE_ACCELERATED);
// 使用从命令行参数中获取的远程调试端口配置 Engine。
remoteDebuggingPortFromCommandLine(args).ifPresent(builder::remoteDebuggingPort);
现在我们可以创建一个 Browser
实例并加载一个网页,Selenium WebDriver 将通过 ChromeDriver 检测到它并与之交互。
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.SwingUtilities;
import javax.swing.WindowConstants;
/**
* 这个示例展示了如何创建一个简单的 Swing 应用程序,其中包含一个
* 加载在 BrowserView 中的网页,并通过从命令行获取的远程调试端口
* 将 JxBrowser 的 Chromium Engine 与 Selenium 连接起来。
*/
public final class TargetApp {
private static final String REMOTE_DEBUGGING_PORT_ARG = "--remote-debugging-port=";
public static void main(String[] args) {
// 设置您的 JxBrowser 许可证密钥。
System.setProperty("jxbrowser.license.key", "your_license_key");
// 为 EngineOptions 创建一个构建器。
EngineOptions.Builder builder = EngineOptions.newBuilder(HARDWARE_ACCELERATED);
// 使用从命令行参数中获取的远程调试端口来配置 Engine。
remoteDebuggingPortFromCommandLine(args).ifPresent(builder::remoteDebuggingPort);
// 创建 Chromium Engine。
Engine engine = Engine.newInstance(builder.build());
Browser browser = engine.newBrowser();
SwingUtilities.invokeLater(() -> {
// 创建 Swing 组件来渲染给定 Browser 实例中加载的 Web 内容。
BrowserView view = BrowserView.newInstance(browser);
// 创建并显示 Swing 应用程序 Frame。
JFrame frame = new JFrame();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
engine.close();
}
});
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.add(view, BorderLayout.CENTER);
frame.setSize(800, 700);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
browser.navigation().loadUrl("https://google.com");
});
}
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();
}
}
查看完整的应用程序。
创建可执行文件
要创建我们程序的可执行文件,可以使用 launch4j Gradle 插件,或以您方便的任何方式手动创建。
Selenium 应用程序
安装 Selenium 依赖项
创建一个独立的项目并安装依赖项以使用 ChromeDriver 运行 Selenium 测试。
配置 Selenium WebDriver
要告诉 Selenium 在哪里可以找到应用程序,请提供应用程序的可执行文件的绝对/相对路径,如下所示:
ChromeOptions options = new ChromeOptions();
// 设置您的 JxBrowser 应用程序可执行文件的路径。
options.setBinary(
new File("tutorials/selenium/target-app/build/executable/TargetApp.exe"));
然后,指定用于与基于 JxBrowser 的应用程序进行通信的远程调试端口:
// 设置一个通信端口。
options.addArguments("--remote-debugging-port=9222");
该端口不应被其他应用程序使用。在本教程中,我们使用 9222 端口,但您可以随意使用任何其他可用端口。
完整的应用程序运行如下:
import java.io.File;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
/**
* 一个应用程序,用于配置 Selenium WebDriver(ChromeDriver)以在基于 JxBrowser 的应用程序二进制文件上运行,
* 并访问 JxBrowser 中加载的 HTML 内容。
*/
public final class SeleniumLauncher {
public static void main(String[] args) {
// 设置 ChromeDriver 可执行文件的路径。
System.setProperty("webdriver.chrome.driver",
"tutorials/selenium/launcher/src/main/resources/chromedriver.exe");
ChromeOptions options = new ChromeOptions();
// 设置您的 JxBrowser 应用程序可执行文件的路径。
options.setBinary(
new File("tutorials/selenium/target-app/build/executable/TargetApp.exe"));
// 设置一个用于通信的端口。
options.addArguments("--remote-debugging-port=9222");
WebDriver driver = new ChromeDriver(options);
// 现在可以使用 WebDriver 了。
System.out.printf("Current URL: %s\n", driver.getCurrentUrl());
driver.quit();
}
}
查看完整的应用程序。
运行 Selenium
运行 Selenium,如果一切配置正确,您将看到一个带有 Google 网页的 Java 窗口:
在控制台中,您应该会看到以下输出:
Current URL: https://www.google.com/
这意味着 Selenium WebDriver 成功运行了我们的应用程序,与 JxBrowser 的 Chromium Engine 建立了连接,并能够访问加载的网页以打印其 URL。
首次启动 Selenium 时,基于 JxBrowser 的应用程序本身可能会成功启动,但您可能会看到以下 ChromeDriver 错误消息:The process started from chrome location path\to\application.exe
is no longer running, so ChromeDriver is assuming that Chrome has crashed. 这表明 ChromeDriver 未能找到正在运行的应用程序。目前我们还不知道如何解决这个问题,但如果不关闭已启动的应用程序,再次运行 Selenium,驱动程序将能够检测到正在运行的应用程序二进制文件并成功启动。
总结
在本教程中,我们:
- 创建两个应用程序:一个集成了 JxBrowser 以展示网页,另一个则使用 Selenium ChromeDriver 连接前者并访问在 JxBrowser 中加载的网页。
- 展示如何使带有 JxBrowser 的应用程序对 Selenium “可见”。
- 在基于 JxBrowser 的应用程序二进制文件上运行 Selenium 应用程序以演示其工作原理。