Maîtriser les Fonctionnalités Essentielles de Selenium pour l'Automatisation Web

  1. Masquer la notification de contrôle automatisé dans Chrome

Lorsque vous utilisez ChromeDriver, une bannière indiquant que le navigateur est contrôlé par un logiciel de test automatisé apparaît par défaut. Pour désactiver cette alerte et rendre l'exécution du script plus discrète, vous pouvez ajuster les options expérimentales du navigateur avant l'initialisation du driver.

from selenium import webdriver

config_options = webdriver.ChromeOptions()
# Désactivation de la bannière d'automatisation
config_options.add_experimental_option("excludeSwitches", ["enable-automation"])
config_options.add_experimental_option('useAutomationExtension', False)

browser_driver = webdriver.Chrome(options=config_options)

  1. Configuration des délais d'attente pour le chargement réseau

Les actions dans Selenium s'exécutent instantanément. Si le script n'attend pas que la page ou les éléments du DOM soient entièrement rendus, cela entraîne souvent des échecs de localisation. Il est fortement recommandé d'implémenter des mécanismes d'attente implicites pour une configuration globale, ou des attentes explicites pour des éléments spécifiques.

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

# Attente implicite globale (appliquée à toutes les recherches d'éléments)
browser_driver.implicitly_wait(15)

# Attente explicite ciblée avec un intervalle de vérification
explicit_wait = WebDriverWait(browser_driver, 30, poll_frequency=1)
try:
    # Attendre que le champ de connexion soit visible
    username_field = explicit_wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#user_login")))
    # Attendre que le bouton de soumission soit cliquable
    submit_button = explicit_wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")))
except TimeoutException as err:
    print(f"Échec du chargement de l'élément dans le temps imparti : {err}")

  1. Résolution des erreurs de localisation d'éléments dans les iframes

L'exception NoSuchElementException survient fréquemment lorsqu'un élément est présent dans le code HTML mais reste introuvable par le script. Cela se produit généralement lorsque l'élément cible est encapsulé dans une balise <iframe>. Selenium ne peut interagir qu'avec le contexte du document principal par défaut. Vous devez donc basculer le contexte du driver vers le frame approprié avant toute interaction.

# Basculer dans le contexte de l'iframe par son identifiant, son nom ou son index
browser_driver.switch_to.frame("content_frame")

# Interagir avec les éléments à l'intérieur de l'iframe
target_element = browser_driver.find_element(By.ID, "inner_element")

# Revenir au contexte du document principal une fois les opérations terminées
browser_driver.switch_to.default_content()

  1. Interactions avancées avec les champs de saisie de texte

Au-delà de la simple insertion de texte, il est souvent nécessaire de simuler des frappes clavier complexes, comme vider un champ pré-rempli, valider un formulaire avec la touche Entrée, ou sélectionner l'intégralité du contenu pour le remplacer.

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

target_input = browser_driver.find_element(By.CSS_SELECTOR, "table.data-grid tr td input.value-field")

# Vider le champ et saisir une nouvelle valeur
target_input.clear()
target_input.send_keys("9876")

# Simuler l'appui sur la touche Entrée pour valider
target_input.send_keys(Keys.RETURN)

# Sélectionner tout le texte (Ctrl+A sur Windows/Linux)
target_input.send_keys(Keys.CONTROL, "a")

# Pour une compatibilité multiplateforme (gestion de la touche Command sur macOS)
from selenium.webdriver import ActionChains
ActionChains(browser_driver)\
    .key_down(Keys.CONTROL)\
    .send_keys("a")\
    .key_up(Keys.CONTROL)\
    .perform()

Étiquettes: Selenium Python web-automation chrome-webdriver explicit-wait

Publié le 21 juin à 19h00