48

Google Chrome 38在 devtools 中引入了新的“设备模式和移动仿真”功能。除了选择设备进行仿真外,还可以仿真不同的网络条件

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

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

例如,我们可以将其设置为像过去一样 - GPRS 50 Kbps:

在此处输入图像描述

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

问题是:

是否可以通过 selenium 在指定的网络条件下启动 chrome?是否可以通过 chrome 首选项或命令行参数进行控制?


当然有多种选择可以模拟慢速互联网连接,但问题是关于 chrome+selenium。

4

10 回答 10

48

用于控制网络仿真的 API已添加到 ChromeDriver。现在应该可以使用很长一段时间了。根据链接问题中的评论,由于一些错误修复,您应该使用至少 2.26 版本。

根据 Selenium更改日志绑定可用于这些语言:

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

Python的示例用法如下:

driver.set_network_conditions(
    offline=False,
    latency=5,  # additional latency (ms)
    download_throughput=500 * 1024,  # maximal throughput
    upload_throughput=500 * 1024)  # maximal throughput
于 2017-10-10T17:40:30.497 回答
17

不可以,无法通过 Chrome 首选项或命令行参数控制网络连接仿真。网络连接仿真是内置 Chrome 调试器的一部分。解决此问题的一种方法是控制调试器。这可以通过扩展或直接控制调试器来完成,请参阅说明。但是,这不适用于 WebDriver。原因是只能有一个“调试”会话并且 WebDriver 已经在使用它,请参阅说明。由于没有公共接口,因此也无法通过 WebDriver 对其进行控制。

对于也是内置调试器一部分的设备模式和移动仿真,有一个公共接口(详细信息),因此可以控制。这可以通过 WebDriver Capabilities 来完成。两个选项 1) 指定设备名称 2) 输入您自己的参数(有限)。

于 2015-01-24T02:20:54.483 回答
8

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

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)))
  );
}
于 2019-06-10T12:07:03.837 回答
5

虽然这是一个非常受欢迎和有用的功能,但对于认真的测试,我认为传统的网络模拟方法仍然是要走的路。

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

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

为什么只想使用 Chrome 功能?

于 2015-01-24T23:31:04.963 回答
5

事实上,最新的 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 发布。

于 2018-03-26T19:52:34.800 回答
3

以下问题现已在此提交中修复

对于像我这样在 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 上升。

于 2021-05-10T16:09:32.920 回答
2

看起来它很快就会出现在 Selenium (C#) 中。提交时间为 2018 年 1 月 28 日:

https://github.com/SeleniumHQ/selenium/blob/ef156067a583fe84b66ec338d969aeff6504595d/dotnet/src/webdriver/Chrome/ChromeNetworkConditions.cs

于 2018-01-30T18:07:30.997 回答
2

我知道这是一个老问题,但我最近不得不解决这个问题,这个页面出现在我的谷歌搜索的顶部。以下是我在 C# 中如何做到这一点的主要内容。希望这对将来的某人有所帮助。

var networkConditions = new ChromeNetworkConditions();
networkConditions.Latency = new TimeSpan(150);
networkConditions.IsOffline = false;
networkConditions.DownloadThroughput = 120 * 1024;
networkConditions.UploadThroughput = 150 * 1024;
Driver.NetworkConditions = networkConditions;
于 2020-06-17T14:57:16.433 回答
2

让我们考虑两种不同的方法,

一种是我们可以限制整个网络,另一种是我们可以指定具体限制哪些网络请求。

方法一:限制整个网络

const { Builder } = require("selenium-webdriver")

async function throttleNetwork() {
  let driver = await new Builder().forBrowser("chrome").build();

  await driver.setNetworkConditions({
    offline: false,
    latency: 5000, // Additional latency (ms).
    download_throughput: 50 * 1024, // Maximal aggregated download throughput.
    upload_throughput: 50 * 1024, // Maximal aggregated upload throughput.
  });

  driver.get("http://www.google.com/");
}

感谢Yaroslav指出提交。

这有一个缺点,我们无法指定特定的网络请求来限制,而其余的则不受限制。

让我们在下一个方法中解决这个缺点。

方法 2:限制特定的网络请求

在这里,我们将使用一个名为Requestly for Selenium的 npm 包。

我们需要首先在他们的客户端应用程序中创建一个规则,并通过创建一个共享列表来获取链接。

例如,让我们限制对 google.com 的网络请求

require("chromedriver");
const { Builder } = require("selenium-webdriver");
const chrome = require("selenium-webdriver/chrome");
const {
  getRequestlyExtension,
  importRequestlySharedList,
} = require("@requestly/selenium");

const sharedListUrl = "YOUR_SHARED_LIST_LINK_HERE" // For example, use "https://app.requestly.io/rules/#sharedList/1631611216670-delay"

async function throttleGoogle() {
  const options = new chrome.Options().addExtensions(
    getRequestlyExtension("chrome") // This installs requestly chrome extension in your testing instance
  );

  const driver = new Builder()
    .forBrowser("chrome")
    .setChromeOptions(options)
    .build();

  await importRequestlySharedList(driver, sharedListUrl); // Here we import the shared list we created some time back
  driver.get("http://www.google.com/");
}

这是对我们如何克服仅硒方法的缺点的高级概述。我已经写了一篇关于如何创建规则、共享列表等的博客。你可以在这里阅读。

于 2021-09-30T07:22:12.050 回答
1

TridentTrue答案的启发,这里是 C# 中 Selenium 4.0.0 的更新版本。如果有人知道如何在没有特定版本的情况下将它用于 alpha7 及更高版本,请随时更新。:)

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

    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);
}

不知何故,如果我打开了 DevTools,它只对我有用,一个简单的解决方案是在 Chrome 中自动打开 DevTools,但我目前正在寻找更好的解决方案。

更新:在我自己实现了这个之后,我发现了一篇非常好的文章,可以在 Selenium 4.0 中获得概述,也在模拟网络条件中。

于 2022-02-09T13:47:28.913 回答