Selenium 4.51 在 10 月 10 日凌晨(北京时间)发布,Java 绑定里 ExpectedCondition 不再实现 Guava 的 Function 接口,把它当 Guava Function 用的老代码会编不过。只用 java.util.function.Function 或直接用 ExpectedCondition 类型的项目不受影响。官方说客户端绑定已经去掉了 Guava,但我在 4.51.0 的 selenium-java 依赖树里仍然看到它经 selenium-remote-driver 传递进来。

这版 Java 端改了什么

按 Java CHANGELOG 和官方博客,Java 端最大的改动是客户端绑定移除 Guava(#13739),ExpectedCondition 只剩 JDK 的 Function 一个父接口。另外新增了 RemoteWebDriver.getClientFactory(),HttpCommandExecutor 里那几个已废弃字段的删除推迟到 4.53。

修复方面,驱动启动失败时不再泄漏 HttpClient(#18047),也不再给 Selenium Manager 传一个光秃秃的 --proxy 参数(#18089)。CDP 支持范围更新为 v153、v154、v155。BiDi 部分加了代码生成器,嵌套 RemoteValue 直接从解析树解码,不再逐个子树重新序列化。

本地对比 4.50.0 和 4.51.0

准备两个只依赖 selenium-java 的 Maven 工程,版本分别是 4.50.0 和 4.51.0,放同一个类:

package demo;

import java.util.Arrays;
import java.util.function.Function;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;

public class Check {
  public static void main(String[] args) {
    ExpectedCondition<Boolean> c = ExpectedConditions.titleIs("demo");
    Function<WebDriver, Boolean> f = c;
    System.out.println("interfaces: " + Arrays.toString(ExpectedCondition.class.getInterfaces()));
    try {
      Class.forName("com.google.common.base.Function");
      System.out.println("guava on classpath: yes");
    } catch (ClassNotFoundException e) {
      System.out.println("guava on classpath: no");
    }
  }
}

环境是 OpenJDK 21.0.12.1、Maven 3.9.9、Linux。运行结果:

$ cd 4.50.0 && mvn -q compile exec:java -Dexec.mainClass=demo.Check
interfaces: [interface com.google.common.base.Function, interface java.util.function.Function]
guava on classpath: yes
$ cd 4.51.0 && mvn -q compile exec:java -Dexec.mainClass=demo.Check
interfaces: [interface java.util.function.Function]
guava on classpath: yes

接口少了一个,赋值给 JDK Function 的写法两个版本都能编译。

哪种写法会坏

把 ExpectedCondition 当成 Guava Function 用的代码会坏,比如:

static com.google.common.base.Function<WebDriver, Boolean> old =
    ExpectedConditions.titleIs("demo");

在 4.51.0 下编译:

[ERROR] 4.51.0/src/main/java/demo/Legacy.java:[8,33] incompatible types: org.openqa.selenium.support.ui.ExpectedCondition<java.lang.Boolean> cannot be converted to com.google.common.base.Function<org.openqa.selenium.WebDriver,java.lang.Boolean>

声明类型换成 java.util.function.Function 或 ExpectedCondition 就能编过,参数写成 Guava Function 的等待工具方法也是同样的改法。官方博客的 Highlights 里附了迁移说明的链接。

Guava 依赖:官方说法和实测

官方博客 Selenium 4.51 Released! 的 Highlights 原文:

[Java] Guava is no longer a dependency of the client bindings, so ExpectedCondition no longer implements Guava’s Function interface.

Java CHANGELOG v4.51.0 条目原文:

remove guava from client bindings #12737 (#13739)

本地对 4.51.0 工程执行 mvn dependency:tree -Dincludes=com.google.guava:guava,结果:

[INFO] \- org.seleniumhq.selenium:selenium-java:jar:4.51.0:compile
[INFO]    \- org.seleniumhq.selenium:selenium-remote-driver:jar:4.51.0:compile
[INFO]       \- com.google.guava:guava:jar:33.7.2-jre:compile

上面 Check 的输出里,4.51.0 同样打印了 guava on classpath: yes。也就是说,ExpectedCondition 和 Guava 的接口关系断了,但用 selenium-java 聚合依赖的项目,类路径上 Guava 还在。

主源:

  • GitHub Release:https://github.com/SeleniumHQ/selenium/releases/tag/selenium-4.51.0 (2026-10-10 03:18 CST)
  • 官方博客:https://www.selenium.dev/blog/2026/selenium-4-51-released/
— 感谢阅读 —

一起交流

分享你的思考,让讨论更进一步。