Plan du site  
pixel
pixel

Articles - Étudiants SUPINFO

Automatiser votre navigateur Web avec Selenium, PhantomJS et Python

Par Christophe QUENTEL Publié le 21/10/2016 à 15:58:54 Noter cet article:
(0 votes)
Avis favorable du comité de lecture

De nos jours, à des fins utilitaires ou de tests, il semble important de pouvoir automatiser son navigateur Web afin de réaliser un ensemble de tâches spécifiques. En soit, il existe de nombreux utilitaires permettant cela (tels que iMacro ou encore SuperMacro) mais l'un des moyens les plus efficaces reste sans doûte la méthode Python, qui est un langage léger et s'exécutant rapidement, auquel viennent se greffer deux bibliothèques spécialisées et multiplateformes : Selenium (pour réaliser l'automatisation des tâches sur un navigateur Web) et PhantomJS qui va permettre de lancer un navigateur en tâche d'arrière plan, sans quitter la ligne de commande (sans ouvrir de navigateur, donc) ce que l'on appelle un WebKit headless.

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

De ce fait, nous pouvons allier la rapidité d'exécution de Python, avec la gestion des macros sur navigateur Web et la transparence avec PhantomJS. Les ressources, la rapidité se retrouveront nettement allégés pour le plus grand bonheur de tous. A titre d'exemple, une macro qui tournerait uniquement avec Selenium mettrait bien plus de temps (quelques secondes le temps de charger le navigateur et les éléments de la page) alors qu'avec PhantomJS, le temps d'exécution serait inférieur à une seconde (le tout dépendant évidemment de la taille du script et des actions réalisées, ainsi que de la machine sur laquelle est lancée le script).

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Cet article a pour but de vous initier à la création de scripts Python qui vont réaliser des tâches automatiques. Cet article s'applique aussi bien pour des systèmes UNIX que Windows.

Configuration de base et pré-requis

La première des étapes afin de pouvoir automatiser votre navigateur Web est l'installation de l'ennvironnement Python. Pour cela, rendez-vous sur le site https://www.python.org/downloads/ Deux versions seront au choix : la 3.5.2 et la 2.7.12. Celle qui sera utilisée dans l'exemple en dernière partie sera la version 3.5.2 (la plus récente donc). Une fois le téléchargement fini, procéder à l'installation qui prendra quelques temps en n'oubliant pas de cocher l'option au préalable "Add Python x.x TO PATH" (très important afin que l'interpréteur Python soit disponible dans une variable d'environnement). Dans le cas d'un système d'exploitation Windows, je conseille fortement d'installer Python à la racine de votre disque dur (C:/Python...). Sous MAC OS X, un simple "brew install Python" vous permettra d'installer l'environnement Python.

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Une fois l'installation faite, il ne reste plus qu'à tester si Python est correctement installé, pour cela ouvrez un terminal ou une invite de commandes et tapez la commande suivante : "python -V". Si votre terminal vous affiche la version, l'interpréteur Python est alors bien installé.

                                                                                                                                                                                                                                                                                                                                                                                 

                                                                                                                                                                                                                                                                                                                                                                                 

La seconde étape est l'installation de la bibliothèque Selenium, celle qui permet de réaliser de test sur votre navigateur Web. Une fois Python installé, il nous suffit juste de taper une seule commande qui permettra d'installer la librairie Selenium : "pip install selenium"

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Enfin, la dernière étape est l'installation de PhantomJS. Si vous êtes sur MAC OS X ou Linux, la commande "brew install phantomjs" permettra simplement de l'installer et de pouvoir l'utiliser. Si vous êtes sous Windows, il faudra placer PhantomJS.exe dans le dossier de votre interpréteur Python. Pour cela rendez-vous à l'adresse http://phantomjs.org/download.html pour téléchargez l'archive .ZIP et extrayez-en l'exécutable à la racine de Python.

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Une fois ces étapes réalisées, vous disposerez de la configuration de base afin de pouvoir commencer à travailler sur vos scripts. Voici ci-dessous où PhantomJS doit être localisé si vous travaillez sous Windows, ce screenshot vous montre également à quoi doit ressembler votre environnement de travail. On voit le dossier "selenium" installé donc tout est prêt.

                                                                                                                                                                                                                                                                                                                                                                                 

Selenium et PhantomJS en détails

Selenium permet de s'interfacer avec plusieurs langages, dont Python qui est particulièrement intéressant car facile à prendre en main, tout en étant rapide et facile à installer. Voici les sélecteurs pour sélectionner des éléments à partir de Selenium (et ce, pour n'importe quel langage) :

                                                                                                                                          

                                                                                                                                          
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
                                                                                                                                          

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Des méthodes peuvent s'appliquer à ces sélecteurs, notamment send_keys (pour écrire du texte sur la balise sélectionnée, bien évidemment si ce n'est pas une balise type input ou contenteditable, cela n'écrira rien), ou encore click (pour cliquer sur la balise). Pour naviguer sur une page, la méthode .get(URL) suffira. Toutes ces méthodes et ces sélecteurs s'appliqueront au driver (donc à notre navigateur PhantomJS qui tourne en tâche de fond)

                                                                                                                                                                                                                                                                                                                                                                                 

