web-dev-qa-db-fra.com

Limitation du réseau avec chrome et sélénium

Google Chrome 38 a introduit la nouvelle fonctionnalité "Mode appareil et émulation mobile" dans devtools. En plus de choisir un appareil pour l'émulation, il est également possible de émuler différentes conditions de résea :

L'optimisation des performances de votre site dans différentes conditions de réseau est un aspect clé du développement pour un public mobile.

Le conditionnement réseau du mode appareil vous permet de tester votre site sur une variété de connexions réseau, y compris Edge, 3G et même hors ligne. Sélectionnez une connexion dans la liste déroulante prédéfinie pour appliquer la limitation du réseau et la manipulation de latence.

Par exemple, nous pouvons le configurer comme au bon vieux temps - GPRS 50 Kbps:

enter image description here

Nous avons maintenant un bon cas d'utilisation pour cela - nous avons une application interne pour les tests de vitesse du réseau. Et cette nouvelle fonctionnalité d'émulation est très utile pour les tests manuels. Mais, nous aimerions l'automatiser.

La question est:

Est-il possible de démarrer chrome via Selenium avec des conditions de réseau spécifiées? Est-ce quelque chose qui peut être contrôlé via chrome préférences ou arguments de ligne de commande)?


Il existe certainement plusieurs options pour simuler une connexion Internet lente , mais la question concerne spécifiquement Chrome + Selenium.

37
alecxe

L'API pour contrôler l'émulation du réseau ont été ajoutés à ChromeDriver. Et devrait être disponible pendant un bon moment maintenant. Selon commentaire dans le problème lié, vous devez utiliser la version 2.26 au moins en raison d'une correction de bogue.

Selon Selenium changelog les liaisons sont disponibles pour ces langues:

  • JavaScript à partir de la version 3.4.0 ( commit )
  • Python à partir de la version 3.5.0 ( commit )
  • Ruby à partir de la version 3.11.0 ( commit )
  • C # à partir de la version 4 ( commit )

Si vous avez besoin de ces liaisons dans d'autres langues, vous devriez probablement ouvrir l'implémentation de problème/contribution similaire à l'une des précédentes.

Exemple d'utilisation de Python est ci-dessous:

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

Non, il n'est pas possible de contrôler Emulation de connectivité résea à Chrome ou arguments de ligne de commande. L'émulation de connectivité réseau fait partie de la fonction intégrée Chrome debugger. Une façon de résoudre ce problème est de contrôler le débogueur. Cela peut être fait via une extension ou en contrôlant directement le débogueur, voir explication . Cependant, cela ne fonctionnera pas avec WebDriver. La raison en est qu'il ne peut y avoir qu'une seule session de "débogage" et que WebDriver l'utilise déjà, voir explication . Puisqu'il n'y a pas d'interface publique, il n'y a également aucun moyen de la contrôler via WebDriver.

Pour Mode appareil et émulation mobile qui fait également partie du débogueur intégré, il existe une interface publique ( détails ), et peut donc être contrôlée. Cela peut être fait via les capacités de WebDriver. Deux options 1) Spécifiez un nom d'appareil 2) Entrez vos propres paramètres (limité).

13
Paul

Bien que ce soit une fonctionnalité très bienvenue et utile, pour des tests sérieux, je pense que les méthodes conventionnelles de simulation de réseau sont toujours le chemin à parcourir.

Je connais 2 solutions en plus de celles déjà liées - le proxy web Charles (outil très utile - commercial) et implémentant votre propre recette en utilisant Linux Traffic Control (par exemple voir le chapitre 6 de LAMPe2e ).

En interférant avec les connexions réseau plutôt qu'avec le navigateur, vous obtenez alors une mesure appropriée de l'impact indépendamment du navigateur utilisé.

Pourquoi voulez-vous simplement utiliser la fonctionnalité Chrome?

5
symcbean

En effet C # Selenium dernier (3.11) a ajouté NetworkConditions. Vous pouvez maintenant l'utiliser comme ceci:

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

Le problème est qu'il n'est pas encore utilisable à cause du bug

https://github.com/SeleniumHQ/Selenium/issues/569

Les gars de .Net devront donc attendre la version 3.12 de Selenium.

5
Konstantin Chernov

Vous pouvez utiliser cette méthode pour exécuter votre scénario de test dans des conditions de réseau spécifiées

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)))
  );
}
2
akash
2
0x2bad