使用 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);
我目前使用的是 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);