Selenium 页面对象模型是-A还是Has-A?

Selenium 页面对象模型是-A还是Has-A?,selenium,inheritance,webdriver,composition,pageobjects,Selenium,Inheritance,Webdriver,Composition,Pageobjects,我正在为一个简单的应用程序编写一个自动化框架,我有一个关于几页的问题,我应该使用继承还是使用组合。我很乐意和你讨论这个问题 1.我有一个抽象页面,每个页面都必须继承。现在这个页面有很多等待方法,我想把它们放在页面之外。我应该为此使用继承吗。我的意思是我应该创建一个wait类并在Page类中继承它,还是应该使用composition。 公共类等待工具{ //所有的等待方法 } 2.应用程序有一个菜单栏,在所有页面上都是通用的。我应该为菜单栏创建一个单独的页面,然后在页面中继承它吗?在这里,请认为我

我正在为一个简单的应用程序编写一个自动化框架,我有一个关于几页的问题,我应该使用继承还是使用组合。我很乐意和你讨论这个问题

1.我有一个抽象页面,每个页面都必须继承。现在这个页面有很多等待方法,我想把它们放在页面之外。我应该为此使用继承吗。我的意思是我应该创建一个wait类并在Page类中继承它,还是应该使用composition。 公共类等待工具{ //所有的等待方法 }

2.应用程序有一个菜单栏,在所有页面上都是通用的。我应该为菜单栏创建一个单独的页面,然后在页面中继承它吗?在这里,请认为我可能还需要从上面继承waitTool类。或者我应该创建这个菜单栏作为导航类。我的意思是,这个类包含生成每个页面的PageObject的函数

public class TopMenu extends Page{

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

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


    public void gotoHomePage(){

    }
}
  • 首先,创建一个只包含初始化页面对象的构造函数的类
    Page

    public class Page
    {      
        public Page()
        {
            PageFactory.InitElements(SeleniumInfo.Driver, this);
        }
    } 
    
  • 在放置
    静态Web驱动程序的位置创建一个类
    SeleniumInfo

         public static class SeleniumInfo
         {
             public static IWebDriver Driver { get; set; }
         }
    
  • 创建一个包含扩展方法的类
    SeleniumExtensionMethods
    。这将包括您的
    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);
              }
    
           }
        }
    
  • 要为其创建类的任何新页面都应从上面创建的
    页面
    类继承。这是您的
    IWebElements
    。像这样:

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

  • 仅当派生类具有“IS a”关系时才扩展基类。如果页面“有”组件,则使用合成

    我建议你用概念


    您可以查看Arquillian lib以了解它们的特性。它非常容易使用

    为什么有这么多等待方法?等待方法的一些例子是什么?它们是否与页面上的内容或通用等待方法相关?任何与给定页面相关的内容都应该在该页面类中。对于菜单栏,一个不同的类是有意义的。
        public class Page_Home : Page
        {
    
          [FindsBy(How = How.LinkText, Using = "Dashboard")]
          private IWebElement btnDashboard { get; set; }
        }