Contactez-nous

Introduction au concept de Page Object Model (POM) simplifié

Découvrez les principes et avantages du Page Object Model (POM) simplifié en Robot Framework. Apprenez à structurer vos tests pour une meilleure maintenabilité et lisibilité avec des exemples concrets.

Le Page Object Model (POM) : une fondation pour des tests solides

Lorsque vos projets d'automatisation de tests prennent de l'ampleur, la gestion et la maintenance des scripts peuvent rapidement devenir un défi. Le Page Object Model (POM) est un patron de conception éprouvé qui adresse directement cette problématique, en particulier pour les tests d'interface utilisateur. Son adoption, même dans une forme simplifiée, transforme radicalement la structure de vos tests, les rendant plus robustes, lisibles et surtout, plus faciles à maintenir sur le long terme. Ce chapitre vous guidera à travers les principes fondamentaux du POM et comment l'appliquer efficacement dans vos projets Robot Framework.

L'idée centrale du POM est de créer une abstraction pour chaque page (ou composant significatif) de l'application que vous testez. Au lieu d'intégrer directement les détails techniques des interactions (comme les sélecteurs CSS ou XPath) dans vos cas de test, vous les encapsulez dans des "objets de page" dédiés. Dans le contexte de Robot Framework, ces objets de page sont typiquement implémentés sous forme de fichiers de ressources (`.resource`) ou de librairies Python personnalisées. Ces fichiers contiennent les sélecteurs des éléments de la page et des keywords utilisateurs qui décrivent les actions possibles sur ces éléments (par exemple, "Se connecter", "Ajouter un produit au panier").

L'objectif de cette approche est de séparer la logique de test (ce que vous voulez vérifier) de la logique d'interaction avec la page (comment vous interagissez avec les éléments). Cette séparation est la clé pour atteindre une meilleure organisation et une maintenabilité accrue. En comprenant et en appliquant le POM, vous ferez un pas de géant vers la professionnalisation de vos pratiques d'automatisation.

Principes clés et avantages du Page Object Model

Au coeur du Page Object Model résident quelques principes simples mais puissants. Le premier est la représentation des pages : chaque page de l'application testée est modélisée par une classe ou, dans le contexte de Robot Framework, souvent par un fichier de ressources. Ce fichier devient le seul endroit où sont définis les sélecteurs (locators) des éléments de cette page spécifique.

Le deuxième principe est l'encapsulation des interactions. Les actions qu'un utilisateur peut effectuer sur une page (cliquer sur un bouton, remplir un formulaire, lire un texte) sont implémentées comme des méthodes ou des keywords au sein de l'objet de page correspondant. Ainsi, vos cas de test n'appellent plus directement les keywords de bas niveau de SeleniumLibrary (comme `Input Text xpath=...`), mais des keywords plus métier (comme `Remplir le formulaire de recherche avec "Robot Framework"`).

Les avantages de cette approche sont considérables :

  • Maintenabilité améliorée : C'est l'avantage le plus significatif. Si l'interface utilisateur change (par exemple, un identifiant de bouton est modifié), vous n'avez besoin de mettre à jour le sélecteur qu'à un seul endroit : dans le fichier ressource de la page concernée. Tous les cas de test utilisant cette page via ses keywords métier restent inchangés. Cela réduit drastiquement le temps et l'effort de maintenance.
  • Lisibilité accrue des tests : Les cas de test deviennent beaucoup plus clairs et expressifs. Ils se concentrent sur les étapes du scénario métier plutôt que sur les détails techniques de l'interaction avec l'interface. Par exemple, un test peut lire : `Ouvrir la page d'accueil`, `Rechercher le produit "X"`, `Ajouter le produit au panier`, `Valider le panier`. C'est beaucoup plus compréhensible qu'une longue suite d'appels à `Click Element` et `Input Text`.
  • Réutilisabilité du code : Les keywords définis dans les objets de page peuvent être réutilisés par de multiples cas de test. Si plusieurs scénarios nécessitent de se connecter à l'application, ils utiliseront tous le même keyword `Se connecter` défini dans l'objet de page de connexion.
  • Réduction de la duplication : En centralisant la définition des sélecteurs et des interactions, on évite de répéter le même code de localisation d'éléments ou les mêmes séquences d'actions dans plusieurs tests.
  • Meilleure collaboration : Des tests plus lisibles facilitent la compréhension par des membres de l'équipe moins techniques (comme les analystes métier ou les testeurs manuels) et favorisent une meilleure collaboration.

Adopter le POM, même dans une version simplifiée comme nous allons le voir, est un investissement initial qui porte ses fruits très rapidement en termes de qualité et d'efficacité de votre processus d'automatisation.

