使用 Chrome DevTools 进行网络仿真

Network emulation with Chrome DevTools

我目前使用的是 Selenium Webdriver NuGet 包的 4.0.0-alpha5 版。 因此,此代码仅在 Chrome 版本 98 中打开 DevTools 时有效,但我不明白为什么。据我所知,这应该一直有效,但唯一始终有效的是离线状态。

devTools = driver as IDevTools;
session = devTools.CreateDevToolsSession();
EmulateNetworkConditionsCommandSettings command = new EmulateNetworkConditionsCommandSettings();

command.Latency = latencyInMilliseconds;
command.DownloadThroughput = downloadLimitKbps * 1024; // Kilobytes to bytes per second
command.UploadThroughput = uploadLimitKbps * 1024; // Kilobytes to bytes per second
command.Offline = false;

session.Network.EmulateNetworkConditions(command);
//session.SendCommand(command);

你也会在 this site 上找到这段代码,所以我不知道我做错了什么。 也许这是一个错误。

一个解决方案是在测试期间只打开 DevTools,但是按 F12 之类的 selenium 热键或任何其他 Devtools 热键对我不起作用。 我尝试使用 Actions 以及在对象上发送密钥,就像描述的那样 here.

另一种解决方案可能是直接执行 CDP 命令,但我只找到 examples in Java 并没有找到如何执行此操作。这就是你在 Java:

中的做法
driver.executeCdpCommand(commandString);

感谢您的阅读,如有任何帮助,我们将不胜感激。

    public class ChromeNetworkConditionsContext : IDisposable
    {
        private readonly ChromeDriver _chromeDriver;
        private readonly ILogger _logger;

        public ChromeNetworkConditionsContext(ChromeDriver chromeDriver, ILogger logger)
        {
            _chromeDriver = chromeDriver;
            _logger = logger;
        }

        public void Dispose()
        {
            _logger.Information("Resetting network conditions");
            _chromeDriver.NetworkConditions = new();
        }
    }

        public IDisposable SetRequestsLatency(TimeSpan latency)
        {
            _log.Information($"Enabling {latency} requests latency");
            var driver = _driverProvider.GetDriver();
            if (driver is ChromeDriver chromeDriver)
            {
                chromeDriver.NetworkConditions = new()
                {
                    Latency = latency
                };
                return new ChromeNetworkConditionsContext(chromeDriver, _log);
            }

            throw new WebDriverException($"NetworkConditions is not handled for {driver.GetType().Name}");
        }

这对我有用。它在每个来自 UI.

的 API 调用之前增加了一个延迟

Chrome 版本 99.

<PackageReference Include="Selenium.WebDriver" Version="4.1.0" />

我的问题是我忘记添加 Network.Enable 命令,所以在执行其他操作之前不要忘记调用它。这是我现在使用的代码,没有特定于版本。 (在 Selenium 4.0 alpha 5 之前有效)

public void LimitNetwork(int latencyInMilliseconds, long downloadLimitMbps, long uploadLimitMbps)
{
    IDevTools devTools = driver as IDevTools;
    session = devTools.CreateDevToolsSession();
    session.Network.Enable(new EnableCommandSettings());

    EmulateNetworkConditionsCommandSettings command = new EmulateNetworkConditionsCommandSettings();

    command.Latency = latencyInMilliseconds;
    command.DownloadThroughput = downloadLimitMbps * 125000; // Mbps to bytes per second
    command.UploadThroughput = uploadLimitMbps * 125000; // Mbps to bytes per second
    command.Offline = false;

    session.Network.EmulateNetworkConditions(command);
}

如果 session.Network.EmulateNetworkConditions 不起作用你也可以尝试 session.SendCommand(command);