SeleniumHQ
est un outil de test pour les applications Web. Il permet de vérifier qu'une
application se comportera de la même façon quel que soit le navigateur utilisé.
Selenium s'utilise ainsi :
- Enregistrement d'une séquence : A l'aide d'un plugin
Firefox, on enregistre une séquence. Clic sur un lien, saisi d'un formulaire,
vérification d'une réponse...
- Intégration du test : On intègre le test au sein
d'une suite de test, dans le langage et le framework de son choix.
- Exécution du test : Le test est joué sur plusieurs
navigateurs et plusieurs plateformes afin de valider l'interopérabilité de
l'application.
Selenium est indépendant du langage utilisé. On peut tester une application
PHP, Java, Ruby on Rails... De plus, Selenium supporte les langages les plus
communs pour la programmation Web :
- C#
- Java
- Perl
- PHP
- Python
- Ruby
En plus des langages, Selenium connait les frameworks les plus utilisés. Par
exemple, en Ruby on Rails, on pourra générer des tests Test::Unit ou RSpec, au
choix. De cette façon, on obtient des tests consistants avec le reste des tests
écrits pour l'application.
Dans ce tutoriel, plutôt que de développer une application pour l'occasion,
nous allons tester une application existante : le moteur de recherche de
Google (un exemple très inspiré, d'autant que c'est aussi l'exemple choisi par
les développeurs de Selenium). Nous allons générer un test JUnit que nous
allons intégrer au sein d'une suite de test, puis nous exécuterons ce test.
Installation
Nous allons avoir besoin de Selenium IDE :
- Lancez Firefox
- Allez sur la page de
téléchargement de Selenium
- Sélectionnez le téléchargement de Selenium IDE

- Le téléchargement fait apparaitre un bandeau Firefox a empêché ce site
(seleniumhq.org) d'installer un logiciel sur votre ordinateur en haut de
la page. Cliquez sur Autoriser pour permettre l'installation.

- Dans le popup Installation d'un logiciel, cliquez sur
Installer maintenant.

- Dans le popup Modules complémentaires, cliquez sur Redémarrer
Firefox pour terminer l'installation.

Nous allons aussi utiliser Selenium RC pour exécuter le test :
- Allez sur la page de
téléchargement de Selenium
- Téléchargez Selenium RC

- Décompressez l'archive téléchargée dans le répertoire de votre choix. Par
exemple, dans
C:\Program Files (x86) (auquel cas Selenium RC est
installé dans C:\Program Files
(x86)\selenium-remote-control-1.0.1)
Puisque nous allons utiliser JUnit, nous l'installons également :
- Allez sur la page de téléchargement de
JUnit
- Téléchargez le JAR de JUnit

- Copiez le JAR de JUnit tel quel dans le répertoire de votre choix (il ne
faut pas le décompresser). Par exemple, dans
C:\Program Files
(x86)\junit-4-8-1
Enregistrement
L'installation terminée, nous pouvons créer notre premier test. La première
étape consiste à enregistrer la séquence que nous voulons automatiser.
Dans cet exemple, nous testons le moteur de recherche de Google et écrivons
un test qui s'assure que le site de Selenium (seleniumhq.org) fait partie des résultats de la
première page lorsqu'on lance une recherche Google sur "selenium". L'objet de
ce test est évidemment discutable : si le site de Selenium n'apparait pas
sur la première page, cela peut être dû à un mauvais référencement de ce
dernier, plutôt qu'à un authentique bug de Google. Dans le cadre de ce
tutoriel, c'est bien suffisant.
Pour enregistrer la séquence :
- Lancez Firefox
- Allez sur la page d'accueil de
Google
- Lancez Selenium IDE à partir de Firefox, dans le menu Outils

- Disposez Firefox et Selenium IDE de sorte à voir les deux fenêtres
simultanément. Cela n'a rien d'obligatoire, mais il est pratique de voir la
fenêtre de Selenium mise à jour au fur et à mesure de l'enregistrement du
test.
- Saisissez l'URL de la page d'accueil de Google dans le champ Base
URL de Selenium IDE. En effet, cette page sera le point de départ de notre
test.

- Lancez l'enregistrement en cliquant sur le bouton Record de
Selenium IDE. Selenium est maintenant en train d'enregistrer les actions de
l'utilisateur dans Firefox : click, saisie...

- Jouez la séquence à enregistrer. Saisissez "selenium" dans la page de
Google et cliquez sur Recherche Google. On constate que Selenium IDE
liste les actions au fur et à mesure.

- Ajoutez une assertion. Dans la page de résultat de Google, nous voulons
nous assurer qu'un lien vers le site de Selenium est présent. Il apparait
effectivement, on peut voir le texte "seleniumhq.org" qui apparait au bas du
premier résultat. Sélectionnez ce texte dans Firefox, faites un clic droit et
sélectionnez verifyTextPresent seleniumhq.org

