Some time ago, a PHP wanabee (berk), Romain was looking to make a web page screenshot only with command line.
Many solutions have been proposed. But my prefered one is Selenium. So I’ve decided to look closer into that.

First you need to have Selenium RC installed and launched.
It’s pretty simple. Download it, go to the selenium-server-1.0 and enter in command line

java -jar selenium-server.jar

Your Selenium server is started on the 4444 port, ready to be used !
You also need the selenium-client installed.

sudo gem install selenium-client

Your hard drive is now a bit less empty. We can start having fun with code ! :)
I want to do a screenshot of my portfolio.

We start with the magic and explain after.

require 'rubygems'
require 'selenium'

# We load Selenium
@selenium = Selenium::SeleniumDriver.new("localhost", 4444, "*firefox", "http://42.dmathieu.com/", 10000);
@selenium.start

# We go to the main page and take the screenshot
@selenium.open "/"
@selenium.capture_entire_page_screenshot(File.expand_path(File.dirname(__FILE__)) + 'screenshot.png', '');

# We unload Selenium
@selenium.stop

We load the required libraries. Not complicated. We only need Selenium.

require 'rubygems'
require 'selenium'

Then we load Selenium, indicating the URL we wish to visit and the browser with which we want to visit it.

@selenium = Selenium::SeleniumDriver.new("localhost", 4444, "*firefox", "http://42.dmathieu.com/", 10000);
@selenium.start

We load the page, take the screenshot and save the created image.

@selenium.open "/"
@selenium.capture_entire_page_screenshot(File.expand_path(File.dirname(__FILE__)) + 'screenshot.png', '');

And we don’t forget to free the memory.

@selenium.stop

And then the magic happens. Our beautiful screenshot (of the entire page, not only the screen) is then generated.

You’ll notice that javascript is executed (try to deactivate it on your browser, you won’t see my email on the page anymore).
And the render is what we have in the browser.

So who’s ready to start an open source project to generate websites thumbnails using Selenium ? :p

Hier, un PHP wannabee (berk), Romain cherchait à faire un screenshot d’une page web en « ligne de commande ».
Plusieurs solutions lui ont été proposées. Pour ma part, ma préférée est Selenium ! Sachant bien qu’il ne ferait jamais la chose en Ruby, j’ai donc décidé de regarder cela d’un peu plus près.

Tout d’abord, vous devez avoir Selenium RC installé et lancé.
C’est simple. Téléchargez le, rendez-vous dans le dossier selenium-server-1.0 et entrez

java -jar selenium-server.jar

Votre serveur Selenium est lancé sur le port 4444. Y’a plus qu’à l’utiliser !
Vous devez également avoir la librairie selenium-client installée.

sudo gem install selenium-client

Votre disque dur étant maintenant un peu moins vide, on peut s’attaquer au code en lui même ! :)
Je vais faire un screenshot de mon tout nouveau portfolio (encore en chantier).

On commence par la magie et on explique après.

require 'rubygems'
require 'selenium'

# We load Selenium
@selenium = Selenium::SeleniumDriver.new("localhost", 4444, "*firefox", "http://42.dmathieu.com/", 10000);
@selenium.start
@selenium.set_context("test_new")

# We go to the main page and take the screenshot
@selenium.open "/"
@selenium.capture_entire_page_screenshot(File.expand_path(File.dirname(__FILE__)) + 'screenshot.png', '');

# We unload Selenium
@selenium.stop

On commence par charger les librairies requises. Pas compliqué, on a besoin que de Selenium.

require 'rubygems'
require 'selenium'

Puis on charge Selenium en lui renseignant l’URL que l’on désire visiter et le navigateur avec lequel on désire visiter celle-ci.
Et en définissant le contexte (ici, un firefox vierge).

@selenium = Selenium::SeleniumDriver.new("localhost", 4444, "*firefox", "http://42.dmathieu.com/", 10000);
@selenium.start
@selenium.set_context("test_new")

