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/
一起交流
分享你的思考,让讨论更进一步。