在 Selenium 4.5.0 及更高版本中使用 Java 11+ HTTP Client

我們很高興分享,從 Selenium 4.5.0 開始,支援 Java 11+ HttpClient

Selenium 中目前使用的 HTTP client

Selenium 使用 HTTP client 和相關的 WebSocket client 來達成多種目的

  • 將指令傳送至 WebDriver
  • 將指令從 Selenium client 程式庫傳送至 Grid
  • 用於各種 Grid 組件彼此通訊,具體取決於 Grid 模式
  • 建立 ChromeDevTools 協議和 BiDi 協議會話

目前,Selenium 使用 AsyncHttpClient。AsyncHttpClient 是一個建立在 Netty 之上的開源程式庫。它允許非同步執行 HTTP 請求和回應。此外,它還提供 WebSocket 支援。因此它是非常適合的。

為何 Selenium 想要移至 Java 11+ HTTP Client?

雖然 AsyncHttpClient 提供了所需的功能,但自 2021 年 6 月以來,這個開源專案就沒有積極維護了。這與 Java 11+ 提供內建 HTTP 和 WebSocket client 的事實不謀而合。Selenium 可以利用它來取代 AsyncHttpClient。

目前,Selenium Java 支援 Java 8。Selenium 計劃將支援的最低版本升級到 Java 11。然而,這是一項龐大的工程。將其與主要版本發布和隨附公告對齊,對於確保使用者體驗完整至關重要。

Selenium 伺服器在 Java 11+ 上已經運行良好,因此雖然我們計劃在未來的版本中將其設為最低版本,但目前我們計劃引入可利用現代 Java 版本的可選組件。

因此,作為朝此方向邁出的第一步,從 Selenium 4.5.0 及更高版本開始提供 Java 11+ HTTP client。

在 Selenium 中使用 Java 11+ HTTP Client

先決條件

  • 專案已設定為使用 Java 11+
  • 使用 Selenium 4.5.0 作為最低版本,在下載頁面中找到最新版本。

整合 Java 11+ client

Java 11+ HTTP client 位於其自身的 artifact 中。它可以導入到使用 Java 11+ 的專案中。

將 artifact 新增至 POM

將以下 dependencies 新增至您的 pom.xml

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>4.5.0</version>
</dependency>
<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-http-jdk-client</artifactId>
  <version>4.5.0</version>
</dependency>

注意:在上面的 dependencies 中,版本 4.5.0 已顯示,但是我們建議您查看下載頁面以使用最新發布的版本。請確保使用的版本是相符的。

設定系統屬性

設定系統屬性以指示需要使用 Java 11+ Http client。預設情況下,它使用 AsyncHttpClient。

 System.setProperty("webdriver.http.factory", "jdk-http-client");

您已完成所有設定,可以利用新支援的 client。使用者體驗保持不變。其他一切都如預期般運作。

在 Grid 中使用 Java 11+ client

為此,您需要下載 selenium-http-jdk-client jar 檔案,並使用 --ext 標記使其在 Grid jar 的 classpath 中可用。

jar 檔案可以直接從 repo1.maven.org 下載,然後以以下方式啟動 Grid

java -Dwebdriver.http.factory=jdk-http-client -jar selenium-server-4.5.0.jar -—ext selenium-http-jdk-client-4.5.0.jar standalone

下載 selenium-http-jdk-client jar 檔案的替代方案是使用 Coursier

java -Dwebdriver.http.factory=jdk-http-client -jar selenium-server-4.5.0.jar —-ext $(coursier fetch -p org.seleniumhq.selenium:selenium-http-jdk-client:4.5.0) standalone

如果您使用的是 Hub/Node(s) 模式或 Distributed 模式,則需要為每個組件設定 -Dwebdriver.http.factory=jdk-http-client—-ext 標記。

注意:在上面的 dependencies 中,版本 4.5.0 已顯示,但是我們建議您查看下載頁面以使用最新發布的版本。請確保使用的版本是相符的。

非常感謝 Simon Stewart (@shs96c) 透過他的貢獻使這一切成為可能!