使用Selenium 4模拟慢网络时限速配置不生效问题求助
问题根因
你的代码仅离线功能生效、限速与延迟规则不生效,由4个核心问题导致:
- 初始化逻辑存在判断缺陷:使用
&&判断augmentedDriver和networkConditions同时为null才重新增强驱动,当测试中driver实例重建、会话刷新时,全局缓存的augmentedDriver仍绑定已失效的旧会话,后续setNetworkConditions调用会静默失败,不会把配置下发到当前运行的浏览器。 - 日志校验逻辑无效:你打印的是Java侧
networkConditions本地对象的属性值,不是从浏览器读回的真实运行配置,哪怕配置根本没下发到浏览器,本地对象的字段已经被修改,日志会显示配置正常,产生配置生效的假象。 - 浏览器缓存绕过规则:Chromium的网络限速、延迟规则仅作用于真实网络请求,命中本地缓存的静态资源不会经过网络栈,完全不受规则影响,会直接导致你感知不到限速效果。
- 规则生效时机不对:网络条件配置仅对配置下发后新发起的请求生效,如果你在页面全部加载完成后才设置规则,已经加载完成的资源、已经建立的连接都不会被限速。
修复方案
- 移除全局缓存的
augmentedDriver和networkConditions变量,每次调用方法时基于当前传入的driver重新生成增强驱动和配置对象,避免绑定过期会话。 - 开启DevTools协议禁用浏览器缓存,确保所有资源都走网络栈,触发限速规则。
- 配置下发后,从浏览器侧读回实际生效的网络配置打印日志,替代本地对象日志做校验。
- 配置规则后主动刷新页面或跳转至目标页面,确保新发起的请求应用规则。
修复后可直接运行的代码
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chromium.ChromiumNetworkConditions; import org.openqa.selenium.chromium.HasNetworkConditions; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.HasDevTools; import org.openqa.selenium.devtools.v125.network.Network; import org.openqa.selenium.remote.Augmenter; import java.io.IOException; import java.time.Duration; import java.util.Optional; // 注意:上面devtools的v125替换为和你本地Chrome/Edge大版本一致的版本号,对应引入selenium-devtools-v125依赖 public void switchToNetworkModeUsingAugmentor(String networkMode, String offline, final WebDriver driver) throws IOException { // 每次调用基于当前driver重新增强,避免绑定旧会话 WebDriver augmentedDriver = new Augmenter().augment(driver); ChromiumNetworkConditions networkConditions = new ChromiumNetworkConditions(); // 禁用浏览器缓存,避免缓存绕过限速规则 if (driver instanceof HasDevTools devToolsDriver) { DevTools devTools = devToolsDriver.getDevTools(); devTools.createSession(); devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.of(100000000))); devTools.send(Network.setCacheDisabled(true)); } // 设置离线状态 networkConditions.setOffline(BooleanUtils.toBoolean(offline)); // 按模式配置限速、延迟,吞吐量单位为字节/秒,-1代表不限速 switch (networkMode.toLowerCase()) { case "super slow" -> { networkConditions.setDownloadThroughput(5000); // 约5KB/s,对应2G极慢网络 networkConditions.setUploadThroughput(5000); networkConditions.setLatency(Duration.ofMillis(15000)); // 15秒往返延迟 } case "slow" -> { networkConditions.setDownloadThroughput(125000); // 约125KB/s,对应1Mbps 3G网络 networkConditions.setUploadThroughput(125000); networkConditions.setLatency(Duration.ofMillis(2000)); // 2秒往返延迟 } case "normal" -> { networkConditions.setDownloadThroughput(-1); networkConditions.setUploadThroughput(-1); networkConditions.setLatency(Duration.ZERO); } } // 下发网络配置到浏览器 ((HasNetworkConditions) augmentedDriver).setNetworkConditions(networkConditions); // 从浏览器读回真实生效的配置打印日志 ChromiumNetworkConditions actualConfig = ((HasNetworkConditions) augmentedDriver).getNetworkConditions(); LOGGER.info("Network config applied: offline={}, download speed={}B/s, upload speed={}B/s, latency={}ms", actualConfig.getOffline(), actualConfig.getDownloadThroughput(), actualConfig.getUploadThroughput(), actualConfig.getLatency().toMillis()); // 主动刷新页面让规则生效,如不需要可删除 driver.navigate().refresh(); }
验证注意事项
- 该接口仅支持Chromium内核浏览器(Chrome、Edge),Firefox、Safari不支持这套专属网络控制接口,会静默失败。
- 如果使用Selenium Grid远程执行,确保Grid节点版本、Selenium依赖版本、浏览器大版本三者完全匹配,版本差会导致CDP命令不生效。
- 测试时优先在新打开的标签页导航到目标地址,避免旧页面残留的长连接、Service Worker缓存影响限速效果。
内容的提问来源于stack exchange,提问作者Sunil Singh
相关产品推荐
相关产品推荐

