Pièges courants et solutions / Blogs / Perficient

Lors de l’automatisation des tests de navigateur avec Sélénium et Pytestil est courant de rencontrer des difficultés. Selenium est un outil puissant, mais il peut être difficile à dépanner et à déboguer. Que vous rencontriez délais d’attente, éléments obsolètesou résultats incorrectsil est essentiel de comprendre comment identifier et résoudre les problèmes courants.
Dans ce blog, nous passerons en revue quelques pièges courants lors de l’utilisation de Selenium avec Pytest et partagerons des solutions pratiques pour vous aider à déboguer efficacement vos tests.
- Élément introuvable/NoSuchElementException :
L’une des erreurs les plus fréquentes lors de l’utilisation de Selenium est la NoSuchElementExceptionqui se produit lorsque Selenium ne parvient pas à localiser un élément sur la page. Cela se produit généralement si :- L’élément n’est pas encore présent (par exemple, il se charge dynamiquement).
- Le sélecteur est incorrect ou obsolète.
- L’élément se trouve dans un cadre ou une fenêtre différente.
Solution:
Pour résoudre ce problème, vous pouvez utiliser Attentes explicites pour s’assurer que l’élément est présent avant d’interagir avec lui. Selenium fournit la méthode WebDriverWait, qui attend qu’une condition spécifique soit remplie (par exemple, qu’un élément devienne visible ou cliquable).
- Exemple:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Wait for the element to be visible wait = WebDriverWait(driver, 10) # Wait for up to 10 seconds element = wait.until(EC.visibility_of_element_located((By.ID, "myElement"))) element.click()
Cela attendra que l’élément apparaisse dans les 10 secondes avant d’essayer d’interagir avec lui.
- StaleElementReferenceException : Le StaleElementReferenceException se produit lorsque vous essayez d’interagir avec un élément qui ne fait plus partie du DOM. Cela peut se produire si la page est rechargée ou si l’élément est supprimé et recréé.
Solution: Pour résoudre ce problème, il suffit déplacer l’élément avant d’interagir à nouveau avec lui. Utiliser une attente explicite avant d’interagir avec l’élément est également une bonne pratique.
- Exemple:
# First locate the element element = driver.find_element(By.ID, "myElement") # Perform an action element.click() # If the page is updated, re-locate the element element = driver.find_element(By.ID, "myElement") element.click()
- Délais d’attente (élément non interactif) : Des erreurs de délai d’attente se produisent souvent lorsque Selenium met plus de temps que prévu à rechercher ou à interagir avec un élément. Par exemple, essayer de cliquer sur un élément avant qu’il ne soit complètement chargé ou interagir avec un élément masqué.Solution: En utilisant attentes explicites comme le montre le premier exemple, cela aidera ici. Mais vous devez également vous assurer que l’élément est interactif (visible et activé) avant d’effectuer toute action sur celui-ci.
Exemple:
wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID, "submitButton"))) element.click()
Dans ce cas, element_to_be_clickable garantit que le bouton est non seulement présent mais également interactif (c’est-à-dire visible et activé).
- Mauvaise version du navigateur ou problèmes de compatibilité : Parfois, les tests peuvent réussir sur un navigateur mais échouer sur un autre. Ceci est particulièrement courant avec les tests multi-navigateurs. Solution:Assurez-vous que vous utilisez le pilotes de navigateur corrects (par exemple, ChromeDriver pour Chrome, GeckoDriver pour Firefox) compatibles avec la version du navigateur que vous testez. Vérifiez également si le problème est spécifique au moteur de rendu du navigateur. Si vous exécutez des tests sur plusieurs navigateurs, utilisez un service de test cloud tel que Pile de navigateur ou Laboratoires de sauces est un bon moyen d’éviter les problèmes de configuration du navigateur et de tester sur des environnements réels.
- Journalisation et capture des erreurs Un autre problème est le suivi et la journalisation efficaces des erreurs pendant l’exécution des tests. Si vous ne capturez pas de journaux, il peut être difficile d’identifier ce qui n’a pas fonctionné en cas d’échec du test.Solution: Incorporation enregistrement dans votre test peut vous aider à suivre les actions et les erreurs, facilitant ainsi l’identification des problèmes.Exemple:
import logging # Set up logging logging.basicConfig(level=logging.INFO) def test_login(driver): logging.info("Opening login page") driver.get("https://example.com/login") logging.info("Filling in login credentials") driver.find_element(By.ID, "username").send_keys("user") driver.find_element(By.ID, "password").send_keys("pass") logging.info("Submitting the form") driver.find_element(By.ID, "submit").click() logging.info("Verifying login success") assert "Welcome" in driver.page_source
Vous pouvez afficher la sortie du journal pour retracer la séquence des événements en cas de panne.
- Erreurs d’assertion Pytest : Un autre problème courant est erreurs d’assertion lorsque la valeur attendue ne correspond pas à la valeur réelle renvoyée par le test.Solution: Lorsque vous effectuez des tests avec Pytest, assurez-vous que vos assertions sont significatives et validez ce qui vous intéresse vraiment. Parfois, comparer directement des chaînes ou des nombres peut entraîner des erreurs si les valeurs ont des formats différents.Exemple:
def test_title(driver): driver.get("https://example.com") assert driver.title == "Expected Title", f"Expected 'Expected Title' but got {driver.title}"
Cette assertion permet de garantir que le test échoue correctement, en fournissant des messages d’erreur utiles pour le débogage.
- Marqueurs Pytest et catégorisation des testsLorsque vous disposez d’une grande suite de tests, exécuter tous les tests à chaque fois peut ralentir le développement. En utilisant Marqueurs Pytest catégoriser les tests (par exemple, @pytest.mark.smoke) peut vous aider à exécuter uniquement les tests pertinents, facilitant ainsi le débogage.Solution:Utilisez des marqueurs pour marquer les tests de différentes catégories, tels que les tests de fumée, les tests de régression, etc.Exemple:
import pytest @pytest.mark.smoke def test_login(driver): driver.get("https://example.com/login") assert "Login" in driver.title @pytest.mark.regression def test_logout(driver): driver.get("https://example.com/logout") assert "Logout Successful" in driver.page_source
Exécutez ensuite uniquement des tests de fumée ou des tests de régression en spécifiant le marqueur :
pytest -m fumée
Conclusion
Le débogage des tests Selenium avec Pytest peut être délicat, mais en comprenant les pièges courants et en appliquant des solutions simples, vous pouvez gagner du temps et améliorer la fiabilité des tests. Voici un bref récapitulatif de ce que nous avons couvert :
- Utiliser attentes explicites pour gérer les éléments dynamiques et les délais d’attente.
- Déplacer les éléments si vous rencontrez StaleElementReferenceException.
- Assurez-vous que les éléments sont interactif avant de cliquer.
- Utiliser enregistrement pour suivre le flux et les erreurs dans vos tests.
- Effet de levier Marqueurs Pytest pour exécuter des tests pertinents et faciliter le débogage.
En suivant ces bonnes pratiques, vous deviendrez plus efficace pour identifier et résoudre les problèmes dans vos tests Selenium. Bon débogage !
Source link