【问题标题】:Java selenium Page Object MenuJava selenium 页面对象菜单
【发布时间】:2017-01-18 17:32:40
【问题描述】:

我正在使用页面对象模型。在我的网站上,大多数页面都有一个菜单,所以我想我应该创建一个 MenuPage 类,让所有其他有菜单的页面都会扩展它。

但现在我想从菜单中重新组合我的所有 WebElement,以便将它们与当前页面分开。

换句话说,如果一个元素直接在页面上,我会以类似的方式访问它。

MyPage mypage = new MyPage(); /*MyPage extends MenuPage*/
mypage.myWebElement.click();

但如果 web 元素是菜单的一部分,而不是 MyPage 的一部分,我想从

MyPage mypage = new MyPage();  /*MyPage extends MenuPage*/
mypage.menu.myWebElement.click();

我知道我可以创建一个类菜单并将其实例化到 MenuPage 中,但由于它只会在那里使用,我不希望将它与类 MenuPage 分开。而且,菜单也有子菜单,所以我想用多级字段来表示它。并且为每个子菜单设置一个新课程可以用这么少的资源完成大量课程。

最好的方法是什么,或者您知道解决问题的其他方法吗?

【问题讨论】:

  • 我认为您看到了一些关于组合优于继承的论点,以及使用继承变得多么复杂。我不确定我是否完全理解子菜单的情况,但如果你能澄清一下,可能有几种不同的方法可以在那里使用。

标签: java selenium selenium-webdriver pageobjects


【解决方案1】:

页面不是菜单。页面有菜单。只有当它 IS A 关系时,我们才能扩展。否则按照composition over inheritance原则。

我建议您使用Page Fragments 以获得更好的可重用性。

也就是说,您创建称为“页面片段”的可重用组件,如此处所示,并在页面对象中使用它。

【讨论】:

    【解决方案2】:

    我敢打赌所有的菜单都是相似的。 你可以只实现一个类SubMenu。 你可以调用它的构造函数来指定你需要哪个SubMenu,例如:

    SubMenu sweets = new SubMenu("sweets");
    SubMenu vegetables = new SubMenu("vegetables");
    

    【讨论】:

    • 好主意,虽然工厂可能更合适,因为许多 Selenium 框架最终需要一个无参数的构造函数来通用初始化 web 元素,等待页面加载等......但是这个适用于某些框架
    • 工厂或a builder pattern。构建器模式让我们避免了构造器的混乱。
    • 另外,如果你对我的回答投了反对票,你能解释一下原因吗?它可以帮助 OP、我和其他任何试图弄清楚为什么特定方法有问题的人。
    • 我没有否决你的回答,兄弟;但我也不觉得它完美。恕我直言,您的回答并没有消除编写与菜单一样多的类的原因。
    • 感谢您的反馈,它旨在解决MenuPage 对象,该对象是在许多不同页面对象上发现的组件,这是 PageObject 模型中的常见场景。我没有在我的回答中提到子菜单,我认为你指的是什么。
    【解决方案3】:

    要遵循组合优于继承,我建议创建一个接口,例如IHasMenu,它有一个方法可以返回您的MenuPage 对象,例如getMenuPage()

    这样,您所有具有菜单的页面对象只需实现一种方法即可获取您的菜单。

    您的代码将与您想要的类似:

    MyPage mypage = new MyPage();
    mypage.getMenuPage().myWebElement.click();
    

    界面如下:

    interface IHasMenu{
        public MenuPage getMenuPage();
    }
    

    还有你的 MyPage:

    public class MyPage implements IHasMenu
    {
        public MenuPage getMenuPage()
        {
            return new MenuPage(); //(Or however you initialize your PO's)
            //Or return a private property if you don't want to create a new one
            //every time this is called
        }
    }
    

    如果为每个继承自IHasMenu 的类添加GetMenuPage() 方法让您对违反DRY 原则感到恶心,您可以使用扩展方法,并从其中删除public MenuPage getMenuPage();你的界面。扩展名是这样的:

    public static class IHasMenuExtensions
    {
        public static MenuPage GetMenuPage(this IHasMenu hasMenuPageObject)
        {
            return new MenuPage();
        }
    }
    

    只需确保IHasMenuExtensionsIHasMenu 在同一个命名空间中,就可以像以前一样调用它,而无需为扩展类添加自定义 using 语句。

    【讨论】:

      猜你喜欢
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      相关资源
      最近更新 更多