Avantages et implémentation du modèle d'objet de page (POM)

Modèle d'objet de page (POM)

À ce stade, nous écrivions du code sans structure réelle, en nous concentrant uniquement sur une seule page et ses éléments et en envoyant des commandes à Selenium. Cependant, que se passe-t-il lorsque vous travaillez avec plusieurs pages, comme c'est le plus probable dans un cas d'automatisation réel? Nous préférerons ne pas appeler une commande des dizaines de fois sur une douzaine de pages différentes d'un produit, en raison d'une duplication de code indésirable et d'une maintenance de code compliquée. Au cas où l'équipe de développeurs déciderait de changer l'attribut ID de l'élément.

Par conséquent, la technique de modèle d'objet de page fournit une solution pour travailler avec plusieurs pages Web et empêche la duplication de code indésirable et permet une solution simple pour la maintenance du code. En général, chaque page de notre application sera représentée par une classe unique et l'inspection des éléments de page sera implémentée dans chaque classe. Dans ce didacticiel, nous utiliserons plusieurs classes (la même à partir de laquelle les tests automatisés ont été exécutés). Nous allons commencer à utiliser des calques.

Commençons par appeler chaque élément de la classe et exécutons la méthode souhaitée. L'exemple suivant démontrera ce processus de la meilleure façon:

Nous allons implémenter le modèle d'objet de page sur la page Contactez-nous. Tout d'abord, revenons au projet d'automatisation de test et créons le nouveau dossier «Pages». Dans ce dossier, nous allons créer une nouvelle classe appelée «ContactUs».

Copiez le code suivant:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.PageObjects;
using System.Threading;
using NUnit.Framework;
using System.IO;
namespace Test
{
    public class ContactUs
    {
        [FindsBy(How =How.Name,Using = "your-name")]
        private IWebElement yourName;
        [FindsBy(How = How.Name, Using = "your-email")]
        private IWebElement yourEmail;
        [FindsBy(How = How.Name, Using = "your-subject")]
        private IWebElement yourSubject;
        [FindsBy(How = How.Name, Using = "your-message")]
        private IWebElement yourMessage;
        [FindsBy(How = How.XPath, Using = "//input[@type='submit']")]
        private IWebElement submit;
        [FindsBy(How = How.ClassName, Using = "wpcf7-response-output")]
        private IWebElement SuccMessage;
        [FindsBy(How = How.Id, Using = "menu-item-1296")]
        private IWebElement contactUs;
        public bool isAt()
        {
            return Browsers.Title.Contains("Contact Us");
        }
        public void GoTo()
        {
            contactUs.Click();
        }
        public void SendYourName(string name)
        {
            yourName.SendKeys(name);
        }
        public void SendYourEmail(string email)
        {
            yourEmail.SendKeys(email);
        }
        public void SendYourSubject(string Subject)
        {
            yourSubject.SendKeys(Subject);
        }
        public void SendYourMessage(string massage)
        {
            yourMessage.SendKeys(massage);
        }
        public void clickSubmit()
        {
            submit.Click();
        }
        public void ValidateMessage()
        {
            try
            {
                var text = SuccMessage.Text;
            }
            catch (Exception e)
            {
                Assert.Fail();
            }
        }
    }
}

 Attribut FindsBy:

[FindsBy (How = How.Name, Using = "your-name")]
private IWebElement yourName;

La balise sera au-dessus de l'objet du type d'élément Web. FindsBy reçoit 2 paramètres pour localiser l'élément.

Dans l'exemple suivant, nous localiserons l'élément par 'Nom' tandis que Using est la valeur du sélecteur. Par exemple:

 De la même manière, nous mapperons les éléments sur la page Contactez-nous. Une fois tous les éléments mappés, créons des fonctions exécutant des actions sur ces éléments:

public void Goto()
{
    contactUs.Click();
}
public void SendYourName(string name)
{
    yourName.SendKeys(name);

 Fonction GoTo  - clique sur l'élément dans la barre de navigation et accède à la page Contactez-nous.

 Fonction SendYourName - envoie des valeurs au même champ.

Après avoir créé la classe gérant notre page, nous l'implémenterons en créant un autre nom de classe «Pages». Cette classe comprendra l'ensemble complet des objets de page que nous avons. Ce sera la seule classe qui pourra communiquer avec chaque page.

Continuez en collant le code suivant:

using OpenQA.Selenium.Support.PageObjects;
namespace Test
{
    public static class Pages
    {
        private static T getPages<T>() where T : new ()
        {
            var page = new T();
            PageFactory.InitElements(Browsers.getDriver, page);
            return page;
        }
        public static ContactUs contactUs
        {
            get { return getPages<ContactUs>(); }
        }
    }
}

private static T getPages <T> () - Crée une nouvelle instance sur la page spécifiée et renvoie la page.

public static ContactUs contactUs - Renvoie une instance de la page ContactUs.

 

En utilisant la même fonction (getPages) et généralement c'est la raison pour laquelle c'est privé, car il est possible de l'appeler uniquement à partir de pages. Il est important de mentionner que chaque page que nous instancions, nous devrons l'ajouter à la classe 'Pages' car la page n'est accessible que via cette classe. Je vais démontrer avec un exemple:

En supposant que nous allons écrire des tests automatisés et que nous voudrons cliquer sur la page Contactez-nous, la commande suivante doit être écrite:

Pages.contactUs.Goto ();

 

N'hésitez pas à laisser vos questions / idées dans la section commentaires ci-dessous!

 


Rejoindre la conversation