PhantomJS va nous servir de "Web-Driver" et cela sera là son unique utilité. De quoi s'agit-il ? Afin que Python puisse interagir avec le navigateur Web (Chrome, Firefox ou autres), de la même manière que la communication avec une base de données, il nous faut un driver (pilote). C'est là qu'intervient le Web Driver, il permet la communication entre le navigateur Web et notre script Python. De base, Selenium peut utiliser différents drivers pour différents navigateurs (Chrome, Firefox, Opéra) mais ce qui nous intéresse, ce n'est pas d'ouvrir un navigateur mais d'avoir un navigateur headless (sans interface graphique, uniquement en ligne de commandes). C'est là qu'intervient PhantomJS, qui fournit lui-même son Web Driver. L'utilité c'est donc la rapidité d'exécution par rapport aux navigateurs classiques.

                                                                                                                                          

Réalisation d'une macro de base

Maintenant que notre environnement Python, que les bilbiothèques Selenium et PhantomJS ont été installées, et que nous avons eu un aperçu du fonctionnement de chaque "bloc", voici un script qui va reprendre et montrer l'étendue des possibilités dans le scripting de macros sous Python. Ce script va réaliser les actions suivantes : il va se rendre sur le moteur de recherche Google, il va taper le mot clé "Campus Booster" puis effectuer une recherche, il va cliquer sur le premier lien, saisir les identifiants Campus Booster et ainsi se connecter, puis va retourner l'URL de la page une fois connecté ainsi qu'un screenshot, le tout sans quitter la ligne de commande ni ouvrir de navigateur (en vrai, un navigateur s'ouvre de manière invisible, il s'agit du navigateur PhantomJS).

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

                                                                                                                                          
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.set_window_size(1120, 550)
driver.get("https://www.google.fr/")
driver.find_element_by_class_name("gsfi").send_keys("campus booster")
driver.find_element_by_class_name("sbico").click()
driver.find_element_by_css_selector(".r:first-child").click()
driver.find_element_by_id("actor_login_university_openid1_openIdBox").send_keys("ID Booster")
driver.find_element_by_name("actor_login_university_openid1$loginButton").click()
driver.find_element_by_id("Password").send_keys("Mot de passe")
driver.find_element_by_name("ctl00$Main$login1$LoginButton").click()
print(" Vous etes bien connectes à Campus Booster. Voici l URL de la page : ' + driver.current_url)
driver.save_screenshot("screenshot.png")
driver.quit()
                                                                                                                                          

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Analysons le script. On crée tout d'abord un nouveau fichier python (par exemple, macro.py) avec l'éditeur de fichiers de notre choix (cela peut être un simple Notepad, un NotePad++, un SublimeText ou encore un IDE propriétaire tel que Visual Studio). Une fois ce fichier crée, on l'édite, et on commence par importer le WebDriver de selenium (from selenium import webdriver). On définit ensuite PhantomJS en tant que WebDriver avec la directive webdriver.PhantomJS(), on définit la taille du navigateur avec set_window_size(x,y).

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

Par la suite, la directive .get(URL) nous permet de charger une page Internet à partir de son URL (attention à bien faire attention au HTTP ou HTTPS, selon les cas). Dans notre exemple, on se rend tout simplement sur Google.fr. On cherche ensuite sur cette page un élément à partir de son ID, sa classe ou à partir d'un sélecteur CSS (par exemple, on aura déjà repéré au préalable la balise contenant la donnée par son ID), et on lui envoie du texte. En d'autres termes, on recherche la classe de la barre de texte sur la page Google et on simule une saisie de texte. Ceci est possible grâce à find_element_by_class_name(classe de la balise) auquel on attribue l'action de simuler des touches de frappe avec send_keys(TEXTE).

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

On trouve ensuite le bouton pour lancer la recherche sur Google puis on génère le clic avec la méthode .click(). La page Google va ainsi effectuer la recherche sur le mot clé 'campus booster'. On va cliquer sur le premier résultat à partir de l'ID du lien pour se rendre sur l'interface Campus Booster, puis de la même manière, on va entrer notre ID puis notre mot de passe afin de se connecter à Campus Booster. On a donc pu géré avec Selenium la connexion/l'envoi de formulaire.

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  

Enfin, on finit par prendre un screenshot de la page pour vérifier que nous sommes bien connectés (le screenshot sera dans le même dossier que le script python de la macro), on retourne l'URL active de la page avec la méthode driver.current_url et on quitte avec la méthode .quit(). Il ne nous reste plus qu'à lancer notre script ! Pour cela ouvrez votre terminal/invite de commandes et taper "python macro.py" et votre macro va s'exécuter (pensez à autoriser le pare-feu à PhantomJS). Voilà notre script s'est bien exécuté et le tout assez rapidement.

                                                                                                                                                                                                                                                                                                                                                                                

                                                                                                                                                                                                                                                                                                                                                                                 

Conclusion

Voilà quelques documentations qui approfondiront toutes les notions évoquées dans l'article et permettront de reprendre certains points avec précision car nous ne sommes allés qu'à l'essentiel à travers cet article, alors que le domaine d'utilisation est très vaste :

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

> Documentation de Python : https://www.python.org/doc/

> Documentation de Selenium : http://www.seleniumhq.org/docs/

> Documentation de PhantomJS : http://phantomjs.org/documentation/

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

On peut également coupler la création de macro avec Python, Selenium et PhantomJS à une crontab (https://fr.wikipedia.org/wiki/Cron) afin que notre macro se lance automatiquement à tel(s) jour(s), telle heure, telle minute.

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Toeic, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels