【问题标题】:Page object Model Is-A or Has-A?页面对象模型 Is-A 还是 Has-A?
【发布时间】:2017-01-19 03:14:48
【问题描述】:

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

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

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 有一个所有页面通用的菜单栏。我应该为菜单栏创建一个单独的页面,然后在页面中继承它吗?在这里,请认为我可能还需要从上面继承 waitTool 类。或者我应该将此 menuBar 创建为导航类。我的意思是,这个类包含生成每个页面的 PageObject 的函数。

public class TopMenu extends Page{

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

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


    public void gotoHomePage(){

    }
}

【问题讨论】:

  • 为什么有这么多等待方法?有哪些等待方法的例子?它们与页面上的内容或通用等待方法有关吗?与给定页面有关的任何内容都应该在该页面类中。对于菜单栏,一个不同的类是有意义的。

标签: selenium inheritance webdriver composition pageobjects


【解决方案1】:
  1. 首先,创建一个类Page,它只包含一个初始化页面对象的构造函数。

    public class Page
    {      
        public Page()
        {
            PageFactory.InitElements(SeleniumInfo.Driver, this);
        }
    } 
    
  2. 创建一个 SeleniumInfo 类,您将 static WebDriver 放在其中:

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

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

【讨论】:

    【解决方案2】:

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

    我建议你使用Page Fragments 概念。

    您可以查看 Arquillian 库的 fluent wait API。它非常易于使用!

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2010-10-02
      • 2011-02-19
      • 1970-01-01
      • 2021-11-02
      • 2011-07-29
      • 1970-01-01
      • 2010-12-27
      • 2016-03-23
      相关资源
      最近更新 更多