Présentation
Après avoir regardé CasperJS & CasperJS - Jour 2, j’ai échangé avec un collègue sur PhantomJS qui est utilisé par CasperJS. Quelques jours plus tard, celui-ci m’envoyait un mail au titre évocateur : “Phantom JS is Dead”. Le mail contenait un lien vers l’annonce de la sortie imminente du mode HeadLess sous Chrome.
Pour rappel, le pitch de PhantomJS est / était:
PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.
Avec le mode HeadLess, il était possible de faire le même chose mais avec le même moteur WebKit que celui-ci de Chrome donc pour tester … c’est pas mal :).
Quelques tests …
Alors j’ai pas cherché très loin : ici que j’ai gentiment suivi en adaptant légèrement …
Résultats
Require
Pour commencer quelques librairies à charger :
const fs = require('fs'); // Pour sauver le screenshot sur le file system
const webdriver = require('selenium-webdriver'); // selenium
const chromedriver = require('chromedriver'); 
const PATH = '/usr/bin/google-chrome';Lancement de Chrome
const chromeCapabilities = webdriver.Capabilities.chrome();
chromeCapabilities.set('chromeOptions', {
  binary: PATH
  , 'args': [
    '--headless'
    , '--disable-gpu'
  ], prefs: {
        download: {
            'prompt_for_download': false,
            'directory_upgrade': true,
            'default_directory': '/app/downloads'
        }
    }
});
const driver = new webdriver.Builder()
  .forBrowser('chrome')
  .withCapabilities(chromeCapabilities)
  .build();Actions
console.log('Connexion au site YouTube');
driver.get('https://www.youtube.com/');
console.log('Renseignement de la zone de recherche');
driver.executeScript("document.getElementById('masthead-search-term').value='clap your hands imany';");
driver.manage().timeouts().implicitlyWait(1);
console.log('Lancement de la recherche');
driver.findElement({id: 'search-btn'}).click();
console.log('Attente du chargement de la page');
driver.wait(webdriver.until.titleIs('clap your hands imany - YouTube'), 1000);
console.log('Recherche du premier lien')
driver.findElements(webdriver.By.css('a.yt-uix-tile-link'))
// [...]Astuce
J’ai perdu un peu de temps avec cette ligne driver.executeScript("document.getElementById('masthead-search-term').value='clap your hands imany';");. En effet, la méthode sendKeys ne fonctionne pas quand on utilise Xvfb ce qui est mon cas car je suis sous Docker.