- Stoppez l'enregistrement. Dans la fenêtre de Selenium IDE, cliquez de
nouveau sur le bouton Record pour arrêter l'enregistrement. On
constate que Selenium a enregistré la séquence que nous venons de jouer :
open / ouvre la page de Google, type q selenium
saisit "selenium" dans le champ texte de la page d'accueil de Google,
clickAndWait btnG clique sur le bouton Recherche Google
et attend la page de résultat et verifyTextPresent seleniumhq.org
s'assure que le texte "seleniumhq.org" est bien présent dans la page de
résultat. 
- Rejouez le test. Maintenant que Selenium a enregistré la séquence, nous
pouvons la rejouer à loisir. Cliquez sur le bouton Play entire test
suite. Selenium IDE joue le test "pour de vrai" en pilotant Firefox. On
voit ce dernier aller sur la page d'accueil de Google, saisir "selenium" et
charger la page de résultat. Selenium IDE liste ce qu'il a exécuté dans
l'onglet Log. On constate que l'assertion finale est également
évaluée : si "seleniumhq.org" n'apparaissait pas dans la page de
recherche, Selenium le signalerait et le test échouerait.

Intégration
Pour le moment, nous avons un test que nous pouvons jouer à partir d'une
interface graphique. C'est un début, mais il faut aller plus loin :
- Exécution dans d'autres navigateurs : Développer avec
Firefox pourquoi pas, mais il faut s'assurer que l'application fonctionne aussi
avec Internet Explorer, Safari et les autres.
- Gérer de nombreux tests : Dans ce tutoriel, on se
contente d'un test. Dans un cas réel, on a plusieurs dizaines, centaines voir
milliers de tests. Cette interface graphique n'est pas viable pour un tel
usage.
- Tests intégrés : Jouer le test à partir de
l'interface graphique est pratique lorsqu'on le met au point. En revanche, cela
n'est plus praticable lorsqu'on veut jouer le test au même titre que les autres
tests de l'application (tests unitaires, etc.). Les tests générés avec Selenium
doivent pouvoir être lancés dans le cadre d'une intégration continue, etc.
- Modification et déclinaison du test : Nous pourrions
souhaiter décliner notre test de plusieurs façons. Par exemple, en recherchant
différents termes. Avec Selenium IDE, notre seule option est de jouer le
scénario encore et encore pour créer nos tests. Cela va vite devenir
ennuyeux.
L'étape d'intégration est très rapide car Selenium génère directement un
test JUnit pour nous :
- Dans Selenium IDE, sélectionnez Options > Format > Java
(JUnit). Selenium affiche alors notre test au format JUnit. On reconnait
les dfférentes étapes, mais "à la Java" :
selenium.open("/")
pour ouvrir la page d'acueil de Google, etc. 
- Copiez le contenu du test, collez-le dans un fichier
SearchTest.java que vous créez n'importe où.
- Supprimez la mention du package. Dans
Search.java, supprimez
la ligne de déclaration du package (package com.example.tests;).
Dans un cas réel, nous devrions spécifier un package relatif à l'entité pour
laquelle nous développons. Dans le cadre de cet exemple, nous allons au plus
simple.
- Changer le nom de la classe pour
SearchTest. Autrement dit,
public class Untitled devient public class
SearchTest.
- Changer le nom de la méthode de test pour
testSearch.
Le test définitif :
import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;
public class SearchTest extends SeleneseTestCase {
public void setUp() throws Exception {
setUp("http://www.google.fr/", "*chrome");
}
public void testSearch () throws Exception {
selenium.open("/");
selenium.type("q", "selenium");
selenium.click("btnG");
selenium.waitForPageToLoad("30000");
verifyTrue(selenium.isTextPresent("seleniumhq.org"));
}
}
A présent nous compilons ce test. La séquence qui suit est pour Windows. Si
vous utilisez un autre environnement, vous devrez adapter certaines
commandes :
- Ouvrez une console. Faites Touche Windows + R, puis demandez à
lancer le programme
cmd.
- Définissez l'emplacement de Selenium RC en définissant la variable
SELENIUM_RC_HOME. Par exemple, set
SELENIUM_RC_HOME=C:\Program Files
(x86)\selenium-remote-control-1.0.1
- Définissez l'emplacement de JUnit en définissant la variable
JUNIT_HOME. Par exemple, set JUNIT_HOME=C:\Program Files
(x86)\JUnit-4-8-1
- Placez-vous dans le répertoire où vous avez créé
SearchTest.java
- Compilez le test avec la commande
javac -cp
"%JUNIT_HOME%\junit-4.8.1.jar;%SELENIUM_RC_HOME%\selenium-java-client-driver-1.0.1\selenium-java-client-driver.jar"
SearchTest.java. Vous devrez peut-être adapter cette commande si vous
avez téléchargé une version plus récente de JUnit ou Selenium RC.
Le test est désormais intégré aux autres tests unitaires de l'application.
De plus, comme il s'agit de véritable code et non d'une séquence figée, nous
pouvons modifier le test pour jouer la séquence plusieurs fois, par exemple
avec différents termes de recherche.
Exécution
Maintenant que nous avons un test compilé, nous pouvons l'excuter. Dans ce
post, nous ne verrons qu'une façon de le lancer. Cependant, il existe plusieurs
options, selon ce que nous attendons de nos tests.
Exécution simple
C'est le mode par défaut, celui qu'utilisent les développeurs pour vérifier
leurs réalisations. Le test est lancé depuis la ligne de commande ou depuis un
IDE et le résultat est utilisé sur le champ : si bug il y a, il est
fixé !
Lorqu'on exécute un test avec Selenium, celui-ci est joué dans un véritable
navigateur Web, et non par envoi direct de requêtes HTTP, par exemple. Pour
réaliser cela, Selenium utilise un serveur. Ce serveur reçoit les requêtes du
test ("ouvrir une page", "cliquer", etc.) et ouvre un navigateur qu'il pilote
pour exécuter les commandes du test. Par conséquent, pour lancer
SearchTest, nous devons d'abord lancer le serveur
Selenium :
- Ouvrez une nouvelle console.
- Définissez l'emplacement de Selenium RC en définissant la variable
SELENIUM_RC_HOME. Par exemple, set
SELENIUM_RC_HOME=C:\Program Files
(x86)\selenium-remote-control-1.0.1
- Ajouter Firefox dans votre
PATH. Par exemple, si Firefox est
installé dans C:\Program Files (x86)\Mozilla Firefox, utilisez
set PATH=%PATH%;C:\Program Files (x86)\Mozilla Firefox
- Lancez le server Selnium avec la commande
java -jar
"%SELENIUM_RC_HOME%\selenium-server-1.0.1\selenium-server.jar"
Nous sommes maintenant prêts à lancer le test :
- Reprenez la console que vous avez utilisée pour compiler le test, celle où
JUNIT_HOME et SELENIUM_RC_HOME sont définies et pour
laquelle le répertoire courant contient le test compilé.
- Lancez le test avec la commande
java -classpath
"%JUNIT_HOME%\junit-4.8.1.jar;%SELENIUM_RC_HOME%\selenium-java-client-driver-1.0.1\selenium-java-client-driver.jar;."
junit.textui.TestRunner SearchTest
A l'exécution de cette dernière commande, Selenium RC lance une instance de
Firefox et on peut voir le test se dérouler. Cela étant dit, ce n'est pas de
voir le navigateur qui nous importe, mais le résultat : à la fin de
l'exécution, SearchTest est passed, comme tout test JUnit exécuté
avec succès. Il n'y a pas d'intervention manuelle.
Validation, Régression, Intégration continue...
Au delà de l'exécution simple, Selenium permet d'exécuter des tests
automatisés à toutes les étapes de la vie du projet :
- Intégration Continue. Ces tests sont de parfaits condidats
pour une exécution fréquente et programmée : toutes les nuits, toutes les
semaines...
- Test de Régression. Comme ils sont automatisés, ces tests
peuvent être utilisés par les développeurs comme tests de régression, jouables
facilement et rapidement.
- Test de validation. Naturellement, on peut se servir de
ces tests pour valider l'application avant livraison. Une fois encore,
l'automatisation fait qu'on ne devrait pas se priver de les jouer.
- ...
Test d'interopérabilité
Une particularité de Selenium est de lancer les tests sur un véritable
navigateur. Comme celui-ci est capable de gérer les principaux navigateurs et
qu'il peut s'exécuter sur les principales plateformes, il est l'outil idéal
pour vérifier l'interopérabilité de l'application : "Si mon test passe
avec succès à partir de Firefox exécuté sous Windows, le fera-t-il avec Safari
exécuté sous Mac ?" Selenium permet de répondre à cette question, une fois de
plus de façon automatisée.
Le test d'interopérabilité peut être "fait maison" : on se procure
machines et navigateurs, on lance différents serveurs Selenium et le tour est
joué. Cela demande toutefois pas mal d'efforts : gestion de plateformes
différentes, gestion des ressources (deux testeurs ne doivent pas utiliser le
même serveur en même temps)... Des entreprises fournissent des
solutions de test à la demande pour éviter ces problèmes.
Test de charge
Les tests Selenium peuvent servir de base au test de charge. Au lieu de
jouer un test à la fois, on en exécute... un grand nombre ! Comme pour le
test d'interopérabilité, ce principe nécessite une certaine organisation pour
être mis en œuvre.
Selenium est un outil puissant, élégant et facile à prendre en main.
L'essayer c'est l'adopter ! Faites l'essai !