List icon 目录

配置 Selenium WebDriver

本教程展示了如何创建一个简单的 Selenium WebDriver 应用程序,该应用程序被配置为使用 JxBrowser 访问在桌面 Java 应用程序中加载的网页。

本教程只适用于 Windows 操作系统。

前提条件

为完成本教程,我们需要:

  • Git.
  • Java 8 或更高版本。
  • 一个有效的 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 窗口:

Application

在控制台中,您应该会看到以下输出:

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,驱动程序将能够检测到正在运行的应用程序二进制文件并成功启动。

总结

在本教程中,我们:

  1. 创建两个应用程序:一个集成了 JxBrowser 以展示网页,另一个则使用 Selenium ChromeDriver 连接前者并访问在 JxBrowser 中加载的网页。
  2. 展示了如何让使用 JxBrowser 的应用程序对 Selenium “可见”。
  3. 在基于 JxBrowser 的应用程序二进制文件上运行 Selenium 应用程序,演示其工作原理。