在首先写我的建议之前,我想分享一下我开发了 POM 框架的应用程序。所以基本上我的应用程序对于每个 html 页面都有三个不同的框架:
顶部框架:它是整个应用程序的共享视图,包含注销、帮助、管理设置等常用功能。
左侧导航面板:在我的应用程序的大多数地方,此框架都可用,它提供应用程序不同部分之间的导航。
内容框架:这是用户进行主要操作的框架。
为这种类型的应用程序设计一个基于页面对象的框架确实是一项繁琐的工作,但是我决定以这样的方式设计它,这样我们就可以避免所有重复的代码。首先我将分享框架结构:
org.xyz.automation.sdk
- TopFrame.java
- MainNavigator.java
- WebDriverFactory.java
- Configuration.java
org.xyz.automation.sdk.global.pages
- LoginPage.java
- TopFrame.java
org.xyz.automation.sdk.global
- Navigator.java
org.xyz.automation.sdk.leftpanel.pages
- LeftFramePage.java
org.xyz.automation.sdk.leftpanel
- LeftFrameNavigator.java
所以基本上org.xyz.automation.sdk 包含所有常见的配置类,它们负责根据您的系统配置实例化 Web 驱动程序。
org.xyz.automation.sdk.global.pages:这个包包含页面对象类的通用视图,正如我已经说过的那样,TopFrame 是你可以在整个应用程序中看到的东西,所以我在TopFrame.java 中建模了这个视图。将框架导航与页面对象类分离,我把它保存在一个单独的包中,它只是页面对象类的父包。
org.xyz.automation.sdk.global 包含 Navigation.java,它负责框架导航和所有其他导航。将其排除在global.pages 之外的唯一好处是,将来当您的应用程序不支持框架时,您无需更改任何 Page 类,只需修改 navigator 类。
org.xyz.automation.sdk.leftpanel.pages: 与上面类似,这个包包含左侧面板的页面对象 java 类,我再次将左侧面板的导航从 leftpanel.pages 包中分离出来。
@FindBy
这不过是查找建模页面的 web 元素的快捷方式。页面对象的基本概念是每个类应该只对单个视图建模,因此建模类应该只包含那些实际出现在建模视图上的 Web 元素。例如TopFrame.java 应该包含 log out 元素,因为它只出现在该框架上。
@FindBy(name = "logOut") // To find the element by name
@CacheLookup
private WebElement logOutLInk;
在对其执行任何操作时,您应将其视为WebElement 的实例。
logOutLInk.click();
/**
* Class which models the view of Left Navigation Frame
*/
public class LeftNavigationFrame{
@FindBy(name= "exampleName")
private WebElement exampleButton;
private WebDriver driver;
public LeftNavigationFrame(WebDriver driver) {
this.driver = driver;
}
/**
* Opens a new page by clicking example button
*/
public void openNewPage() {
exampleButton.click();
}
}
Navigator 类示例:
/**
* Class which provides convenient methods to navigate on left frame
*/
public class LeftFrameNavigator{
private WebDriver driver;
public LeftFrameNavigator(WebDriver driver) {
this.driver = driver;
}
/**
* Changes scope to the left frame
*
* @return Page Object class of LeftNavigationFrame
*/
public LeftNavigationFrame switchToLeftFrame() {
// Code to switch Frame
return new LeftNavigationFrame(driver);
}
}
这是您的测试类的示例:
/**
* Class which contains test cases of xyz
*/
public class doTesting{
LeftFrameNavigator leftNav;
@BeforeTest
public void instantiateRequiredClasses() {
LeftFrameNavigator leftNav = new LeftFrameNavigator();
}
@Test
public void doTestingHere() {
LeftNavigationFrame leftFrame = leftNav.switchToLeftFrame();
leftFrame.openNewPage()
}
}
}