On charge la page, on prends le screenshot et on sauvegarde l’image créée :)

@selenium.open "/"
@selenium.capture_entire_page_screenshot(File.expand_path(File.dirname(__FILE__)) + 'screenshot.png', '');

Et on oublie pas de libérer la mémoire.

@selenium.stop

Et zou, c’est super magique ! Notre beau screenshot (de la page entière, pas seulement de l’écran) est alors généré.

Vous noterez que le javascript est exécuté (tentez de désactiver le javascript de votre navigateur et regarder ce qu’il advient de mon email affiché sur la page).
Et que le rendu est effectivement le même que ce que l’on a dans le navigateur.

A quand un outil open source utilisant Selenium et générant des thumbnails ? :p

J’ai déjà mentionné Selenium dans mon article de test de code avec JQuery.

Nous allons voir aujourd’hui, en introduction à celui-ci, comment tester votre présence sur Google pour les mots clés de votre choix.
Ceci est cependant un cas d’école. Vous ne pouvez tester (simplement) votre positione exacte. Nous vérifions ici uniquement que vous êtes dans les 10 premiers. Mais il faut bien un exemple pour débuter et vous permettre ensuite de tester vous-même votre site.

Commencez par télécharger et installer Selenium IDE, qui est une extension firefox permettant de générer des tests Selenium.
Une fois celui-ci installé, rendez-vous dans le menu « Outils » du navigateur puis cliquez sur « Selenium IDE ». Une fenêtre s’ouvrira alors, vous permettant de créer votre nouveau test.

De multiples commandes sont disponibles. Ici cependant, nous désirons ouvrir google.com, puis entrer une recherche, cliquez sur le bouton et analyser le résultat.

Notre set de commandes sera donc :

Test google.com Selenium

open /
type q dmathieu
clickAndWait btnG
assertTextPresent dmathieu.com

Exécutez votre test et c’est magique. Vous voyez même le test s’exécuter en direct dans votre fenêtre active :)
Maintenant, c’est bien gentil, vous avez votre test. Mais comment l’automatiser ?

Eh bien vous avez le choix. Java, C#, Perl, PHP, Python, Ruby ?
Il n’y a qu’à choisir, installer la librairie du langage.
Puis faites Fichier > Export Test Case as … Et choisissez le langage de votre choix.

Exécutez le script généré. Et si vous avez correctement installé les librairies, votre test devrait s’exécuter.
Vous avez réalisé votre premier test frontend automatique. Vous n’avez maintenant plus qu’à adapter cela à vos tests QUnit (ou tout autre framework) pour automatiser ceux-ci.

Note : Tester votre présence sur Google de cette manière est assez peu productive.
Pour cela, je vous conseille plutôt RefStats.

J’ai déjà parlé plusieurs fois ici de tests unitaires. En Ruby ou en PHP.
Cependant toute application qui se respecte aura également une couche navigateur, permettant d’ajouter de l’ajax par exemple.
Ces fonctionnalités, tout comme le code serveur, sont testables.

Voyons un petit peu comment cela fonctionne avec QUnit, le framework de tests unitaires intégré avec JQuery.

Pour cela, je vais reprendre mon exemple d’il y a quelques mois ou je proposais de signaler si un pseudonyme est déjà utilisé lors d’une inscription, et de tester cela.
Cependant aujourd’hui, j’ai fait la chose en PHP, afin d’épargner la création d’un projet RoR. On a au final, dans cet exemple, besoin que de deux fichiers :

check_user.php, qui vérifie si notre pseudonyme est disponible ou non. Et retourne ‘OK’ si il l’est et ‘NOT’ sinon.
On ne s’embête pas ici. Voici ce que j’ai dans mon document :

<?php if ($_GET['u'] == 'oh') echo 'OK';
else echo 'NOT'; ?>

Puis dans notre index.php, nous allons placer le champ de texte du nom d’utilisateur.

