Utiliser Chrome Headless avec Behat

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Il sera désormais possible à partir de la version 59 de Chrome (la version bêta au moment où j'écris ces lignes) en mode "headless", c'est-à-dire sans interface graphique. Ce mode de fonctionnement est intéressant pour les tests par exemple, car il ne sera plus obligatoire de "piloter" Chrome via son interface graphique.

Cette nouvelle fonctionnalité a provoqué un large engouement de la part de la communauté Web. A tel point que le mainteneur de PhantomJS, un navigateur headless, également basé sur Webkit a annoncé la fin du projet. Donc si comme moi, vous utilisiez ce dernier dans vos scénarios Behat, il va être nécessaire de changer de solution.

Pour cela, rien de plus simple. Voici par exemple la configuration Behat pour Selenium que j'utilisais avec PhantomJS.

# behat.yml
default:
    extensions:
        # ...
        Behat\MinkExtension:
            base_url: http://project.dev
            sessions:
                default:
                    selenium2:
                        wd_host: http://localhost:4444/wd/hub

Pour que Selenium puisse interagir avec Chrome, nous allons devoir utiliser un driver additionnel ChromeDriver. Une fois ce dernier installé, nous devrons ajouter quelques lignes de configuration supplémentaires.

# behat.yml
default:
    extensions:
        # ...
        Behat\MinkExtension:
            base_url: http://project.dev
            sessions:
                default:
                    selenium2:
                        browser: chrome
                        wd_host: http://localhost:4444/wd/hub
                        capabilities:
                            chrome:
                                switches:
                                    - "--headless"
                                    - "--disable-gpu"

Parmi les changements, nous spécifions à Selenium d'utiliser Chrome en tant que navigateur au travers de l'argument browser. Puis nous spécifions des capabilities, c'est-à-dire des options permettant de personnaliser et de configurer la session Chrome qui sera ouverte. Nous indiquons ainsi vouloir une navigateur headless. Le paramètre --disable-gpu est pour le moment obligatoire.

Et voilà, en ayant tout juste rajouté 5 lignes de configuration, vous avez remplacé l'utilisation de PhantomJS par Google Chrome en mode "headless".

Le fichier de configuration est disponible sur Gist