Attentes, actions & frames — tuer l'instabilité à la source
Les tests instables — ceux qui passent, puis échouent, puis repassent — ont une cause principale. La voici, et comment la neutraliser pour de bon.
L'idée, en une ligne
La plupart de l'instabilité vient d'agir sur un élément avant que la page soit prête. Le correctif est d'attendre la bonne chose au bon moment.
Deux sortes d'attente (ne les mélangez pas)
- Attente implicite —
driver.implicitly_wait(10)fixe un seul timeout global pour chaque recherche. Pratique, mais ça cache les bugs de timing. - Attente explicite —
WebDriverWait(driver, 10).until(...)attend une condition spécifique (cliquable, visible, texte présent) à une étape. Précise et auto-documentée.
Voyez-le à l'œuvre
▸ try it
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
wait = WebDriverWait(driver, timeout=10)
# Wait for THIS condition only — not a blind sleep
btn = wait.until(EC.element_to_be_clickable((By.ID, "submit")))
btn.click()
# Hover over a menu to reveal it
menu = driver.find_element(By.ID, "account")
ActionChains(driver).move_to_element(menu).perform()
# Step inside an iframe, then step back out
driver.switch_to.frame("payment_iframe")
driver.find_element(By.ID, "card").send_keys("4111111111111111")
driver.switch_to.default_content()Lisez-le de haut en bas : attendez que le bouton soit réellement cliquable, puis cliquez. Survolez pour révéler un menu. Entrez dans une iframe pour atteindre son contenu, puis ressortez.
Avancé — gestes, frames et fenêtres
- Pour tout ce qui va au-delà de cliquer et taper — survol, glisser, combinaisons de touches — utilisez
ActionChains. - Le contenu à l'intérieur d'une iframe est un document séparé. Selenium ne peut pas le voir tant que vous n'appelez pas
driver.switch_to.frame(...), et vous revenez avecswitch_to.default_content(). - Les nouveaux onglets et popups fonctionnent pareil, via
driver.window_handlesetswitch_to.window(...).
Basé sur la doc officielle Selenium (Python) — Waits, Actions API, Frames
Toutes les leçons de Automatisation UI : Selenium + Playwright + pytest
- Sélecteurs Selenium : trouver l'élément que vous voulez
- Attentes, actions & frames — tuer l'instabilité à la source
- Playwright : attente automatique, sélecteurs & tracing
- pytest en profondeur : fixtures, conftest, parametrize & marqueurs
- Le Page Object Model, fait correctement
- Les cas difficiles : éléments dynamiques, iframes, uploads & simulation réseau