<html>
    <head>
        <title></title>
        <script src="http://www.google.com/jsapi"></script>
        <script type="text/javascript>
            google.load("jquery", "1.3.2");
        </script>
        <script type="text/javascript" src="code.js"></script>
    </head>
    <body>
        <input type="text" id="username" name="username" />
        <div id="availability"></div>
    </body>
</html>

Et nous appellons notre document javascript qui fera un appel ajax à check_user.php.

$(document).ready(function() {
    $('#username').blur(function () {
        username = $('#username').val();
        if (username == '') {
            $('#availability').html('');
            return false;
        }

        $.ajax({
            url: 'check_user.php?u='+username,
            success: function(data) {
                    if (data == 'OK') {
                        $('#availability').html('Disponible');
                        $('#availability').css('color', 'green');
                    } else {
                        $('#availability').html('Non disponible');
                        $('#availability').css('color', 'red');
                    }
            },
            error: function(data) {
                $('#availability').html('');
            }
        });
    })
});

Voila ! Maintenant, nous avons notre test de validité de l’utilisateur de fonctionnel. Pour l’instant du moins car pour être sur qu’il le reste, nous allons ajouter des tests.
Commençons par implémenter QUnit dans notre index.php.

<html>
    <head>
        <title></title>

        <script src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
            google.load("jquery", "1.3.2");
        </script>
        <script type="text/javascript" src="code.js"></script>
    </head>
    <body>

        <input type="text" id="username" name="username" />
        <div id="availability"></div>

        <link rel="stylesheet" href="http://github.com/jquery/qunit/raw/master/qunit/qunit.css" type="text/css" media="screen" /
	<script type="text/javascript" src="http://github.com/jquery/qunit/raw/master/qunit/qunit.js"></script>
        <script type="text/javascript" src="tests.js"></script>
        <h2 id="qunit-banner">Qunit Testing</h2>
	<h2 id="qunit-userAgent"></h2>
	<ol id="qunit-tests"></ol>
    </body>
</html>

Vous pouvez constater que nous ajoutons divers tags html en fin de page. Ceux-ci seront automatiquement remplacés par l’interface de visualisation des tests.

Et enfin dans le fichier tests.js inclus précédemment, nous plaçons tous nos tests.

$.ajaxSetup({
  async: false
});

module("username")

test("availability div shouldn't have any value by default", function() {
    equals($('#availability').html(), '', "availability div doesn't have any value by default");
});

test("should allow inexistant username", function() {
    $('#username').val('oh');
    $('#username').blur();

    equals($('#availability').html(), 'Disponible', "the username is available");
    equals($('#availability').css('color'), 'green', "the username is available");
});

test("should not allow existant username", function() {
    $('#username').val('doh');
    $('#username').blur();

    equals($('#availability').html(), 'Non disponible', "the username is not available");
    equals($('#availability').css('color'), 'red', "the username is not available");
});

test("should hide the message if username is empty", function() {
    $('#username').val('');
    $('#username').blur();

    equals($('#availability').html(), '', "the username is empty");
})

La méthode « module » permet de signaler que nous sommes dans la partie de vérification du pseudonyme de la page.
Chaque méthode test définit un test.

Quant au ajaxSetup, il nous permet de forcer les requêtes ajax à ne pas être asynchrone. Si elles l’étaient, nos tests seraient exécutés avant le retour de la requête ajax et échoueraient donc.

Si vous rechargez votre page, vous pouvez maintenant voir que nous testons convenablement (et avec succès) la vérification de la disponibilité de notre pseudonyme.

Pour finir, vous me direz rapidement que c’est bien gentil de tester ça. Mais que vous n’allez pas charger chacune des pages de votre site à chaque fois que vous changez une ligne de code.
La solution à cela, qui est cependant trop complexe pour tenir dans cet article, est d’utiliser Selenium, un outil permettant de tester le frontend d’une application web sur de multiples navigateurs.

Pour finir, vous pouvez voir toutes les portions de code données dans cet article avec mise en couleur du code.

 
Fork me on GitHub