1. A propos de la bibliothèque Selenium
Selenium est un outil puissant pour contrôler les navigateurs Web via des programmes et effectuer l'automatisation du navigateur. Il est fonctionnel pour tous les navigateurs, fonctionne sur tous les principaux systèmes d'exploitation et ses scripts sont écrits dans différents langages, à savoir Python, Java, C#, etc.,Quand à nous, nous travaillerons avec Python dans ce tutoriel. Ce tutoriel Selenium couvre tous les sujets tels que – WebDriver, WebElement, tests unitaires avec Selenium tout en se limitant aux usages basiques de cette bibliothèque.
Afin de découvrir plus de fonctionnalités avancées, nous vous conseillons de voir la documentation officielle de Selenium: https://selenium-python.readthedocs.io/
2. Prérequis
- Python 3.x : installé et configuré sur votre machine
- Un IDE : VSCode, Spyder, Tonny, PyCharm...
- Un navigateur web : compatible (Chrome, Firefox, Safari etc.)
- WebDriver : ChromeDriver ou GeckoDriver (pour Firefox) pour communiquer avec le navigateur
3. Installation de Selenium et WebDriver
3.1 Installation de Selenium
L'installation de la bibliothèque Selenium est une opération assez simple en utilisant l'utilitaire pip:
1 |
pip install selenium |
3.2 Téléchargement de WebDriver
- GeckoDriver pour Firefox: https://github.com/mozilla/geckodriver/releases
- ChromeDriver pour Chrome: https://chromedriver.chromium.org/downloads
- EdgeDriver pour Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- SafariDriver pour safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/
Placez ensuite le fichier exécutable du WebDriver dans un répertoire accessible dans votre PATH ou spécifiez son chemin directement dans le script.
4. Usage de la bibliothèque selenium
4.1 Initialisation du WebDriver
Nous allons utiliser GeckoDriver de FireFox pour faire une initialisation. A cet effet veuillez télécharger geckodriver-v0.34.0-win64.zip depuis la page officielle sur Github.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service # Spécifiez le chemin vers GeckoDriver (cas de firefox) service = Service('path/to/GeckoDriver') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) # Utiliser une adresse url driver.get("votre adresse url ici") print(driver.title) driver.quit() |
Exemple (ouvrir Wikipedia sur firefox pendant 10 secondes)
Nous allons faire un petit essai de Selenium pour ouvrir une page web à titre d'exemple : www.wikipedia.org. Pour cela mettez le fichiers geckodriver.exe dans le même répertoire du fichier Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service import time # Spécifiez le chemin vers GeckoDriver service = Service('geckodriver.exe') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) driver.get("https://www.wikipedia.org/") print(driver.title) # Attendez quelques secondes time.sleep(10) driver.quit() """ Cet exemple ouvre la page d'accueil de wikipedia.org sur FireFox pendant 10 secondes""" |
4.2 Gérer les interactions
La bibliothèque Selenium permet de réaliser des opérations magiques d'interaction avec des pages web, comme l'ouverture d'une page web spécifique tout en contrôlant la durée d'ouverture, l'inscription aux différents sites web via leurs formulaires d'inscription, et c'est là que les développeurs créent ce qu'ils nomment les bots ou plustôt des robot spammeurs (spambot en anglais)... Afin d'intéragir avec une page web et pouvoir manipuler son formulaire, Selenium permet au préalable la récupération des noms des champs de ce formulaire via la méthode find_element():
1 2 3 4 5 |
# Trouver un élément par son ID element = driver.find_element(By.ID, "element_id") # Trouver un élément par son nom element = driver.find_element(By.NAME, "element_name") |
Code complet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By # Spécifiez le chemin vers GeckoDriver service = Service('geckodriver.exe') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) driver.get("https://www.example.com") # Trouver un élément par son ID element = driver.find_element(By.ID, "element_id") element.click() # Trouver un élément par son nom element = driver.find_element(By.NAME, "element_name") element.send_keys("Selenium") # Soumettre un formulaire element.submit() driver.quit() |
Exemple (connexion d'un utilisateur à un site web)
Nous allons voir maintenant comment gérer les interactions de Selenium avec les formulaires des pages web en prenant comme exemple la connexion à notre site : www.tresfacile.net en utilisant les identifiants d'un compte utilisateur déjà existant:
1 2 |
user : 'testuser' password : 'SeleniumPython2024@' |
Si vous sélectionnez le formulaire de connexion:
et vous examinez ensuite son code source, vous obtenez les éléments d'indentification suivants:
1 2 3 |
<input name="log" type="text" value="" id="user_login" autocapitalize="none" class="tml-field"> <input name="pwd" type="password" value="" id="user_pass" class="tml-field"> <button name="submit" type="submit" class="tml-button">Se connecter</button> |
Cela indique le nômage suivant:
- log : est utilisé pour le nom du champ nom d'utilisateur
- pwd : est utilisé pour le nom du champ password
Code final de connexion
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Spécifiez le chemin vers GeckoDriver service = Service('geckodriver.exe') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) driver.get("https://www.tresfacile.net/login/") print(driver.title) # Attendre que le champ "log" soit présent WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "log"))) # Trouver le champ username et entrer le texte login = driver.find_element(By.NAME, "log") login.send_keys("testuser") # Trouver le champ password et entrer le texte password = driver.find_element(By.NAME, "pwd") password.send_keys("SeleniumPython2024@") # Trouver le bouton submit et cliquer dessus submit_login = driver.find_element(By.NAME, "submit") submit_login.click() # Attendre quelques secondes pour vérifier si la connexion est réussie WebDriverWait(driver, 10).until(EC.title_contains("Dashboard")) # Fermer le navigateur driver.quit() |
Après exécution Firefox s'ouvre avec le formulaire de connexion préremplie avec les identifiants de connexion:
et quelques secondes plus tard, vous serez redirigé vers le tableau de bord de l'utilisateur qui est connecté:
4.3 Attente explicite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome(executable_path='path/to/chromedriver') driver.get("https://www.example.com") # Attendre que l'élément soit cliquable try: element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "element_id")) ) element.click() finally: driver.quit() |
4.4 Navigation
1 2 3 4 5 |
driver.get("https://www.example.com") print(driver.current_url) driver.back() driver.forward() driver.refresh() |
5. Créer et connecter un bot sur un site web
5.1 Plate-forme utilisée
5.2 Script d'enregistrement du bot
- Identifiant : user_login
- E-mail : user_email
- Password : user_pass1
- Confirm Password : user_pass2
- Submit Button : submit
Le script sera donc de la forme:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By import time # Spécifiez le chemin vers GeckoDriver service = Service('geckodriver.exe') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) # Récupérer l'adresse url de la page d'enregisrement des utilisateurs driver.get("http://localhost/mysite/register/") # Rechercher et remplir le champ user_login login = driver.find_element(By.NAME, 'user_login') username = 'Iam_Bot' login.send_keys(username) # Rechercher et remplir le champ l'email email = driver.find_element(By.NAME, 'user_email') email_value = 'iambot@gmail.com' email.send_keys(email_value) # Rechercher et remplir le champ password1 password1 = driver.find_element(By.NAME, 'user_pass1') pass1 = 'IamBot&2024' password1.send_keys(pass1) # Rechercher et remplir le champ password2 password2 = driver.find_element(By.NAME, 'user_pass2') pass2 = 'IamBot&2024' password2.send_keys(pass2) # Trouver le bouton submit et cliquer dessus submit_login = driver.find_element(By.NAME, "submit") submit_login.click() # Attendez quelques secondes pendant le chargement des éléments de la page time.sleep(10) # Accéder au tableau de board driver.get("http://localhost/mysite/dashboard/") # Restez quelques secondes sur le dashboard time.sleep(10) # Fermer le navigateur driver.close() |
Le script ci-dessus, crée un bot (un compte utilisateur virtuel) dont les identifiants sont:
- Identifiant : 'Iam_Bot'
- E-mail : 'iambot@gmail.com'
- Password : 'IamBot&2024'
5.3 Script de connexion du bot
Pour connecter le bot, nous allons créer un script similaire au précendant en changeant seulement la page d'enregistrement par celle de connexion:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By import time # Spécifiez le chemin vers GeckoDriver service = Service('geckodriver.exe') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) # Récupérer l'adresse url de la page d'enregisrement des utilisateurs driver.get("http://localhost/mysite/login/") # Rechercher et remplir le champ user_login login = driver.find_element(By.NAME, 'log') user = "Iam_Bot" login.send_keys(user) # Rechercher et remplir le champ password password = driver.find_element(By.NAME, 'pwd') passBot = "IamBot&2024" password.send_keys(passBot) # Rechercher et remplir le champ user_login submit_btn = driver.find_element(By.NAME, 'submit') submit_btn.click() time.sleep(7) # Accéder au tableau de board driver.get("http://localhost/mysite/dashboard/") time.sleep(15) # Accéder à la page profile driver.get("http://localhost/mysite/wp-admin/profile.php") time.sleep(15) driver.quit() |
5.4 Script d'insertion des commentaires par le bot
Le bot peut être programmé pour insérer des commentaires en bas des article pourvue que les commentaires soient autorisés par l'administrateur du site. Nous allons à titre d'exemple localiser un article via son ardresse url : http://localhost/mysite/langage-php/
Localisons ensuite le formulaire sur la page et identifier ses composants via le code source de la page:
1 2 3 4 5 |
<p class="comment-form-comment"><label for="comment">Commentaire <span class="required">*</span></label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required=""></textarea></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Laisser un commentaire"> </p> |
Nous allons donc utiliser dans notre script uniquement le champ textarea du commentaire et le bouton submit:
- Commentaire : comment
- Submit_button : submit
Script d'insertion des commentaires:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By import time # Spécifiez le chemin vers GeckoDriver service = Service('geckodriver.exe') # Initialisez le WebDriver avec le service driver = webdriver.Firefox(service=service) # Connexion au site WordPress driver.get("http://localhost/mysite/login/") login = driver.find_element(By.NAME, 'log') user = "Iam_Bot" login.send_keys(user) password = driver.find_element(By.NAME, 'pwd') passBot = "IamBot&2024" password.send_keys(passBot) submit_btn = driver.find_element(By.NAME, 'submit') submit_btn.click() time.sleep(7) # Aller à la page d'un article spécifique driver.get("http://localhost/mysite/langage-php/") # Remplacez par l'URL de l'article spécifique time.sleep(5) # Localiser le champ de texte pour le commentaire comment_field = driver.find_element(By.ID, 'comment') # Le sélecteur peut varier, vérifiez l'ID ou NAME exact du champ de commentaire comment_text = "Ceci est un commentaire posté par un bot." comment_field.send_keys(comment_text) # Localiser et cliquer sur le bouton de soumission du commentaire submit_comment = driver.find_element(By.ID, 'submit') # L'ID ou le sélecteur peut varier submit_comment.click() time.sleep(5) # Quitter le navigateur driver.quit() |
6. Gestion des fenêtres et des onglets
6.1 Usage des onglets
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Ouvrir un nouvel onglet driver.execute_script("window.open('https://www.google.com', '_blank');") # Switcher entre les fenêtres driver.switch_to.window(driver.window_handles[1]) print(driver.title) # Fermer l'onglet driver.close() # Revenir à l'onglet initial driver.switch_to.window(driver.window_handles[0]) print(driver.title) |
6.2 Gestion des alertes
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Accepter une alerte alert = driver.switch_to.alert alert.accept() # Refuser une alerte alert.dismiss() # Lire le texte d'une alerte print(alert.text) # Entrer du texte dans une alerte alert.send_keys("Selenium") alert.accept() |
6.3 Téléchargement de fichiers
Pour télécharger un fichier, vous devrez configurer le profil du navigateur pour gérer les téléchargements automatiques.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from selenium import webdriver from selenium.webdriver.firefox.options import Options options = Options() options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.manager.showWhenStarting", False) options.set_preference("browser.download.dir", "/path/to/download/directory") options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") driver = webdriver.Firefox(executable_path='path/to/geckodriver', options=options) driver.get("https://www.example.com/download") download_button = driver.find_element(By.ID, "download_button") download_button.click() |
7. Exécution d'un code JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from selenium import webdriver driver = webdriver.Chrome(executable_path='path/to/chromedriver') driver.get("https://www.example.com") # Exécuter un script JavaScript driver.execute_script("alert('Hello from Selenium');") # Récupérer la valeur de retour d'un script JavaScript title = driver.execute_script("return document.title;") print(title) driver.quit() |
8. Capture d'écran
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from selenium import webdriver driver = webdriver.Chrome(executable_path='path/to/chromedriver') driver.get("https://www.example.com") # Capturer une capture d'écran de la page entière driver.save_screenshot('screenshot.png') # Capturer une capture d'écran d'un élément spécifique element = driver.find_element(By.ID, "element_id") element.screenshot('element_screenshot.png') driver.quit() |
9. Gestion des cookies
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from selenium import webdriver driver = webdriver.Chrome(executable_path='path/to/chromedriver') driver.get("https://www.example.com") # Ajouter un cookie driver.add_cookie({"name": "key", "value": "value"}) # Obtenir un cookie cookie = driver.get_cookie("key") print(cookie) # Supprimer un cookie driver.delete_cookie("key") # Supprimer tous les cookies driver.delete_all_cookies() driver.quit() |
10. Tests automatisés
Selenium est souvent utilisé avec des frameworks de test comme unittest ou pytest.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import unittest from selenium import webdriver class TestExample(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome(executable_path='path/to/chromedriver') def test_example(self): self.driver.get("https://www.example.com") self.assertIn("Example Domain", self.driver.title) def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main() |
Younes Derfoufi
CRMEF OUJDA