Accélérez en quelques secondes vos tests Selenium en utilisant Chrome & Firefox en mode sans tête
Temps de lecture estimé : 2 minutes
Le mode sans tête ?
En 2011 est apparu PhantomJS, apportant une manière simple et plutôt fidèle de reproduire le comportement des navigateurs et d’interagir avec le DOM HTML. L’autre grande qualité de PhantomJS est qu’il va agir comme un navigateur sans tête, c'est à dire sans interface graphique et donc plus rapide.
Nous aurions pu nous attendre à ce que l'usage des navigateurs sans têtes dans les tests frameworks de tests UI soit devenu le comportement par défaut en 7 ans. Seulement voilà, PhantomJS est abandonné depuis avril 2017 avec une dernière version au moteur de rendu obsolète, et pourtant de nombreux tutoriels continuent de présenter l’utilisation de PhantomJS avec Selenium pour répondre à la problématique d’un navigateur sans tête.
Dommage, alors qu'aujourd'hui Chrome et Firefox proposent d’utiliser un mode sans tête directement depuis les arguments (depuis Chrome 60 et Firefox 56).
Et Selenium dans tout ça ?
Pire encore chez le framework des tests UI que l’on ne présente plus : Selenium.
Contrairement aux utilisateurs du package Java, rien n’est prévu pour les utilisateurs du package Nuget Selenium.WebDriver pour pouvoir lancer ces navigateurs en mode sans tête !
Heureusement un rapide coup d’œil au code source Java nous en apprend suffisamment pour pouvoir utiliser ces fonctionnalités facilement :
public ChromeOptions setHeadless(boolean headless) { args.remove("--headless"); if (headless) { args.add("--headless"); args.add("--disable-gpu"); } return this; }
Notez que l'argument "--disable-gpu" est nécessaire sous Windows à l’écriture de ce poste.
public FirefoxOptions setHeadless(boolean headless) { args.remove("-headless"); if (headless) { args.add("-headless"); } return this; }
Application
Traduit en C#, il faudra fournir au constructeur du WebDriver une instance, respectivement de ChromeOptions ou de FirefoxOptions, sur laquelle on aura ajouté les arguments manquants, comme suit :
- pour ChromeDriver :
var options = new ChromeOptions(); options.AddArgument("--headless"); options.AddArgument("--disable-gpu"); var webDriver = new ChromeDriver(options);
- pour FirefoxDriver :
var options = new FirefoxOptions(); options.AddArgument("-headless"); var webDriver = new FirefoxDriver(options);
Benchmark
Testons les bénéfices de ce mode sans tête sur 14 tests Selenium représentatifs tiré d'un projet :
- ChromeDriver
- avec interface graphique : 1 min 26 secs 78
- sans interface graphique : 1 min 06 secs 18
- FirefoxDriver
- avec interface graphique : 1 min 47 secs 20
- sans interface graphique : 1 min 30 secs 03
Les résultats varient d’une exécution de test à l’autre mais sur ce projet nous avons noté une réduction du temps d’exécution d’un test de 1 à 2 secondes sur chacun des tests, ce qui est plutôt rentable en échange de quelques lignes de code lorsque un jeu complet de test peut prendre plus d'une heure.
Conclusion
Le mode sans tête des navigateurs Chrome et Firefox n’est pourtant pas la solution miracle pour un raison toute simple : il est nécessaire que Chrome ou Firefox soit installé dans l’environnement qui exécutera les tests, ce qui n’est pas forcément le cas à l’heure du cloud. Par exemple, si sur VSTS un agent de build hébergé devra utiliser PhantomJS, il reste possible d'avoir un agent on-premise.
Une autre solution est celle présenté par Vivien Fabing dans son article sur BrowserStack + Selenium qui, en déportant cette exécution sur un service tiers, se libère de la complexité lié à l'exécution de navigateurs sur différentes machines et OS.
Maintenant que vous pouvez vous libérer de PhantomJS, à vos tests !
Commentaires