You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:31:36