Tutoriel Selenium : comment utiliser le framework de test du fonctionnement inter-navigateurs
Dans le développement Web moderne, il est essentiel de disposer d’une application adaptée aux différentes résolutions d’écran des visiteurs ou des utilisateurs. L’approche responsive, dans laquelle le projet Web publié s’adapte automatiquement aux capacités techniques de l’appareil utilisé, s’est imposée comme la solution standard, aujourd’hui incontestée. En dehors d’une grande flexibilité en matière de résolution d’écran, pour disposer d’un site internet moderne, il convient également de veiller à la meilleure compatibilité possible avec les navigateurs : le fait qu’un utilisateur consulte le site internet avec Firefox, Chrome, Safari ou un autre client Web ne devrait en effet rien changer à l’utilisation.
C’est la raison pour laquelle les tests inter-navigateurs jouent un rôle important depuis des années dans la programmation de projets Web. L’un des outils les plus appréciés pour réaliser ces tests est le framework Selenium publié par ThoughtWorks que nous vous présentons en détail dans ce tutoriel.
Qu’est-ce que Selenium ou Selenium WebDriver ?
Afin d’optimiser le processus de développement d’une application sur le temps et les coûts dans Python, Jason Huggins a créé en 2004 l’essentiel de ce qui constitue aujourd’hui le framework de testing Web Selenium à l’aide de JavaScriptTestRunner. À l’origine, cet outil était uniquement destiné à une utilisation interne dans l’entreprise informatique ThoughtWorks, dans laquelle J. Huggins travaillait à l’époque. Après avoir intégré Google en 2007, il a progressé dans le développement et la correction des erreurs du logiciel, qui fut dès lors publié en open source (licence Apache 2.0) afin de le mettre à la disposition du grand public. Suite à la fusion avec l’API WebDriver, le framework a adopté son nom actuel : Selenium ou Selenium WebDriver.
La version actuelle de Selenium est exclusivement basée sur le HTML et le JavaScript et permet aux développeurs de tester et enregistrer les interactions avec une application Web afin de les répéter ensuite aussi souvent que souhaité, de façon entièrement automatisée. Les principales composantes de ce processus de test sont les suivantes :
- Selenium Core : ce module de base contient la fonctionnalité de base du framework, notamment JavaScriptTestRunner et l’API de commande de test sous-jacente.
- Selenium IDE : Selenium IDE est l’environnement de développement du framework de test qui sert notamment de base à l’extension IDE pour Chrome et Firefox. Cet environnement est nécessaire pour l’enregistrement et la lecture des tests.
- Selenium WebDriver : WebDriver est l’interface essentielle permettant la simulation d’interactions avec les utilisateurs dans n’importe quel navigateur (Firefox, Chrome, Edge, Safari ou Internet Explorer). Depuis 2018, l’API est un standard W3C officiel.
- Selenium Grid : Selenium Grid est une extension de WebDriver ou plutôt de son prédécesseur, Selenium Remote Control (RC), qui permet de réaliser des tests sur plusieurs serveurs en parallèle. Cette extension permet de réduire considérablement la durée des tests.
Dans quels cas Selenium WebDriver est-il utilisé ?
Dans le domaine du testing, Selenium fait figure de référence et intervient en particulier en tant que structure de base pour différents programmes de ce domaine. Parmi les exemples les plus connus, on peut notamment citer le framework Protractor qui a été conçu spécialement pour tester les applications Angular et AngularJS et pour simuler des interactions avec les utilisateurs sur l’API WebDriver. Prévu pour les applications mobiles natives et hybrides, le logiciel d’automatisation de tests Appium utilise également cette interface standardisée pour réaliser des tests en toute simplicité dans les langages de programmation les plus courants.
Même BrowserStack, le service Web basé sur le cloud très connu, repose sur Selenium : développé en Inde et pouvant être utilisé gratuitement pendant une phase de test puis dans le cadre de différents abonnements payants, ce service utilise le framework de test comme base pour ses tests automatisés sur des ordinateurs fixes ou des périphériques portables.
Disponible en open source, Selenium ou Selenium WebDrive peut naturellement être utilisé en dehors de programmes existants comme les solutions mentionnées précédemment. Grâce aux différents composants qui ont été ajoutés dans le framework au fil du temps, une telle utilisation est tout à a fait possible si l’on dispose des compétences correspondantes.
Tutoriel Selenium WebDriver : utilisation du framework pour vos tests Web
Si vous souhaitez utiliser Selenium pour créer vos propres scénarios de test sans avoir à dépendre d’un service externe ou du fabricant du logiciel, vous n’aurez pas besoin de connaissances spécifiques en programmation. En effet, ce framework vous permet de réaliser les tests sur les navigateurs en toute simplicité car vous avez la possibilité d’écrire les scripts de test dans différents langages, notamment en JavaScript, Java, C#, Ruby et Python. Le tutoriel Selenium suivant a pour but de vous expliquer l’installation et l’utilisation du framework à travers l’exemple de Python.
Les étapes suivantes de ce tutoriel Selenium WebDriver nécessitent une version récente de Python.
Étape 1 : installer Selenium
Des clients ainsi qu’une série de bibliothèques sont disponibles pour l’utilisation de Selenium WebDriver. Ils sont appelés « Language Bindings » (ou « bindings de langage ») et constituent la base du framework ou du processus de test. Cependant, vous devez uniquement installer les pilotes du client et les bibliothèques pour le langage dans lequel vous souhaitez écrire vos scripts.
Dans le cadre de notre tutoriel Selenium WebDriver, nous avons besoin des bindings de langage pour Python que vous pouvez installer par défaut avec le gestionnaire de paquets de Python pip et la commande suivante :
pip install selenium
Une autre solution consiste à télécharger le paquet source en cliquant sur le lien indiqué précédemment, à décompresser l’archive tar.gz et à utiliser le fichier setup.py pour procéder à l’installation. Dans ce cas, la commande nécessaire est la suivante :
python setup.py install
La deuxième étape consiste à télécharger et installer le pilote du navigateur permettant de rattacher Selenium. Dans Firefox, le pilote nécessaire sera par exemple geckodriver, dont on trouve la version officielle dans le répertoire GitHub suivant. Une liste exhaustive des pilotes pour les principaux navigateurs (Chrome, Edge, Internet Explorer, Safari, etc.) est disponible dans les documentations en ligne officielle de Selenium.
Si vous souhaitez utiliser Selenium avec une connexion à distance, vous devez également installer les composantes du serveur de Selenium. Vous trouverez les paquets d’installation correspondants sur la page de téléchargement officielle du framework (dans la colonne « Selenium Server (Grid) »). Veuillez toutefois noter que l’exécution de l’application du serveur requiert une version récente de l’environnement d’exécution Java (JRE).
Étape 2 : choisir un environnement de développement adapté (IDE)
Une fois ces conditions pour l’utilisation de Selenium WebDriver remplies, vous pouvez vous lancer dans l’écriture des scripts de test de votre projet Web. Pour ce faire, vous aurez simplement besoin de l’éditeur de code privilégié. Dans ce cas, il est toutefois recommandé d’utiliser un IDE Python (ou un environnement de développement pour le langage avec lequel vous souhaitez travailler) afin d’optimiser votre productivité. Par exemples, les environnements suivants sont des solutions connues et appréciées :
- PyCharm : l’IDE Python PyCharm est disponible dans une édition gratuite avec une communauté open source ou dans une édition professionnelle payante. Dans tous les cas, vous aurez toutefois la possibilité d’écrire les scripts pour les tests Selenium avec chacune de ces éditions. Les systèmes d’exploitation supportés sont Windows, Linux et macOS.
- PyDev : PyDev est un plugin Python pour l’environnement de développement Eclipse qui a été conçu à l’origine pour développer des applications Java. Cette extension peut être téléchargée et installée via la page de projet ou directement via le gestionnaire de mises à jour. PyDev et Eclipse sont compatibles avec tous les systèmes d’exploitation Windows, macOS et Linux courants.
Étape 3 : générer le script Python pour le test du navigateur (Firefox) avec Selenium
Une fois la solution souhaitée installée, vous pouvez commencer à écrire des scripts individuels pour automatiser les interactions avec les navigateurs à l’aide des classes et des fonctionnalités Selenium. Dans ce tutoriel Selenium, nous avons par exemple créé un script Python pour Firefox qui consulte automatiquement le moteur de recherche Google dans le navigateur Mozilla, saisit un mot-clé puis analyse et enregistre les résultats. Transposées sous la forme de code, ces étapes automatisées ressemblent à ceci :
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# Créer une session Firefox
driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.maximize_window()
# Appeler l’application web
driver.get("http://www.google.fr")
# Localiser la zone de texte
search_field = driver.find_element_by_id("lst-ib")
search_field.clear()
# Saisir et confirmer le mot-clé
search_field.send_keys("Mot-clé")
search_field.submit()
# Consulter la liste des résultats affichés à la suite de la recherche
# à l’aide de la méthode find_elements_by_class_name
lists= driver.find_elements_by_class_name("_Rm")
# Passer en revue tous les éléments et restituer le texte individuel
i=0
for listitem in lists:
print (listitem.get_attribute("innerHTML"))
i=i+1
if(i>10):
break
# Fermer la fenêtre du navigateur
driver.quit()
Le tableau suivant indique de façon claire le sens des différentes composantes du script :
Ligne(s) de code | Sens |
---|---|
from selenium import webdriverfrom selenium.webdriver.common.keys import Keys | Le module WebDriver est d’abord chargé afin d’implémenter les classes et les méthodes pour le support des différents navigateurs. Ensuite, le script charge la configuration du clavier virtuel afin de pouvoir simuler les saisies au clavier à une étape ultérieure. |
driver = webdriver.Firefox()driver.implicitly_wait(30)driver.maximize_window() | La seconde étape consiste à créer une instance Firefox, qui pourra être commandée plus tard à l’aide des commandes Selenium. Un dépassement de délai d’activité de 30 secondes est prévu pour le démarrage du navigateur. La fenêtre du navigateur doit par ailleurs être agrandie. |
driver.get("http://www.google.fr") | Le script consulte à présent la page Google française qui sert ici de base pour les interactions automatisées avec l’utilisateur. |
search_field = driver.find_element_by_id("lst-ib")search_field.clear() | Lors de la consultation du moteur de recherche, le script recherche la zone de texte de la recherche Google qui est signalée par l’attribut ID « lst-ib ». Une fois localisé, le champ de recherche est tout d’abord vidé à l’aide de la méthode clear(). |
search_field.send_keys("Mot-clé")search_field.submit() | Le « mot-clé » est ensuite saisi et confirmé avec la méthode submit(). |
lists= driver.find_elements_by_class_name("_Rm") | Les différents résultats de recherche sont alors listés comme éléments <a>. Afin de pouvoir les commander avec la méthode find_elements_by_class_name, ces résultats sont insérés à cet endroit du script. |
i=0for listitem in lists: print (listitem.get_attribute("innerHTML")) i=i+1 if(i>10): break | Lors de la dernière étape active, le script fournit la liste des résultats obtenus. Cette liste est limitée aux dix premiers résultats avec une balise <a>. |
driver.quit() | La ligne de code finale procède à la fermeture de l’instance du navigateur. |
L’exemple utilisé dans ce tutoriel Selenium montre de façon impressionnante à quel point ce framework est idéal pour tester les navigateurs. Il met également en évidence l’intérêt de Selenium WebDrive dans le cadre d’un Web scraping avec Python qui fait également partie des nombreuses possibilités d’utilisation de cette suite de test. Vous trouverez des informations détaillées sur ce que recouvre ce type de collecte de données depuis le Web dans notre article « Qu’est-ce que le Web scraping ? ».
Selenium WebDriver ne convient pas à tous les scénarios
Selenium ou Selenium WebDriver met à votre disposition des outils de première qualité pour collecter des données sur des sites internet et simuler des interactions avec les utilisateurs. Cependant, ce framework open source ne convient pas à tous les domaines comme le soulignent les développeurs dans leur liste de « Worst Cases » (« pires cas d’utilisation »). Les domaines suivants font notamment partie des cas et des contenus de sites internet que vous ne pouvez pas tester ou enregistrer avec Selenium :
- Captchas : les captchas sont une solution bien connue et largement répandue, développée pour protéger les sites internet contre les robots et les spams, qui empêche donc les processus automatisés à l’aide de Selenium. Si vous êtes confronté à des captchas, vous devrez donc désactiver les tests de saisie pendant la phase de test ou le scraping ou les remplacer temporairement par un autre élément.
- Téléchargements de fichier : même s’il est possible de lancer le téléchargement de fichiers dans les instances Selenium en simulant le clic sur un lien correspondant, l’API n’affiche pas l’avancée du processus de téléchargement.
- Code de réponse HTTP : Selenium comporte certaines faiblesses dans le traitement des codes de statut HTTP. Si nécessaire, vous pouvez toutefois parer à ces inconvénients en ajoutant un proxy.
- Connexion à des services de prestataires tiers : qu’il s’agisse de plates-formes de réseaux sociaux, de services sur le cloud ou d’un compte de messagerie, il n’est pas recommandé de procéder à une connexion auprès de prestataires tiers à l’aide d’une session Selenium. En effet, les prestataires de tels services mettent à disposition leurs propres API à des fins de test et les tests ainsi réalisés sont très lourds.
- Test de performance : Selenium WebDrive ne convient pas à la réalisation de tests de performance à proprement parler car ce framework n’a simplement pas été conçu pour cela.