我使用的是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分开。而且,菜单也有子菜单,所以我想用多级字段来表示它。每个子菜单都有一个新课程,可以为很少的课程提供很多课程。
最好的方法是什么,或者您是否知道另一种解决问题的方法?
答案 0 :(得分:4)
页面不是菜单。页面有菜单。我们只有在 IS A 关系时才能延长。否则请使用 composition over inheritance 原则。
我建议您使用Page Fragments以获得更好的可重用性。
也就是说,您创建了名为“Page Fragments”的可重用组件,如此处所示,并在页面对象中使用它。
答案 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();
}
}
确保IHasMenuExtensions
与IHasMenu
位于同一名称空间,而不是像以前一样调用它而不为扩展类添加自定义使用语句
答案 2 :(得分:0)
我打赌所有的菜单都很相似。
您可以只实现一个类SubMenu
。
您可以调用其构造函数来指定您需要的SubMenu
,例如:
SubMenu sweets = new SubMenu("sweets");
SubMenu vegetables = new SubMenu("vegetables");