Java selenium页面对象菜单

时间:2017-01-18 17:32:40

标签: java selenium selenium-webdriver pageobjects

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

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

换句话说,如果一个元素直接在页面上,我会访问它。

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

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

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

我知道我可以创建一个类菜单并将其实例化到MenuPage中,但由于它只在那里使用,我宁愿不将它与类MenuPage分开。而且,菜单也有子菜单,所以我想用多级字段来表示它。每个子菜单都有一个新课程,可以为很少的课程提供很多课程。

最好的方法是什么,或者您是否知道另一种解决问题的方法?

3 个答案:

答案 0 :(得分:4)

页面不是菜单。页面有菜单。我们只有在 IS A 关系时才能延长。否则请使用 composition over inheritance 原则。

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

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

enter image description here

答案 1 :(得分:0)

要关注合成而不是继承,我建议您创建一个界面,例如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
    }
}

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

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

确保IHasMenuExtensionsIHasMenu位于同一名称空间,而不是像以前一样调用它而不为扩展类添加自定义使用语句

答案 2 :(得分:0)

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

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