Implémentation simplifiée du POM avec les fichiers de ressources Robot Framework

Pour débuter avec le Page Object Model dans Robot Framework sans ajouter la complexité de créer des librairies Python, l'utilisation des fichiers de ressources (`.resource`) est une excellente approche. Elle permet de bénéficier de la plupart des avantages du POM tout en restant dans la syntaxe familière de Robot Framework.

L'idée est de créer un fichier `.resource` pour chaque page ou composant majeur de votre application. Ce fichier contiendra :
1. La section `*** Variables ***` pour définir les sélecteurs (locators) des éléments de la page.
2. La section `*** Keywords ***` pour définir les actions (keywords utilisateurs) que l'on peut effectuer sur cette page.

Prenons l'exemple d'une page de connexion simple, `login_page.resource` :

*** Settings ***
Library    SeleniumLibrary

*** Variables ***
${LOGIN_PAGE_URL}       /login
${USERNAME_FIELD}       id=username
${PASSWORD_FIELD}       id=password
${LOGIN_BUTTON}         id=loginSubmitBtn
${ERROR_MESSAGE_LOGIN}  css=.flash.error

*** Keywords ***
Ouvrir la Page de Connexion
    [Documentation]    Navigue vers la page de connexion.
    Go To    ${BASE_URL}${LOGIN_PAGE_URL}

Saisir le Nom d'Utilisateur
    [Arguments]    ${username}
    [Documentation]    Saisit le nom d'utilisateur dans le champ dédié.
    Input Text    ${USERNAME_FIELD}    ${username}

Saisir le Mot de Passe
    [Arguments]    ${password}
    [Documentation]    Saisit le mot de passe dans le champ dédié.
    Input Text    ${PASSWORD_FIELD}    ${password}

Cliquer sur le Bouton de Connexion
    [Documentation]    Clique sur le bouton pour soumettre le formulaire de connexion.
    Click Button    ${LOGIN_BUTTON}

Effectuer une Connexion Complète
    [Arguments]    ${username}    ${password}
    [Documentation]    Effectue l'ensemble des actions pour se connecter.
    Ouvrir la Page de Connexion
    Saisir le Nom d'Utilisateur    ${username}
    Saisir le Mot de Passe    ${password}
    Cliquer sur le Bouton de Connexion

Vérifier l'Affichage d'un Message d'Erreur de Connexion
    [Arguments]    ${expected_message}
    [Documentation]    Vérifie que le message d'erreur de connexion est affiché et contient le texte attendu.
    Wait Until Page Contains Element    ${ERROR_MESSAGE_LOGIN}    timeout=5s
    Element Should Contain    ${ERROR_MESSAGE_LOGIN}    ${expected_message}

Dans ce fichier de ressource :
- Les variables comme `${USERNAME_FIELD}` stockent les sélecteurs. Si l'ID du champ utilisateur change, vous ne le modifiez qu'ici.
- Des keywords de bas niveau comme `Saisir le Nom d'Utilisateur` encapsulent une action simple.
- Des keywords de plus haut niveau comme `Effectuer une Connexion Complète` combinent plusieurs actions pour représenter une interaction utilisateur complète.

Ensuite, dans votre fichier de cas de test (`login_tests.robot`), vous importez cette ressource et utilisez les keywords définis :

*** Settings ***
Resource          ../../Resources/Pages/login_page.resource
Library           SeleniumLibrary
Suite Setup       Open Browser    ${URL_DEMO_SITE}    ${BROWSER}
Suite Teardown    Close Browser

*** Variables ***
${URL_DEMO_SITE}    https://the-internet.herokuapp.com
${BROWSER}          chrome

*** Test Cases ***
Connexion Réussie avec Identifiants Valides
    [Documentation]    Teste la connexion avec des identifiants corrects.
    [Tags]    Smoke    Login
    Effectuer une Connexion Complète    tomsmith    SuperSecretPassword!
    Page Should Contain    Welcome to the Secure Area.

Echec de Connexion avec Mot de Passe Incorrect
    [Documentation]    Teste la connexion avec un mot de passe erroné.
    [Tags]    Login    ErrorHandling
    Effectuer une Connexion Complète    tomsmith    WrongPassword
    Vérifier l'Affichage d'un Message d'Erreur de Connexion    Your username is invalid!

Remarquez comme les cas de test sont maintenant beaucoup plus lisibles. Ils décrivent les étapes du scénario sans se soucier des détails d'implémentation des interactions avec la page. Si la structure de la page de connexion change, seuls les keywords dans `login_page.resource` devront être adaptés, pas les cas de test eux-mêmes. C'est la puissance du POM en action, même dans sa forme simplifiée.