Suite de notre épopée sur Selenium, l’outil de test fonctionnel pour des applications web. Pour ceux qui auraient raté l’épisode 1 : Selenium, testez fonctionnellement vos applications web (partie 1/2).
Ce second volet suppose que vous avez lu l’épisode 1 et sera davantage axé sur l’implémentation de Selenium IDE et Selenium RC
Pour Selenium IDE :
Pour Selenium RC :
Il suffit de procéder de la façon suivante :
Si besoin, fignoler votre test :
Le besoin d’avoir des valeurs dynamiques se fait rapidement sentir dès lors que :
Selenium nous permet de définir des valeurs dynamiques, utilisables dans nos cas de test en créant des fonctions JavaScript.
Pour ce faire, il faut créer un fichier ’user-extensions.js’ qui contiendra par exemple pour la définition d’un jour et d’un mois compris entre aujourd’hui et la fin de l’année (les fonctions peuvent être améliorées, nous ne sommes pas à l’abri d’un 31 novembre par ex) :
function RandomNumber(value)
{
return Math.floor(Math.random()*value);
}
function RandomDay()
{
date = new Date();
day = date.getDate();
return RandomNumber(31-day)+day;
}
function RandomMonth()
{
date = new Date();
month = date.getMonth(); //janvier = 0 -> décembre = 11
return RandomNumber(11-month)+month;
}
Il faut ensuite déclarer ce fichier dans Selenium IDE : Menu Option > Options... > Extensions de Selenium Core (user-extensions.js). Une fois votre fichier sélectionné, il vous faudra relancer votre instance de Selenium IDE pour qu’il soit pris en compte. Si votre fichier contient une erreur de syntaxe, Selenium IDE vous le dira.
Dans votre test Selenium, remplacez alors la valeur fixe par l’appel à la fonction javascript :
Ce que vous aviez initialement :
| Commande | Cible | Valeur |
| type | Jour_arrivee | 22 |
| type | mois_arrivee | 12 |
Ce que vous obtenez au final :
| Commande | Cible | Valeur |
| type | Jour_arrivee | javascript{RandomDay()} |
| type | mois_arrivee | javascript{RandomMonth()} |
Dans le cas d’une liste déroulante, il faudra procéder en deux étapes :
| Commande | Cible | Valeur |
| store | mon_jour_arrivee | javascript{RandomDay()} |
| select | Jour_arrivee | label=${mon_jour_arrivee} |
Conseils :
Une Test Suite est un fichier HTML dans lequel chaque test est référencé dans une ligne du tableau, comme vous pouvez le constater dans l’exemple suivant :
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>Selenium : CA Technical Meeting</title>
<script language="JavaScript" type="text/javascript">
var DISABLED = true; // used to flag failing tests
function filterTestsForBrowser() {
var suiteTable = document.getElementById("suiteTable");
var skippedTests = document.getElementById("skippedTests");
for(rowNum = suiteTable.rows.length - 1; rowNum >= 0; rowNum--)
{
var row = suiteTable.rows[rowNum];
var filterString = row.getAttribute("unless");
if (filterString && eval(filterString))
{
var cellHTML = row.cells[0].innerHTML;
suiteTable.deleteRow(rowNum);
var newRow = skippedTests.insertRow(1);
var newCell = newRow.insertCell(0)
newCell.innerHTML = cellHTML;
}
}
}
function isFileURL() {
var p = window.location.protocol;
var result = ("file:" == p);
return result;
}
</script>
</head>
<body onload="filterTestsForBrowser()">
<table id="suiteTable" cellpadding="1" cellspacing="1" border="1" class="selenium">
<tbody>
<tr>
<td><b>Selenium : Test Suite</b></td>
</tr>
<tr>
<td><a target="testFrame" href="file:///chemin/des/tests/test1.html">Test 1</a></td>
</tr>
<tr>
<td><a target="testFrame" href="file:///chemin/des/tests/test2.html">Test 2</a></td>
</tr>
</tbody>
</table>
<br />
<em>Not supported in this suite</em>
<table id="skippedTests" cellpadding="1" cellspacing="1" border="1" class="selenium">
<tbody>
<tr>
<td><b>Skipped Tests</b></td>
</tr>
</tbody>
</table>
</body>
</html>
<code>
Le bloc qui nous intéresse particulièrement est :
<code class="html">
<tr>
<td><a target="testFrame" href="file:///chemin/des/tests/test1.html">Test 1</a></td>
</tr>
A noter :
Vous pouvez lancer une Test Suite depuis Selenium IDE en utilisant Test Runner. Pour cela il vous suffit de cliquer sur l’icône suivante :
Dans votre navigateur, une fenêtre s’est alors ouverte et elle est composée de 4 parties :
Pour que TestRunner prenne votre Test Suite en considération, il vous suffit de changer le contenu de la variable "test" dans l’url appelée. Une fois votre Test Suite chargée, il vous suffit de l’exécuter.
Comme dit dans le précédent billet, un des intérêts de Selenium RC est de pouvoir exécuter des tests dans un langage de script. Ce langage permettant de réaliser des actions supplémentaires, impossibles à réaliser depuis Selenium IDE.
L’export se fait très simplement :
Optionel : vous aurez peut être besoin de modifier la valeur de la "base url" dans votre test. Par défaut, Selenium IDE considère que cela est "localhost", ce qui peut ne pas correspondre à votre environnement.
Ex pour un test exporté en python :
Avant :
self.selenium = selenium("localhost", 4444, "*iexplore", "http://localhost:4444")
Après :
self.selenium = selenium("localhost", 4444, "*iexplore", "http://test.server.tld")
Il vous faut d’un côté lancer le serveur Selenium RC :
java –jar c:\path\to\selenium-rc\selenium-server.jar
et de l’autre lancer votre fichier de test dans votre langage de script (ou de double-cliquer sur le fichier si votre système d’exploitation vous le permet) :
C:\path\to\your\language\language.exe c:\path\to\test\test_case.ext
Note : si votre test utilise les fonctions javascript définies dans user-extensions.js, il vous suffit d’ajouter le paramètre "–userExtensions c :\path\to\user-extensions.js" lors du lancement du serveur :
java –jar c:\path\to\selenium-rc\selenium-server.jar -userExtensions c:\path\to\user-extensions.js
Pour se faire, il vous suffit le serveur en utilisant le paramètre htmlSuite et de préciser :
java –jar c:\path\to\selenium-rc\selenium-server.jar –htmlSuite *iehta http://your.server.tld c:\path\to\test\suite\YourTestSuite.html c:\path\to\results.html
De la même façon que précédemment, si vous devez utilser vos fonctions javascript, il faut ajouter le paramètre userExtensions :
java –jar c:\path\to\selenium-rc\selenium-server.jar –htmlSuite *iehta http://your.server.tld c:\path\to\test\suite\YourTestSuite.html c:\path\to\results.html -userExtensions c:\path\to\user-extensions.js
Il suffit de :
Dans le cas de formulaire avec des listes déroulantes conditionnelles, il se peut que votre test échoue si vous cherchez à selectionner la valeur par défaut d’une liste rafraichie par la liste précédente.
Cela s’explique par le fait que Selenium enregistre votre selection via la commande "SelectAndWait". Comme vous sélectionnez la valeur par défaut d’une liste, Selenium ne voit pas cet événement et attend en vain.
L’astuce consiste alors à remplacer "selectAndWait" par "select".
Selenium IDE
Selenium RC
Nous arrivons au terme de ce second épisode sur Selenium. Le but était d’illustrer son fonctionnement au travers de différents exemples. Toutes les fonctionnalités de l’outil n’ont pas été présentées ici (exécution d’un test pas à pas, définition de nouveaux point de démarrage d’un test, etc), l’idée étant de faire avant tout une présentation rapide de l’outil. Il ne vous reste plus qu’à jouer avec pour mieux l’appréhender.
Bonjour,
Aujourd’hui nous n’assurons pas compatibilité de nos applications sous Fire Fox mais sous IE. Avez-vous une solution similaire à Selenium IDE pour IE ?
En tout cas mes félicitations pour la qualité des ces deux articles.
Merci !
Pour des solutions similaires sous Internet Explorer mais que j’avais jugé moins riches que Selenium IDE lors de mes évaluations :
Pour le client chez qui j’ai fait cette étude, IE était le navigateur cible. L’idée était d’enregistrer les tests sous Firefox, puis de les faire exécuter sur IE via le Selenium RC. C’est sur que cela requiert que votre application soit a minima compatible avec Firefox.
Je fais du test de logiciel WEB avec Selenium IDE. Je suis en train de me constituer un ensemble de tests afin de valider l’application lors d’evolutions futures. J’utilise Selenium IDE pour enregistrer un test ; tout va bien. Quand je rejoue le test il s’arrete sur la ligne suivante :
clickAndWait link=Voir DIA notaire
et m’affiche le message d’erreur suivant
# [info] Executing : |clickAndWait | link=Voir DIA notaire | |
# [error] Element link=Voir DIA notaire not found
Quelqu’un a t il une idée ?
Merci d’avance
De mon expérience et sans connaître votre application, quelques pistes :
Nicolas