用铬和硒进行网络节流

时间:2015-01-10 21:38:50

标签: performance google-chrome selenium selenium-webdriver bandwidth-throttling

Google Chrome 38在devtools中引入了新的"Device Mode & Mobile Emulation"功能。除了选择用于仿真的设备外,还可以emulate different network conditions

  

在不同的网络条件下优化网站的性能是   为移动受众开发的一个关键方面。

     

设备模式的网络调节允许您在a上测试您的网站   各种网络连接,包括Edge,3G甚至离线。   从预设下拉列表中选择一个连接以应用网络   限制和延迟操纵。

例如,我们可以将它设置为过去 - GPRS 50 Kbps:

enter image description here

现在我们有一个很好的用例 - 我们有一个用于网络速度测试的内部应用程序。这种新的仿真功能对手动测试非常有用。但是,我们希望自动化它。

问题是:

是否可以通过指定网络条件下的硒启动镀铬?它可以通过chrome首选项或命令行参数来控制吗?


simulate slow internet connection肯定有多种选择,但问题特别是关于铬+硒。

8 个答案:

答案 0 :(得分:24)

用于控制ChromeDriver的网络模拟were added的API。现在应该可以使用一段时间了。根据链接问题中的comment,您应该使用至少2.26的版本,因为有一些错误修正。

根据Selenium changelog绑定可用于这些语言:

如果您需要其他语言的这些绑定,您可能应该打开与上述类似的问题/贡献实现。

Python的示例用法如下:

driver.set_network_conditions(
    offline=False,
    latency=5,  # additional latency (ms)
    download_throughput=500 * 1024,  # maximal throughput
    upload_throughput=500 * 1024)  # maximal throughput

答案 1 :(得分:13)

不,无法通过Chrome偏好设置或命令行参数来控制Network Connectivity Emulation。网络连接仿真是内置Chrome调试器的一部分。解决此问题的一种方法是控制调试器。这可以通过扩展或直接控制调试器来完成,请参阅explanation。但是,这不适用于WebDriver。原因是只能有一个" debug" session和WebDriver已经在使用它,请参阅explanation。由于没有公共接口,因此也无法通过WebDriver控制它。

对于Device Mode & Mobile Emulation,它也是内置调试器的一部分,有一个公共接口(details),因此可以被控制。这可以通过WebDriver功能完成。两个选项1)指定设备名称2)输入您自己的参数(有限)。

答案 2 :(得分:5)

虽然这是一个非常受欢迎且有用的功能,但对于严肃的测试,我认为传统的网络模拟方法仍然是可行的方法。

除了那些已经链接的解决方案之外,我知道2个解决方案 - Charles web proxy(非常有用的工具 - 商业化)并使用Linux流量控制实现您自己的配方(例如,参见LAMPe2e的第6章)

通过干扰网络连接而不是浏览器,您可以独立于正在使用的浏览器获得适当的影响度量。

为什么您只想使用Chrome功能?

答案 3 :(得分:4)

确实C#Selenium最新(3.11)添加了NetworkConditions。现在您可以像这样使用它:

     var driver = new ChromeDriver(pathToDriver);
     driver.NetworkConditions = new ChromeNetworkConditions()
     {  DownloadThroughput = 5000, UploadThroughput = 5000, Latency = TimeSpan.FromMilliseconds(5) };

问题是它因为错误而无法使用

  

https://github.com/SeleniumHQ/selenium/issues/5693

所以.Net人员必须等到3.12 Selenium Release。

答案 4 :(得分:2)

答案 5 :(得分:2)

您可以使用此方法在指定的网络条件下运行测试用例

protected void networkThrotting() throws IOException {
  Map map = new HashMap();
  map.put("offline", false);
  map.put("latency", 5);
  map.put("download_throughput", 500);
  map.put("upload_throughput", 1024);


  CommandExecutor executor = ((ChromeDriver)driver).getCommandExecutor();
  Response response = executor.execute(
        new Command(((ChromeDriver)driver).getSessionId(),    "setNetworkConditions", ImmutableMap.of("network_conditions", ImmutableMap.copyOf(map)))
  );
}

答案 6 :(得分:1)

我知道这是一个老问题,但是最近我不得不解决此问题,因此该页面位于我的Google搜索的顶部。以下是我在C#中的主要用法。希望这对以后的人有所帮助。

var networkConditions = new ChromeNetworkConditions();
networkConditions.Latency = new TimeSpan(150);
networkConditions.IsOffline = false;
networkConditions.DownloadThroughput = 120 * 1024;
networkConditions.UploadThroughput = 150 * 1024;
Driver.NetworkConditions = networkConditions;

答案 7 :(得分:1)

对于像我这样在 C# 世界中想知道为什么上传/下载吞吐量没有按预期工作的人来说,这些属性的工具提示似乎被错误标记了。工具提示指出数据速率以 kb/s 为单位测量,但根据我自己的经验,它实际上是每秒字节数,因此如果您想使用更熟悉的测量值(如 Mbps),则必须乘以 125,000:

int latencyInMilliseconds = 20;
long downloadLimitMbps = 20;
long uploadLimitMbps = 5;
_driver.NetworkConditions = new ChromeNetworkConditions()
{
    Latency = new TimeSpan(0, 0, 0, 0, latencyInMilliseconds),
    DownloadThroughput = downloadLimitMbps * 125000, // Mbps to bytes per second
    UploadThroughput = uploadLimitMbps * 125000, // Mbps to bytes per second
    IsOffline = false,
};

使用这些设置并在我的测试运行时查看网络流量,我可以看到它们导致正好 20Mbps 下降和 5Mbps 上升。