2017-01-16 1 views
0

J'écris un cadre d'automatisation pour une application simple et j'ai une question pour quelques pages, devrais-je utiliser l'héritage ou dois-je utiliser la composition. Et j'adorerais en discuter avec vous.Objet de page Modèle Is-A ou Has-A?

1.J'ai une page abstraite dont chaque page doit hériter. Maintenant cette page a tellement de méthode d'attente que je veux mettre en dehors de la page. Dois-je utiliser l'héritage pour cela. Je veux dire Dois-je créer une classe d'attente et en hériter dans la classe Page ou dois-je utiliser la composition. public class waitTool {// Toutes les méthodes d'attente }

public abstract class Page waitTool{ 
    //In case of this waitTool is abstract 
} 
I 
public abstract class Page { 
    protected WaitTool waitTool; 
} 

public class LoginPage extends Page { 
} 

2.Application a une barre de menu qui est commune à toutes les pages. Dois-je créer une page distincte pour la barre de menu, puis l'hériter dans Page? Ici, s'il vous plaît pensez que je pourrais avoir besoin d'hériter de la classe waitTool d'en haut aussi. ou devrais-je créer ce menuBar en tant que classe de navigation. Ce que je veux dire, c'est que cette classe contient une fonction pour générer PageObject de chaque page.

public class TopMenu extends Page{ 

    By homeLink = By.cssSelector("a[ui-sref='home']"); 

    public TopMenu(WebDriver driver) { 
     super(driver); 
    } 


    public void gotoHomePage(){ 

    } 
} 
+0

Pourquoi avez-vous tant de méthodes d'attente? Quels sont quelques exemples des méthodes d'attente? Sont-ils liés aux choses sur la page ou aux méthodes d'attente génériques? Tout ce qui concerne une page donnée devrait être dans cette classe de page. Pour la barre de menu, une classe différente a du sens pour cela. – JeffC

Répondre

0
  1. tout d'abord, faire une classe Page qui contient uniquement un constructeur qui initialise les objets de la page.

    public class Page 
    {  
        public Page() 
        { 
         PageFactory.InitElements(SeleniumInfo.Driver, this); 
        } 
    } 
    
  2. Faire une classe SeleniumInfo où vous mettez les static WebDriver:

     public static class SeleniumInfo 
        { 
         public static IWebDriver Driver { get; set; } 
        } 
    
  3. Faire une classe SeleniumExtensionMethods qui contiennent les méthodes d'extension. Cela inclura vos méthodes wait.

    public static class SeleniumExtensionMethods 
        { 
         public static WebDriverWait wait = new WebDriverWait(SeleniumInfo.Driver, TimeSpan.FromSeconds(20)); 
         public static void SafeClick(this IWebElement webElement) 
         { 
          try 
          { 
          wait.Until(ExpectedConditions.ElementToBeClickable(webElement)).Click(); 
          } 
          catch (TargetInvocationException ex) 
          { 
           Console.WriteLine(ex.InnerException); 
          } 
    
         } 
        } 
    
  4. Toute nouvelle page que vous voulez faire une classe pour devrait hériter de la classe Page créé ci-dessus. Ici, allez votre IWebElements. Comme ceci:

    public class Page_Home : Page 
        { 
    
         [FindsBy(How = How.LinkText, Using = "Dashboard")] 
         private IWebElement btnDashboard { get; set; } 
        } 
    
0

Étendre une classe de base que si la classe dérivée a la 'est une' relation. Si le composant 'A HAS' d'une page, utilisez la composition!

Je vous suggère d'aller avec Page Fragments concepts.

enter image description here

Vous pouvez jeter un oeil à la Arquillian lib pour leur fluent wait API. Il est extrêmement facile à utiliser!